12 #ifndef __RD_INVARIANT_H__ 13 #define __RD_INVARIANT_H__ 28 #include <boost/numeric/conversion/cast.hpp> 34 #if !defined INVARIANT_EXCEPTION_METHOD && !defined INVARIANT_ASSERT_METHOD && \ 35 !defined INVARIANT_SILENT_METHOD 36 #define INVARIANT_EXCEPTION_METHOD 1 42 #if !INVARIANT_EXCEPTION_METHOD && !INVARIANT_ASSERT_METHOD && \ 43 !INVARIANT_SILENT_METHOD 44 #undef INVARIANT_EXCEPTION_METHOD 45 #define INVARIANT_EXCEPTION_METHOD 1 52 Invariant(
const char* prefix,
const char* mess,
const char* expr,
53 const char*
const file,
int line)
54 :
std::runtime_error(prefix),
60 Invariant(
const char* prefix,
const std::string& mess,
const char* expr,
61 const char*
const file,
int line)
62 :
std::runtime_error(prefix),
72 const char*
getFile()
const {
return file_dp; }
82 std::string mess_d, expr_d, prefix_d;
84 const char*
const file_dp;
91 #define ASSERT_INVARIANT(expr, mess) assert(expr) 97 #if INVARIANT_EXCEPTION_METHOD 99 #define CHECK_INVARIANT(expr, mess) \ 101 Invar::Invariant inv("Invariant Violation", mess, #expr, __FILE__, \ 103 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 107 #define PRECONDITION(expr, mess) \ 109 Invar::Invariant inv("Pre-condition Violation", mess, #expr, __FILE__, \ 111 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 115 #define POSTCONDITION(expr, mess) \ 117 Invar::Invariant inv("Post-condition Violation", mess, #expr, __FILE__, \ 119 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 123 #define UNDER_CONSTRUCTION(fn) \ 124 Invar::Invariant inv("Incomplete Code", \ 125 "This routine is still under development", fn, \ 126 __FILE__, __LINE__); \ 127 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 130 #define RANGE_CHECK(lo, x, hi) \ 131 if ((lo) > (hi) || (x) < (lo) || (x) > (hi)) { \ 132 std::stringstream errstr; \ 133 errstr << lo << " <= " << x << " <= " << hi; \ 134 Invar::Invariant inv("Range Error", #x, errstr.str().c_str(), __FILE__, \ 136 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 140 #define URANGE_CHECK(x, hi) \ 142 std::stringstream errstr; \ 143 errstr << x << " < " << hi; \ 144 Invar::Invariant inv("Range Error", #x, errstr.str().c_str(), __FILE__, \ 146 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 150 #define TEST_ASSERT(expr) \ 152 Invar::Invariant inv("Test Assert", "Expression Failed: ", #expr, \ 153 __FILE__, __LINE__); \ 154 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 158 #elif INVARIANT_ASSERT_METHOD 160 #define CHECK_INVARIANT(expr, mess) assert(expr); 161 #define PRECONDITION(expr, mess) assert(expr); 162 #define POSTCONDITION(expr, mess) assert(expr); 163 #define UNDER_CONSTRUCTION(fn) assert(0); 164 #define RANGE_CHECK(lo, x, hi) \ 165 assert((lo) <= (hi) && (x) >= (lo) && (x) <= (hi)); 166 #define URANGE_CHECK(lo, x, hi) assert((hi>0) && (x < hi)); 167 #define TEST_ASSERT(expr) assert(expr); 169 #elif INVARIANT_SILENT_METHOD 171 #define CHECK_INVARIANT(expr, mess) 172 #define PRECONDITION(expr, mess) 173 #define POSTCONDITION(expr, mess) 174 #define UNDER_CONSTRUCTION(fn) 175 #define RANGE_CHECK(lo, x, hi) 176 #define URANGE_CHECK(x, hi) 177 #define TEST_ASSERT(expr) 187 #define rdcast boost::numeric_cast 189 #define rdcast static_cast 194 #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)