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