Back to home page

Enduro/X

 
 

    


0001 #ifndef INTERNAL_CPP_ASSERTIONS_HEADER
0002 #define INTERNAL_CPP_ASSERTIONS_HEADER
0003 
0004 #include <cgreen/constraint.h>
0005 #include <stdint.h>
0006 #include <string>
0007 #include <typeinfo>
0008 
0009 namespace cgreen {
0010 
0011     #define assert_that_constraint(actual, constraint) assert_that_(__FILE__, __LINE__, #actual, actual, constraint)
0012 
0013     void assert_that_(const char *file, int line, const char *actual_string, const std::string& actual, Constraint *constraint);
0014     void assert_that_(const char *file, int line, const char *actual_string, const std::string *actual, Constraint *constraint);
0015 
0016     // this isn't declared in assertions.h because you can't have overloads for an extern "C"-declared function, so it seems
0017     void assert_that_(const char *file, int line, const char *actual_string, intptr_t actual, Constraint *constraint);
0018 
0019     template <typename T> void assert_that_(const char *file, int line, const char *actual_string, T actual, Constraint *constraint) {
0020 
0021         if (typeid(actual) == typeid(std::string&) ||
0022             typeid(actual) == typeid(const std::string&) ||
0023             typeid(actual) == typeid(const std::string*) ||
0024             typeid(actual) == typeid(std::string*)) {
0025 
0026             assert_that_(file, line, actual_string, reinterpret_cast<const std::string *>(actual), constraint);
0027 
0028         } else if (typeid(actual) == typeid(std::string)) {
0029 
0030             assert_that_(file, line, actual_string, (const std::string *)&actual, constraint);
0031 
0032         } else {
0033             // TODO: update actual_string with output from operator<< of (T)actual
0034             assert_that_(file, line, actual_string, (intptr_t)actual, constraint);
0035         }
0036     }
0037 }
0038 
0039 #endif