Brought line numbers back for the dbc.cpp logging stuff. May not work in clang because of the bug they have (had?).

master
Zed A. Shaw 2 weeks ago
parent 0efb17371b
commit 5ed8196c80
  1. 31
      dbc.cpp
  2. 35
      dbc.hpp
  3. 5
      tests/dbc.cpp

@ -1,44 +1,47 @@
#include "dbc.hpp" #include "dbc.hpp"
#include <iostream> #include <iostream>
void dbc::log(const string &message) { void dbc::log(const string &message, const std::source_location location) {
std::cerr << "!!!!!!!!!!" << message << std::endl; std::clog << '[' << location.file_name() << ':'
<< location.line() << "|"
<< location.function_name() << "] "
<< message << std::endl;
} }
void dbc::sentinel(const string &message) { void dbc::sentinel(const string &message, const std::source_location location) {
string err = fmt::format("[SENTINEL!] {}", message); string err = fmt::format("[SENTINEL!] {}", message);
dbc::log(err); dbc::log(err, location);
throw dbc::SentinelError{err}; throw dbc::SentinelError{err};
} }
void dbc::pre(const string &message, bool test) { void dbc::pre(const string &message, bool test, const std::source_location location) {
if(!test) { if(!test) {
string err = fmt::format("[PRE!] {}", message); string err = fmt::format("[PRE!] {}", message);
dbc::log(err); dbc::log(err, location);
throw dbc::PreCondError{err}; throw dbc::PreCondError{err};
} }
} }
void dbc::pre(const string &message, std::function<bool()> tester) { void dbc::pre(const string &message, std::function<bool()> tester, const std::source_location location) {
dbc::pre(message, tester()); dbc::pre(message, tester(), location);
} }
void dbc::post(const string &message, bool test) { void dbc::post(const string &message, bool test, const std::source_location location) {
if(!test) { if(!test) {
string err = fmt::format("[POST!] {}", message); string err = fmt::format("[POST!] {}", message);
dbc::log(err); dbc::log(err, location);
throw dbc::PostCondError{err}; throw dbc::PostCondError{err};
} }
} }
void dbc::post(const string &message, std::function<bool()> tester) { void dbc::post(const string &message, std::function<bool()> tester, const std::source_location location) {
dbc::post(message, tester()); dbc::post(message, tester(), location);
} }
void dbc::check(bool test, const string &message) { void dbc::check(bool test, const string &message, const std::source_location location) {
if(!test) { if(!test) {
string err = fmt::format("[CHECK!] {}\n", message); string err = fmt::format("[CHECK!] {}\n", message);
dbc::log(err); dbc::log(err, location);
throw dbc::CheckError{err}; throw dbc::CheckError{err};
} }
} }

@ -3,6 +3,7 @@
#include <string> #include <string>
#include <fmt/core.h> #include <fmt/core.h>
#include <functional> #include <functional>
#include <source_location>
using std::string; using std::string;
@ -19,11 +20,31 @@ namespace dbc {
class PreCondError : public Error {}; class PreCondError : public Error {};
class PostCondError : public Error {}; class PostCondError : public Error {};
void log(const string &message); void log(const string &message,
[[noreturn]] void sentinel(const string &message); const std::source_location location =
void pre(const string &message, bool test); std::source_location::current());
void pre(const string &message, std::function<bool()> tester);
void post(const string &message, bool test); [[noreturn]] void sentinel(const string &message,
void post(const string &message, std::function<bool()> tester); const std::source_location location =
void check(bool test, const string &message); std::source_location::current());
void pre(const string &message, bool test,
const std::source_location location =
std::source_location::current());
void pre(const string &message, std::function<bool()> tester,
const std::source_location location =
std::source_location::current());
void post(const string &message, bool test,
const std::source_location location =
std::source_location::current());
void post(const string &message, std::function<bool()> tester,
const std::source_location location =
std::source_location::current());
void check(bool test, const string &message,
const std::source_location location =
std::source_location::current());
} }

@ -3,12 +3,15 @@
using namespace dbc; using namespace dbc;
TEST_CASE("basic feature tests", "[utils]") { TEST_CASE("basic feature tests", "[dbc]") {
log("Logging a message."); log("Logging a message.");
pre("confirm positive cases work", 1 == 1); pre("confirm positive cases work", 1 == 1);
pre("confirm positive lambda", [&]{ return 1 == 1;}); pre("confirm positive lambda", [&]{ return 1 == 1;});
post("confirm positive post", 1 == 1); post("confirm positive post", 1 == 1);
post("confirm postitive post with lamdba", [&]{ return 1 == 1;}); post("confirm postitive post with lamdba", [&]{ return 1 == 1;});
check(1 == 1, "one equals 1"); check(1 == 1, "one equals 1");

Loading…
Cancel
Save