1d169d70bSTobias Grosser/// These are automatically generated checked C++ bindings for isl.
2d169d70bSTobias Grosser///
3d169d70bSTobias Grosser/// isl is a library for computing with integer sets and maps described by
4d169d70bSTobias Grosser/// Presburger formulas. On top of this, isl provides various tools for
5d169d70bSTobias Grosser/// polyhedral compilation, ranging from dependence analysis over scheduling
6d169d70bSTobias Grosser/// to AST generation.
7d169d70bSTobias Grosser
8d169d70bSTobias Grosser#ifndef ISL_CPP_CHECKED
9d169d70bSTobias Grosser#define ISL_CPP_CHECKED
10d169d70bSTobias Grosser
11*3f9bf9f4Spatacca#include <stdio.h>
12*3f9bf9f4Spatacca#include <stdlib.h>
13*3f9bf9f4Spatacca
14*3f9bf9f4Spatacca#include <functional>
15*3f9bf9f4Spatacca#include <memory>
16*3f9bf9f4Spatacca#include <ostream>
17*3f9bf9f4Spatacca#include <string>
18*3f9bf9f4Spatacca#include <type_traits>
19*3f9bf9f4Spatacca
20*3f9bf9f4Spataccanamespace isl {
21*3f9bf9f4Spataccanamespace checked {
22*3f9bf9f4Spatacca
23*3f9bf9f4Spatacca#define ISLPP_STRINGIZE_(X) #X
24*3f9bf9f4Spatacca#define ISLPP_STRINGIZE(X) ISLPP_STRINGIZE_(X)
25*3f9bf9f4Spatacca
26*3f9bf9f4Spatacca#define ISLPP_ASSERT(test, message)                          \
27*3f9bf9f4Spatacca  do {                                                       \
28*3f9bf9f4Spatacca    if (test)                                                \
29*3f9bf9f4Spatacca      break;                                                 \
30*3f9bf9f4Spatacca    fputs("Assertion \"" #test "\" failed at " __FILE__      \
31*3f9bf9f4Spatacca      ":" ISLPP_STRINGIZE(__LINE__) "\n  " message "\n",     \
32*3f9bf9f4Spatacca      stderr);                                               \
33*3f9bf9f4Spatacca    abort();                                                 \
34*3f9bf9f4Spatacca  } while (0)
35*3f9bf9f4Spatacca
36*3f9bf9f4Spatacca/* Class used to check that isl::checked::boolean,
37*3f9bf9f4Spatacca * isl::checked::stat and isl::checked::size values are checked for errors.
38*3f9bf9f4Spatacca */
39*3f9bf9f4Spataccastruct checker {
40*3f9bf9f4Spatacca	bool checked = false;
41*3f9bf9f4Spatacca	~checker() {
42*3f9bf9f4Spatacca		ISLPP_ASSERT(checked, "IMPLEMENTATION ERROR: Unchecked state");
43*3f9bf9f4Spatacca	}
44*3f9bf9f4Spatacca};
45*3f9bf9f4Spatacca
46*3f9bf9f4Spataccaclass boolean {
47*3f9bf9f4Spataccaprivate:
48*3f9bf9f4Spatacca  mutable std::shared_ptr<checker> check = std::make_shared<checker>();
49*3f9bf9f4Spatacca  isl_bool val;
50*3f9bf9f4Spatacca
51*3f9bf9f4Spatacca  friend boolean manage(isl_bool val);
52*3f9bf9f4Spatacca  boolean(isl_bool val): val(val) {}
53*3f9bf9f4Spataccapublic:
54*3f9bf9f4Spatacca  static boolean error() {
55*3f9bf9f4Spatacca    return boolean(isl_bool_error);
56*3f9bf9f4Spatacca  }
57*3f9bf9f4Spatacca  boolean()
58*3f9bf9f4Spatacca      : val(isl_bool_error) {}
59*3f9bf9f4Spatacca
60*3f9bf9f4Spatacca  /* implicit */ boolean(bool val)
61*3f9bf9f4Spatacca      : val(val ? isl_bool_true : isl_bool_false) {}
62*3f9bf9f4Spatacca
63*3f9bf9f4Spatacca  isl_bool release() {
64*3f9bf9f4Spatacca    auto tmp = val;
65*3f9bf9f4Spatacca    val = isl_bool_error;
66*3f9bf9f4Spatacca    check->checked = true;
67*3f9bf9f4Spatacca    return tmp;
68*3f9bf9f4Spatacca  }
69*3f9bf9f4Spatacca
70*3f9bf9f4Spatacca  bool is_error() const { check->checked = true; return val == isl_bool_error; }
71*3f9bf9f4Spatacca  bool is_false() const { check->checked = true; return val == isl_bool_false; }
72*3f9bf9f4Spatacca  bool is_true() const { check->checked = true; return val == isl_bool_true; }
73*3f9bf9f4Spatacca
74*3f9bf9f4Spatacca  explicit operator bool() const {
75*3f9bf9f4Spatacca    ISLPP_ASSERT(check->checked, "IMPLEMENTATION ERROR: Unchecked error state");
76*3f9bf9f4Spatacca    ISLPP_ASSERT(!is_error(), "IMPLEMENTATION ERROR: Unhandled error state");
77*3f9bf9f4Spatacca    return is_true();
78*3f9bf9f4Spatacca  }
79*3f9bf9f4Spatacca
80*3f9bf9f4Spatacca  boolean negate() {
81*3f9bf9f4Spatacca    if (val == isl_bool_true)
82*3f9bf9f4Spatacca      val = isl_bool_false;
83*3f9bf9f4Spatacca    else if (val == isl_bool_false)
84*3f9bf9f4Spatacca      val = isl_bool_true;
85*3f9bf9f4Spatacca    return *this;
86*3f9bf9f4Spatacca  }
87*3f9bf9f4Spatacca
88*3f9bf9f4Spatacca  boolean operator!() const {
89*3f9bf9f4Spatacca    return boolean(*this).negate();
90*3f9bf9f4Spatacca  }
91*3f9bf9f4Spatacca};
92*3f9bf9f4Spatacca
93*3f9bf9f4Spataccainline boolean manage(isl_bool val) {
94*3f9bf9f4Spatacca  return boolean(val);
95*3f9bf9f4Spatacca}
96*3f9bf9f4Spatacca
97*3f9bf9f4Spataccaclass ctx {
98*3f9bf9f4Spatacca  isl_ctx *ptr;
99*3f9bf9f4Spataccapublic:
100*3f9bf9f4Spatacca  /* implicit */ ctx(isl_ctx *ctx)
101*3f9bf9f4Spatacca      : ptr(ctx) {}
102*3f9bf9f4Spatacca  isl_ctx *release() {
103*3f9bf9f4Spatacca    auto tmp = ptr;
104*3f9bf9f4Spatacca    ptr = nullptr;
105*3f9bf9f4Spatacca    return tmp;
106*3f9bf9f4Spatacca  }
107*3f9bf9f4Spatacca  isl_ctx *get() {
108*3f9bf9f4Spatacca    return ptr;
109*3f9bf9f4Spatacca  }
110*3f9bf9f4Spatacca};
111*3f9bf9f4Spatacca
112*3f9bf9f4Spatacca/* Class encapsulating an isl_stat value.
113*3f9bf9f4Spatacca */
114*3f9bf9f4Spataccaclass stat {
115*3f9bf9f4Spataccaprivate:
116*3f9bf9f4Spatacca	mutable std::shared_ptr<checker> check = std::make_shared<checker>();
117*3f9bf9f4Spatacca	isl_stat val;
118*3f9bf9f4Spatacca
119*3f9bf9f4Spatacca	friend stat manage(isl_stat val);
120*3f9bf9f4Spatacca	stat(isl_stat val) : val(val) {}
121*3f9bf9f4Spataccapublic:
122*3f9bf9f4Spatacca	static stat ok() {
123*3f9bf9f4Spatacca		return stat(isl_stat_ok);
124*3f9bf9f4Spatacca	}
125*3f9bf9f4Spatacca	static stat error() {
126*3f9bf9f4Spatacca		return stat(isl_stat_error);
127*3f9bf9f4Spatacca	}
128*3f9bf9f4Spatacca	stat() : val(isl_stat_error) {}
129*3f9bf9f4Spatacca
130*3f9bf9f4Spatacca	isl_stat release() {
131*3f9bf9f4Spatacca		check->checked = true;
132*3f9bf9f4Spatacca		return val;
133*3f9bf9f4Spatacca	}
134*3f9bf9f4Spatacca
135*3f9bf9f4Spatacca	bool is_error() const {
136*3f9bf9f4Spatacca		check->checked = true;
137*3f9bf9f4Spatacca		return val == isl_stat_error;
138*3f9bf9f4Spatacca	}
139*3f9bf9f4Spatacca	bool is_ok() const {
140*3f9bf9f4Spatacca		check->checked = true;
141*3f9bf9f4Spatacca		return val == isl_stat_ok;
142*3f9bf9f4Spatacca	}
143*3f9bf9f4Spatacca};
144*3f9bf9f4Spatacca
145*3f9bf9f4Spataccainline stat manage(isl_stat val)
146*3f9bf9f4Spatacca{
147*3f9bf9f4Spatacca	return stat(val);
148*3f9bf9f4Spatacca}
149*3f9bf9f4Spatacca
150*3f9bf9f4Spatacca/* Class encapsulating an isl_size value.
151*3f9bf9f4Spatacca */
152*3f9bf9f4Spataccaclass size {
153*3f9bf9f4Spataccaprivate:
154*3f9bf9f4Spatacca	mutable std::shared_ptr<checker> check = std::make_shared<checker>();
155*3f9bf9f4Spatacca	isl_size val;
156*3f9bf9f4Spatacca
157*3f9bf9f4Spatacca	friend size manage(isl_size val);
158*3f9bf9f4Spatacca	size(isl_size val) : val(val) {}
159*3f9bf9f4Spataccapublic:
160*3f9bf9f4Spatacca	size() : val(isl_size_error) {}
161*3f9bf9f4Spatacca
162*3f9bf9f4Spatacca	isl_size release() {
163*3f9bf9f4Spatacca		auto tmp = val;
164*3f9bf9f4Spatacca		val = isl_size_error;
165*3f9bf9f4Spatacca		check->checked = true;
166*3f9bf9f4Spatacca		return tmp;
167*3f9bf9f4Spatacca	}
168*3f9bf9f4Spatacca
169*3f9bf9f4Spatacca	bool is_error() const {
170*3f9bf9f4Spatacca		check->checked = true;
171*3f9bf9f4Spatacca		return val == isl_size_error;
172*3f9bf9f4Spatacca	}
173*3f9bf9f4Spatacca
174*3f9bf9f4Spatacca	explicit operator unsigned() const {
175*3f9bf9f4Spatacca		ISLPP_ASSERT(check->checked,
176*3f9bf9f4Spatacca			    "IMPLEMENTATION ERROR: Unchecked error state");
177*3f9bf9f4Spatacca		ISLPP_ASSERT(!is_error(),
178*3f9bf9f4Spatacca			    "IMPLEMENTATION ERROR: Unhandled error state");
179*3f9bf9f4Spatacca		return val;
180*3f9bf9f4Spatacca	}
181*3f9bf9f4Spatacca};
182*3f9bf9f4Spatacca
183*3f9bf9f4Spataccainline size manage(isl_size val)
184*3f9bf9f4Spatacca{
185*3f9bf9f4Spatacca	return size(val);
186*3f9bf9f4Spatacca}
187*3f9bf9f4Spatacca
188*3f9bf9f4Spatacca}
189*3f9bf9f4Spatacca} // namespace isl
190*3f9bf9f4Spatacca
191