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