A simple little design-by-contract library to test out more advanced c++20 features. Looks like clang doesn't do std::source_location right. See https://github.com/llvm/llvm-project/issues/56379
This commit is contained in:
parent
7bec6fe40e
commit
c736387063
2 changed files with 90 additions and 20 deletions
59
PPP3/dbc.h
Normal file
59
PPP3/dbc.h
Normal file
|
@ -0,0 +1,59 @@
|
|||
#include <string>
|
||||
#include <source_location>
|
||||
#include <fmt/core.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
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, std::source_location loc = std::source_location::current()) {
|
||||
fmt::print("[{}:{}:{}] {}\n", loc.file_name(), loc.function_name(), loc.line(), message);
|
||||
}
|
||||
|
||||
void sentinel(const string &message, std::source_location loc = std::source_location::current()) {
|
||||
string err = fmt::format("[SENTINEL! {}:{}:{}:{}] {}\n",
|
||||
loc.file_name(), loc.function_name(),
|
||||
loc.line(), loc.column(), message);
|
||||
throw SentinelError{err};
|
||||
}
|
||||
|
||||
void pre(const string &message, std::function<bool()> tester, std::source_location loc = std::source_location::current()) {
|
||||
if(!tester()) {
|
||||
string err = fmt::format("[PRE! {}:{}:{}:{}] {}\n",
|
||||
loc.file_name(), loc.function_name(),
|
||||
loc.line(), loc.column(), message);
|
||||
throw PreCondError{err};
|
||||
}
|
||||
}
|
||||
|
||||
void post(const string &message, std::function<bool()> tester, std::source_location loc = std::source_location::current()) {
|
||||
if(!tester()) {
|
||||
string err = fmt::format("[POST! {}:{}:{}:{}] {}\n",
|
||||
loc.file_name(), loc.function_name(),
|
||||
loc.line(), loc.column(), message);
|
||||
throw PostCondError{err};
|
||||
}
|
||||
}
|
||||
|
||||
void check(bool test, const string &message, std::source_location loc = std::source_location::current()) {
|
||||
|
||||
if(!test) {
|
||||
string err = fmt::format("[CHECK! {}:{}:{}:{}] {}\n",
|
||||
loc.file_name(), loc.function_name(),
|
||||
loc.line(), loc.column(), message);
|
||||
throw CheckError{err};
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue