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;
84 std::ostream&
operator<<(std::ostream& s,
const Invariant& inv);
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)
std::string toString() const
std::string toUserString() const
Invariant(const char *prefix, const char *mess, const char *expr, const char *const file, int line)
const char * getFile() const
std::string getMessage() const
std::ostream & operator<<(std::ostream &s, const Invariant &inv)
std::string getExpression() const