xref: /aosp_15_r20/external/libcxx/utils/google-benchmark/src/check.h (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
1*58b9f456SAndroid Build Coastguard Worker #ifndef CHECK_H_
2*58b9f456SAndroid Build Coastguard Worker #define CHECK_H_
3*58b9f456SAndroid Build Coastguard Worker 
4*58b9f456SAndroid Build Coastguard Worker #include <cmath>
5*58b9f456SAndroid Build Coastguard Worker #include <cstdlib>
6*58b9f456SAndroid Build Coastguard Worker #include <ostream>
7*58b9f456SAndroid Build Coastguard Worker 
8*58b9f456SAndroid Build Coastguard Worker #include "internal_macros.h"
9*58b9f456SAndroid Build Coastguard Worker #include "log.h"
10*58b9f456SAndroid Build Coastguard Worker 
11*58b9f456SAndroid Build Coastguard Worker namespace benchmark {
12*58b9f456SAndroid Build Coastguard Worker namespace internal {
13*58b9f456SAndroid Build Coastguard Worker 
14*58b9f456SAndroid Build Coastguard Worker typedef void(AbortHandlerT)();
15*58b9f456SAndroid Build Coastguard Worker 
GetAbortHandler()16*58b9f456SAndroid Build Coastguard Worker inline AbortHandlerT*& GetAbortHandler() {
17*58b9f456SAndroid Build Coastguard Worker   static AbortHandlerT* handler = &std::abort;
18*58b9f456SAndroid Build Coastguard Worker   return handler;
19*58b9f456SAndroid Build Coastguard Worker }
20*58b9f456SAndroid Build Coastguard Worker 
CallAbortHandler()21*58b9f456SAndroid Build Coastguard Worker BENCHMARK_NORETURN inline void CallAbortHandler() {
22*58b9f456SAndroid Build Coastguard Worker   GetAbortHandler()();
23*58b9f456SAndroid Build Coastguard Worker   std::abort();  // fallback to enforce noreturn
24*58b9f456SAndroid Build Coastguard Worker }
25*58b9f456SAndroid Build Coastguard Worker 
26*58b9f456SAndroid Build Coastguard Worker // CheckHandler is the class constructed by failing CHECK macros. CheckHandler
27*58b9f456SAndroid Build Coastguard Worker // will log information about the failures and abort when it is destructed.
28*58b9f456SAndroid Build Coastguard Worker class CheckHandler {
29*58b9f456SAndroid Build Coastguard Worker  public:
CheckHandler(const char * check,const char * file,const char * func,int line)30*58b9f456SAndroid Build Coastguard Worker   CheckHandler(const char* check, const char* file, const char* func, int line)
31*58b9f456SAndroid Build Coastguard Worker       : log_(GetErrorLogInstance()) {
32*58b9f456SAndroid Build Coastguard Worker     log_ << file << ":" << line << ": " << func << ": Check `" << check
33*58b9f456SAndroid Build Coastguard Worker          << "' failed. ";
34*58b9f456SAndroid Build Coastguard Worker   }
35*58b9f456SAndroid Build Coastguard Worker 
GetLog()36*58b9f456SAndroid Build Coastguard Worker   LogType& GetLog() { return log_; }
37*58b9f456SAndroid Build Coastguard Worker 
~CheckHandler()38*58b9f456SAndroid Build Coastguard Worker   BENCHMARK_NORETURN ~CheckHandler() BENCHMARK_NOEXCEPT_OP(false) {
39*58b9f456SAndroid Build Coastguard Worker     log_ << std::endl;
40*58b9f456SAndroid Build Coastguard Worker     CallAbortHandler();
41*58b9f456SAndroid Build Coastguard Worker   }
42*58b9f456SAndroid Build Coastguard Worker 
43*58b9f456SAndroid Build Coastguard Worker   CheckHandler& operator=(const CheckHandler&) = delete;
44*58b9f456SAndroid Build Coastguard Worker   CheckHandler(const CheckHandler&) = delete;
45*58b9f456SAndroid Build Coastguard Worker   CheckHandler() = delete;
46*58b9f456SAndroid Build Coastguard Worker 
47*58b9f456SAndroid Build Coastguard Worker  private:
48*58b9f456SAndroid Build Coastguard Worker   LogType& log_;
49*58b9f456SAndroid Build Coastguard Worker };
50*58b9f456SAndroid Build Coastguard Worker 
51*58b9f456SAndroid Build Coastguard Worker }  // end namespace internal
52*58b9f456SAndroid Build Coastguard Worker }  // end namespace benchmark
53*58b9f456SAndroid Build Coastguard Worker 
54*58b9f456SAndroid Build Coastguard Worker // The CHECK macro returns a std::ostream object that can have extra information
55*58b9f456SAndroid Build Coastguard Worker // written to it.
56*58b9f456SAndroid Build Coastguard Worker #ifndef NDEBUG
57*58b9f456SAndroid Build Coastguard Worker #define CHECK(b)                                                             \
58*58b9f456SAndroid Build Coastguard Worker   (b ? ::benchmark::internal::GetNullLogInstance()                           \
59*58b9f456SAndroid Build Coastguard Worker      : ::benchmark::internal::CheckHandler(#b, __FILE__, __func__, __LINE__) \
60*58b9f456SAndroid Build Coastguard Worker            .GetLog())
61*58b9f456SAndroid Build Coastguard Worker #else
62*58b9f456SAndroid Build Coastguard Worker #define CHECK(b) ::benchmark::internal::GetNullLogInstance()
63*58b9f456SAndroid Build Coastguard Worker #endif
64*58b9f456SAndroid Build Coastguard Worker 
65*58b9f456SAndroid Build Coastguard Worker // clang-format off
66*58b9f456SAndroid Build Coastguard Worker // preserve whitespacing between operators for alignment
67*58b9f456SAndroid Build Coastguard Worker #define CHECK_EQ(a, b) CHECK((a) == (b))
68*58b9f456SAndroid Build Coastguard Worker #define CHECK_NE(a, b) CHECK((a) != (b))
69*58b9f456SAndroid Build Coastguard Worker #define CHECK_GE(a, b) CHECK((a) >= (b))
70*58b9f456SAndroid Build Coastguard Worker #define CHECK_LE(a, b) CHECK((a) <= (b))
71*58b9f456SAndroid Build Coastguard Worker #define CHECK_GT(a, b) CHECK((a) > (b))
72*58b9f456SAndroid Build Coastguard Worker #define CHECK_LT(a, b) CHECK((a) < (b))
73*58b9f456SAndroid Build Coastguard Worker 
74*58b9f456SAndroid Build Coastguard Worker #define CHECK_FLOAT_EQ(a, b, eps) CHECK(std::fabs((a) - (b)) <  (eps))
75*58b9f456SAndroid Build Coastguard Worker #define CHECK_FLOAT_NE(a, b, eps) CHECK(std::fabs((a) - (b)) >= (eps))
76*58b9f456SAndroid Build Coastguard Worker #define CHECK_FLOAT_GE(a, b, eps) CHECK((a) - (b) > -(eps))
77*58b9f456SAndroid Build Coastguard Worker #define CHECK_FLOAT_LE(a, b, eps) CHECK((b) - (a) > -(eps))
78*58b9f456SAndroid Build Coastguard Worker #define CHECK_FLOAT_GT(a, b, eps) CHECK((a) - (b) >  (eps))
79*58b9f456SAndroid Build Coastguard Worker #define CHECK_FLOAT_LT(a, b, eps) CHECK((b) - (a) >  (eps))
80*58b9f456SAndroid Build Coastguard Worker //clang-format on
81*58b9f456SAndroid Build Coastguard Worker 
82*58b9f456SAndroid Build Coastguard Worker #endif  // CHECK_H_
83