12 #ifndef __RD_INVARIANT_H__ 13 #define __RD_INVARIANT_H__ 25 #include <boost/numeric/conversion/cast.hpp> 30 #if !defined INVARIANT_EXCEPTION_METHOD && !defined INVARIANT_ASSERT_METHOD && \ 31 !defined INVARIANT_SILENT_METHOD 32 #define INVARIANT_EXCEPTION_METHOD 1 38 #if !INVARIANT_EXCEPTION_METHOD && !INVARIANT_ASSERT_METHOD && \ 39 !INVARIANT_SILENT_METHOD 40 #undef INVARIANT_EXCEPTION_METHOD 41 #define INVARIANT_EXCEPTION_METHOD 1 48 Invariant(
const char* prefix,
const char* mess,
const char* expr,
49 const char*
const file,
int line)
50 :
std::runtime_error(prefix),
56 Invariant(
const char* prefix,
const std::string& mess,
const char* expr,
57 const char*
const file,
int line)
58 :
std::runtime_error(prefix),
68 const char*
getFile()
const {
return file_dp; }
78 std::string mess_d, expr_d, prefix_d;
80 const char*
const file_dp;
87 #define ASSERT_INVARIANT(expr, mess) assert(expr) 93 #if INVARIANT_EXCEPTION_METHOD 95 #define CHECK_INVARIANT(expr, mess) \ 97 Invar::Invariant inv("Invariant Violation", mess, #expr, __FILE__, \ 99 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 103 #define PRECONDITION(expr, mess) \ 105 Invar::Invariant inv("Pre-condition Violation", mess, #expr, __FILE__, \ 107 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 111 #define POSTCONDITION(expr, mess) \ 113 Invar::Invariant inv("Post-condition Violation", mess, #expr, __FILE__, \ 115 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 119 #define UNDER_CONSTRUCTION(fn) \ 120 Invar::Invariant inv("Incomplete Code", \ 121 "This routine is still under development", fn, \ 122 __FILE__, __LINE__); \ 123 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 126 #define RANGE_CHECK(lo, x, hi) \ 127 if ((lo) > (hi) || (x) < (lo) || (x) > (hi)) { \ 128 std::stringstream errstr; \ 129 errstr << lo << " <= " << x << " <= " << hi; \ 130 Invar::Invariant inv("Range Error", #x, errstr.str().c_str(), __FILE__, \ 132 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 136 #define URANGE_CHECK(x, hi) \ 138 std::stringstream errstr; \ 139 errstr << x << " <= " << hi; \ 140 Invar::Invariant inv("Range Error", #x, errstr.str().c_str(), __FILE__, \ 142 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 146 #define TEST_ASSERT(expr) \ 148 Invar::Invariant inv("Test Assert", "Expression Failed: ", #expr, \ 149 __FILE__, __LINE__); \ 150 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 154 #elif INVARIANT_ASSERT_METHOD 156 #define CHECK_INVARIANT(expr, mess) assert(expr); 157 #define PRECONDITION(expr, mess) assert(expr); 158 #define POSTCONDITION(expr, mess) assert(expr); 159 #define UNDER_CONSTRUCTION(fn) assert(0); 160 #define RANGE_CHECK(lo, x, hi) \ 161 assert((lo) <= (hi) && (x) >= (lo) && (x) <= (hi)); 162 #define URANGE_CHECK(lo, x, hi) assert((x) <= (hi)); 163 #define TEST_ASSERT(expr) assert(expr); 165 #elif INVARIANT_SILENT_METHOD 167 #define CHECK_INVARIANT(expr, mess) 168 #define PRECONDITION(expr, mess) 169 #define POSTCONDITION(expr, mess) 170 #define UNDER_CONSTRUCTION(fn) 171 #define RANGE_CHECK(lo, x, hi) 172 #define URANGE_CHECK(x, hi) 173 #define TEST_ASSERT(expr) 183 #define rdcast boost::numeric_cast 185 #define rdcast static_cast 190 #define RDUNUSED_PARAM(x) (void) x; Invariant(const char *prefix, const std::string &mess, const char *expr, const char *const file, int line)
const char * getFile() const
std::string toUserString() const
std::string getMessage() const
std::string getExpression() const
Invariant(const char *prefix, const char *mess, const char *expr, const char *const file, int line)
std::string toString() const
std::ostream & operator<<(std::ostream &s, const Invariant &inv)