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