| |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| #include <functional> |
| #include <string> |
| |
| namespace isl { |
| namespace checked { |
| |
| #define ISLPP_STRINGIZE_(X) #X |
| #define ISLPP_STRINGIZE(X) ISLPP_STRINGIZE_(X) |
| |
| #define ISLPP_ASSERT(test, message) \ |
| do { \ |
| if (test) \ |
| break; \ |
| fputs("Assertion \"" #test "\" failed at " __FILE__ \ |
| ":" ISLPP_STRINGIZE(__LINE__) "\n " message "\n", \ |
| stderr); \ |
| abort(); \ |
| } while (0) |
| |
| class boolean { |
| private: |
| mutable bool checked = false; |
| isl_bool val; |
| |
| friend boolean manage(isl_bool val); |
| boolean(isl_bool val): val(val) {} |
| public: |
| boolean() |
| : val(isl_bool_error) {} |
| ~boolean() { |
| ISLPP_ASSERT(checked, "IMPLEMENTATION ERROR: Unchecked state"); |
| } |
| |
| /* implicit */ boolean(bool val) |
| : val(val ? isl_bool_true : isl_bool_false) {} |
| |
| bool is_error() const { checked = true; return val == isl_bool_error; } |
| bool is_false() const { checked = true; return val == isl_bool_false; } |
| bool is_true() const { checked = true; return val == isl_bool_true; } |
| |
| explicit operator bool() const { |
| ISLPP_ASSERT(checked, "IMPLEMENTATION ERROR: Unchecked error state"); |
| ISLPP_ASSERT(!is_error(), "IMPLEMENTATION ERROR: Unhandled error state"); |
| return is_true(); |
| } |
| |
| boolean operator!() const { |
| if (is_error()) |
| return *this; |
| return !is_true(); |
| } |
| }; |
| |
| inline boolean manage(isl_bool val) { |
| return boolean(val); |
| } |
| |
| class ctx { |
| isl_ctx *ptr; |
| public: |
| /* implicit */ ctx(isl_ctx *ctx) |
| : ptr(ctx) {} |
| isl_ctx *release() { |
| auto tmp = ptr; |
| ptr = nullptr; |
| return tmp; |
| } |
| isl_ctx *get() { |
| return ptr; |
| } |
| }; |
| |
| /* Class encapsulating an isl_stat value. |
| */ |
| class stat { |
| private: |
| mutable bool checked = false; |
| isl_stat val; |
| |
| friend stat manage(isl_stat val); |
| constexpr stat(isl_stat val) : val(val) {} |
| public: |
| static stat ok() { |
| return stat(isl_stat_ok); |
| } |
| static stat error() { |
| return stat(isl_stat_error); |
| } |
| stat() : val(isl_stat_error) {} |
| ~stat() { |
| ISLPP_ASSERT(checked, "IMPLEMENTATION ERROR: Unchecked state"); |
| } |
| |
| isl_stat release() { |
| checked = true; |
| return val; |
| } |
| |
| bool is_error() const { |
| checked = true; |
| return val == isl_stat_error; |
| } |
| bool is_ok() const { |
| checked = true; |
| return val == isl_stat_ok; |
| } |
| }; |
| |
| inline stat manage(isl_stat val) |
| { |
| return stat(val); |
| } |
| |
| } |
| } // namespace isl |