1 #ifndef ASSERTS_HPP_INCLUDED 2 #define ASSERTS_HPP_INCLUDED 3 4 #include <iostream> 5 #include <sstream> 6 #include <stdlib.h> 7 #include <string> 8 9 #if defined(__ANDROID__) 10 #include <android/log.h> 11 #include <sstream> 12 #define LOG(str_data) \ 13 do{ std::stringstream oss; \ 14 oss << str_data; \ 15 __android_log_print(ANDROID_LOG_INFO, "Frogatto", oss.str().c_str()); }while(0) 16 #else 17 #define LOG(fmt,...) do {}while(0) 18 #endif // ANDROID 19 20 #if defined(_WINDOWS) 21 #ifndef WIN32_LEAN_AND_MEAN 22 #define WIN32_LEAN_AND_MEAN 23 #endif 24 #include <windows.h> 25 #ifndef _DEBUG 26 //#define abort() do{exit(1);}while(0) 27 #endif 28 #endif 29 30 void report_assert_msg(const std::string& m ); 31 32 struct validation_failure_exception { 33 explicit validation_failure_exception(const std::string& m); 34 std::string msg; 35 }; 36 37 bool throw_validation_failure_on_assert(); 38 39 void output_backtrace(); 40 41 class assert_recover_scope { 42 public: 43 assert_recover_scope(); 44 ~assert_recover_scope(); 45 }; 46 47 //various asserts of standard "equality" tests, such as "equals", "not equals", "greater than", etc. Example usage: 48 //ASSERT_NE(x, y); 49 #define ASSERT_EQ(a,b) if((a) != (b)) { std::ostringstream s; s << __FILE__ << ":" << __LINE__ << " ASSERT EQ FAILED: " << #a << " != " << #b << ": " << (a) << " != " << (b) << "\n"; if(throw_validation_failure_on_assert()) { throw validation_failure_exception(s.str()); } else { std::cerr << s.str(); output_backtrace(); report_assert_msg(s.str()); abort(); } } 50 51 #define ASSERT_NE(a,b) if((a) == (b)) { std::ostringstream s; s << __FILE__ << ":" << __LINE__ << " ASSERT NE FAILED: " << #a << " == " << #b << ": " << (a) << " == " << (b) << "\n"; if(throw_validation_failure_on_assert()) { throw validation_failure_exception(s.str()); } else { std::cerr << s.str(); output_backtrace(); report_assert_msg(s.str()); abort(); } } 52 53 #define ASSERT_GE(a,b) if((a) < (b)) { std::ostringstream s; s << __FILE__ << ":" << __LINE__ << " ASSERT GE FAILED: " << #a << " < " << #b << ": " << (a) << " < " << (b) << "\n"; if(throw_validation_failure_on_assert()) { throw validation_failure_exception(s.str()); } else { std::cerr << s.str(); output_backtrace(); report_assert_msg(s.str()); abort(); } } 54 55 #define ASSERT_LE(a,b) if((a) > (b)) { std::ostringstream s; s << __FILE__ << ":" << __LINE__ << " ASSERT LE FAILED: " << #a << " > " << #b << ": " << (a) << " > " << (b) << "\n"; if(throw_validation_failure_on_assert()) { throw validation_failure_exception(s.str()); } else { std::cerr << s.str(); output_backtrace(); report_assert_msg(s.str()); abort(); } } 56 57 #define ASSERT_GT(a,b) if((a) <= (b)) { std::ostringstream s; s << __FILE__ << ":" << __LINE__ << " ASSERT GT FAILED: " << #a << " <= " << #b << ": " << (a) << " <= " << (b) << "\n"; if(throw_validation_failure_on_assert()) { throw validation_failure_exception(s.str()); } else { std::cerr << s.str(); output_backtrace(); report_assert_msg(s.str()); abort(); } } 58 59 #define ASSERT_LT(a,b) if((a) >= (b)) { std::ostringstream s; s << __FILE__ << ":" << __LINE__ << " ASSERT LT FAILED: " << #a << " >= " << #b << ": " << (a) << " >= " << (b) << "\n"; if(throw_validation_failure_on_assert()) { throw validation_failure_exception(s.str()); } else { std::cerr << s.str(); output_backtrace(); report_assert_msg(s.str()); abort(); } } 60 61 #define ASSERT_INDEX_INTO_VECTOR(a,b) if((a) < 0 || size_t(a) >= (b).size()) { std::ostringstream s; s << __FILE__ << ":" << __LINE__ << " ASSERT INDEX INTO VECTOR FAILED: " << #a << " (" << (a) << " indexes " << #b << " (" << (b).size() << ")\n"; if(throw_validation_failure_on_assert()) { throw validation_failure_exception(s.str()); } else { std::cerr << s.str(); output_backtrace(); report_assert_msg(s.str()); abort(); } } 62 63 //for custom logging. Example usage: 64 //ASSERT_LOG(x != y, "x not equal to y. Value of x: " << x << ", y: " << y); 65 #define ASSERT_LOG(_a,_b) if( !(_a) ) { std::ostringstream _s; _s << __FILE__ << ":" << __LINE__ << " ASSERTION FAILED: " << _b << "\n"; if(throw_validation_failure_on_assert()) { throw validation_failure_exception(_s.str()); } else { std::cerr << _s.str(); output_backtrace(); report_assert_msg(_s.str()); abort(); } } 66 67 68 #define VALIDATE_LOG(a,b) if( !(a) ) { std::ostringstream s; s << __FILE__ << ":" << __LINE__ << " VALIDATION FAILED: " << b << "\n"; throw validation_failure_exception(s.str()); } 69 70 71 #endif 72