#pragma once #include #include #include using std::string; namespace dbc { class Error { public: const string message; Error(string m) : message{m} {} Error(const char *m) : message{m} {} }; class CheckError : public Error {}; class SentinelError : public Error {}; class PreCondError : public Error {}; class PostCondError : public Error {}; void log(const string &message) { fmt::print("{}\n", message); } void sentinel(const string &message) { string err = fmt::format("[SENTINEL!] {}\n", message); throw SentinelError{err}; } void pre(const string &message, std::function tester) { if(!tester()) { string err = fmt::format("[PRE!] {}\n", message); throw PreCondError{err}; } } void post(const string &message, std::function tester) { if(!tester()) { string err = fmt::format("[POST!] {}\n", message); throw PostCondError{err}; } } void check(bool test, const string &message) { if(!test) { string err = fmt::format("[CHECK!] {}\n", message); fmt::println("{}", err); throw CheckError{err}; } } }