11 #ifndef __RD_INVARIANT_H__
12 #define __RD_INVARIANT_H__
23 #if !defined INVARIANT_EXCEPTION_METHOD && \
24 !defined INVARIANT_ASSERT_METHOD && \
25 !defined INVARIANT_SILENT_METHOD
26 #define INVARIANT_EXCEPTION_METHOD 1
32 #if !INVARIANT_EXCEPTION_METHOD && \
33 !INVARIANT_ASSERT_METHOD && \
34 !INVARIANT_SILENT_METHOD
35 #undef INVARIANT_EXCEPTION_METHOD
36 #define INVARIANT_EXCEPTION_METHOD 1
46 Invariant(
const char * prefix,
const char * mess,
const char * expr,
const char *
const file,
int line )
47 :
std::runtime_error( prefix ),
55 Invariant(
const char * prefix, std::string mess,
const char * expr,
const char *
const file,
int line )
56 :
std::runtime_error( prefix ),
57 mess_d( mess.c_str() ),
100 std::ostream&
operator<<( std::ostream & s,
const Invariant & inv );
105 #define ASSERT_INVARIANT( expr, mess ) \
112 #if INVARIANT_EXCEPTION_METHOD
114 #define CHECK_INVARIANT( expr, mess ) if ( !(expr) ) {\
115 Invar::Invariant inv( "Invariant Violation", mess, \
116 #expr, __FILE__, __LINE__ ); \
117 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; throw inv; }
119 #define PRECONDITION( expr, mess ) if ( !(expr) ) {\
120 Invar::Invariant inv( "Pre-condition Violation", mess, \
121 #expr, __FILE__, __LINE__ ); \
122 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; throw inv; }
124 #define POSTCONDITION( expr, mess ) if ( !(expr) ) { \
125 Invar::Invariant inv( "Post-condition Violation", mess, \
126 #expr, __FILE__, __LINE__ );\
127 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; throw inv; }
129 #define UNDER_CONSTRUCTION( fn ) Invar::Invariant inv( "Incomplete Code", \
130 "This routine is still under development", fn, __FILE__, __LINE__ ); \
131 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; throw inv;
133 #define RANGE_CHECK( lo, x, hi ) if ( (lo)>(hi) || (x)<(lo) || (x)>(hi) ) {\
134 std::stringstream errstr;\
135 errstr << lo << " <= " << x <<" <= "<<hi;\
136 Invar::Invariant inv( "Range Error", #x, errstr.str().c_str(), __FILE__, __LINE__ );\
137 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; throw inv; }
139 #define TEST_ASSERT( expr ) if ( !(expr) ) {\
140 Invar::Invariant inv( "Test Assert", "Expression Failed: ", \
141 #expr, __FILE__, __LINE__ ); \
142 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; throw inv; }
145 #elif INVARIANT_ASSERT_METHOD
147 #define CHECK_INVARIANT( expr, mess ) assert( expr );
148 #define PRECONDITION( expr, mess ) assert( expr );
149 #define POSTCONDITION( expr, mess ) assert( expr );
150 #define UNDER_CONSTRUCTION(fn ) assert(0);
151 #define RANGE_CHECK( lo, x, hi ) assert( (lo)<=(hi) && (x)>=(lo) && (x)<=(hi) );
152 #define TEST_ASSERT( expr ) assert(expr);
154 #elif INVARIANT_SILENT_METHOD
156 #define CHECK_INVARIANT( expr, mess )
157 #define PRECONDITION( expr, mess )
158 #define POSTCONDITION( expr, mess )
159 #define UNDER_CONSTRUCTION( fn )
160 #define RANGE_CHECK( lo, x, hi )
161 #define TEST_ASSERT( expr )
std::string toString() const
Invariant(const char *prefix, const char *mess, const char *expr, const char *const file, int line)
Invariant(const char *prefix, std::string 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