13 #ifndef __RD_INVARIANT_H__ 14 #define __RD_INVARIANT_H__ 29 #include <boost/numeric/conversion/cast.hpp> 35 #if !defined INVARIANT_EXCEPTION_METHOD && !defined INVARIANT_ASSERT_METHOD && \ 36 !defined INVARIANT_SILENT_METHOD 37 #define INVARIANT_EXCEPTION_METHOD 1 43 #if !INVARIANT_EXCEPTION_METHOD && !INVARIANT_ASSERT_METHOD && \ 44 !INVARIANT_SILENT_METHOD 45 #undef INVARIANT_EXCEPTION_METHOD 46 #define INVARIANT_EXCEPTION_METHOD 1 53 Invariant(
const char* prefix,
const char* mess,
const char* expr,
54 const char*
const file,
int line)
55 :
std::runtime_error(prefix),
61 Invariant(
const char* prefix,
const std::string& mess,
const char* expr,
62 const char*
const file,
int line)
63 :
std::runtime_error(prefix),
73 const char*
getFile()
const {
return file_dp; }
79 std::string toString()
const;
80 std::string toUserString()
const;
83 std::string mess_d, expr_d, prefix_d;
85 const char*
const file_dp;
92 #define ASSERT_INVARIANT(expr, mess) assert(expr) 98 #if INVARIANT_EXCEPTION_METHOD 100 #define CHECK_INVARIANT(expr, mess) \ 102 Invar::Invariant inv("Invariant Violation", mess, #expr, __FILE__, \ 104 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 108 #define PRECONDITION(expr, mess) \ 110 Invar::Invariant inv("Pre-condition Violation", mess, #expr, __FILE__, \ 112 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 116 #define POSTCONDITION(expr, mess) \ 118 Invar::Invariant inv("Post-condition Violation", mess, #expr, __FILE__, \ 120 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 124 #define UNDER_CONSTRUCTION(fn) \ 125 Invar::Invariant inv("Incomplete Code", \ 126 "This routine is still under development", fn, \ 127 __FILE__, __LINE__); \ 128 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 131 #define RANGE_CHECK(lo, x, hi) \ 132 if ((lo) > (hi) || (x) < (lo) || (x) > (hi)) { \ 133 std::stringstream errstr; \ 134 errstr << lo << " <= " << x << " <= " << hi; \ 135 Invar::Invariant inv("Range Error", #x, errstr.str().c_str(), __FILE__, \ 137 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 141 #define URANGE_CHECK(x, hi) \ 143 std::stringstream errstr; \ 144 errstr << x << " < " << hi; \ 145 Invar::Invariant inv("Range Error", #x, errstr.str().c_str(), __FILE__, \ 147 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 151 #define TEST_ASSERT(expr) \ 153 Invar::Invariant inv("Test Assert", "Expression Failed: ", #expr, \ 154 __FILE__, __LINE__); \ 155 BOOST_LOG(rdErrorLog) << "\n\n****\n" << inv << "****\n\n"; \ 159 #elif INVARIANT_ASSERT_METHOD 161 #define CHECK_INVARIANT(expr, mess) assert(expr); 162 #define PRECONDITION(expr, mess) assert(expr); 163 #define POSTCONDITION(expr, mess) assert(expr); 164 #define UNDER_CONSTRUCTION(fn) assert(0); 165 #define RANGE_CHECK(lo, x, hi) \ 166 assert((lo) <= (hi) && (x) >= (lo) && (x) <= (hi)); 167 #define URANGE_CHECK(lo, x, hi) assert((hi > 0) && (x < hi)); 168 #define TEST_ASSERT(expr) assert(expr); 170 #elif INVARIANT_SILENT_METHOD 172 #define CHECK_INVARIANT(expr, mess) 173 #define PRECONDITION(expr, mess) 174 #define POSTCONDITION(expr, mess) 175 #define UNDER_CONSTRUCTION(fn) 176 #define RANGE_CHECK(lo, x, hi) 177 #define URANGE_CHECK(x, hi) 178 #define TEST_ASSERT(expr) 188 #define rdcast boost::numeric_cast 190 #define rdcast static_cast 195 #define RDUNUSED_PARAM(x) (void) x; Invariant(const char *prefix, const std::string &mess, const char *expr, const char *const file, int line)
#define RDKIT_RDGENERAL_EXPORT
const char * getFile() const
std::string getMessage() const
std::string getExpression() const
RDKIT_RDGENERAL_EXPORT std::ostream & operator<<(std::ostream &s, const Invariant &inv)
Invariant(const char *prefix, const char *mess, const char *expr, const char *const file, int line)