xref: /aosp_15_r20/external/cronet/base/check_op.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2020 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_CHECK_OP_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_CHECK_OP_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <cstddef>
9*6777b538SAndroid Build Coastguard Worker #include <string>
10*6777b538SAndroid Build Coastguard Worker #include <string_view>
11*6777b538SAndroid Build Coastguard Worker #include <type_traits>
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/dcheck_is_on.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr_exclusion.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/strings/to_string.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/types/supports_ostream_operator.h"
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker // This header defines the (DP)CHECK_EQ etc. macros.
21*6777b538SAndroid Build Coastguard Worker //
22*6777b538SAndroid Build Coastguard Worker // (DP)CHECK_EQ(x, y) is similar to (DP)CHECK(x == y) but will also log the
23*6777b538SAndroid Build Coastguard Worker // values of x and y if the condition doesn't hold. This works for basic types
24*6777b538SAndroid Build Coastguard Worker // and types with an operator<< or .ToString() method.
25*6777b538SAndroid Build Coastguard Worker //
26*6777b538SAndroid Build Coastguard Worker // The operands are evaluated exactly once, and even in build modes where e.g.
27*6777b538SAndroid Build Coastguard Worker // DCHECK is disabled, the operands and their stringification methods are still
28*6777b538SAndroid Build Coastguard Worker // referenced to avoid warnings about unused variables or functions.
29*6777b538SAndroid Build Coastguard Worker //
30*6777b538SAndroid Build Coastguard Worker // Like (D)CHECK (D)CHECK_EQ also supports an optional base::NotFatalUntil
31*6777b538SAndroid Build Coastguard Worker // parameter. See base/check.h.
32*6777b538SAndroid Build Coastguard Worker //
33*6777b538SAndroid Build Coastguard Worker // To support the stringification of the check operands, this header is
34*6777b538SAndroid Build Coastguard Worker // *significantly* larger than base/check.h, so it should be avoided in common
35*6777b538SAndroid Build Coastguard Worker // headers.
36*6777b538SAndroid Build Coastguard Worker //
37*6777b538SAndroid Build Coastguard Worker // This header also provides the (DP)CHECK macros (by including check.h), so if
38*6777b538SAndroid Build Coastguard Worker // you use e.g. both CHECK_EQ and CHECK, including this header is enough. If you
39*6777b538SAndroid Build Coastguard Worker // only use CHECK however, please include the smaller check.h instead.
40*6777b538SAndroid Build Coastguard Worker 
41*6777b538SAndroid Build Coastguard Worker namespace logging {
42*6777b538SAndroid Build Coastguard Worker 
43*6777b538SAndroid Build Coastguard Worker // Functions for turning check operand values into NUL-terminated C strings.
44*6777b538SAndroid Build Coastguard Worker // Caller takes ownership of the result and must release it with `free`.
45*6777b538SAndroid Build Coastguard Worker // This would normally be defined by <ostream>, but this header tries to avoid
46*6777b538SAndroid Build Coastguard Worker // including <ostream> to reduce compile-time. See https://crrev.com/c/2128112.
47*6777b538SAndroid Build Coastguard Worker BASE_EXPORT char* CheckOpValueStr(int v);
48*6777b538SAndroid Build Coastguard Worker BASE_EXPORT char* CheckOpValueStr(unsigned v);
49*6777b538SAndroid Build Coastguard Worker BASE_EXPORT char* CheckOpValueStr(long v);
50*6777b538SAndroid Build Coastguard Worker BASE_EXPORT char* CheckOpValueStr(unsigned long v);
51*6777b538SAndroid Build Coastguard Worker BASE_EXPORT char* CheckOpValueStr(long long v);
52*6777b538SAndroid Build Coastguard Worker BASE_EXPORT char* CheckOpValueStr(unsigned long long v);
53*6777b538SAndroid Build Coastguard Worker BASE_EXPORT char* CheckOpValueStr(const void* v);
54*6777b538SAndroid Build Coastguard Worker BASE_EXPORT char* CheckOpValueStr(std::nullptr_t v);
55*6777b538SAndroid Build Coastguard Worker BASE_EXPORT char* CheckOpValueStr(double v);
56*6777b538SAndroid Build Coastguard Worker // Although the standard defines operator<< for std::string and std::string_view
57*6777b538SAndroid Build Coastguard Worker // in their respective headers, libc++ requires <ostream> for them. See
58*6777b538SAndroid Build Coastguard Worker // https://github.com/llvm/llvm-project/issues/61070. So we define non-<ostream>
59*6777b538SAndroid Build Coastguard Worker // versions here too.
60*6777b538SAndroid Build Coastguard Worker BASE_EXPORT char* CheckOpValueStr(const std::string& v);
61*6777b538SAndroid Build Coastguard Worker BASE_EXPORT char* CheckOpValueStr(std::string_view v);
62*6777b538SAndroid Build Coastguard Worker 
63*6777b538SAndroid Build Coastguard Worker // Convert a streamable value to string out-of-line to avoid <sstream>.
64*6777b538SAndroid Build Coastguard Worker BASE_EXPORT char* StreamValToStr(const void* v,
65*6777b538SAndroid Build Coastguard Worker                                  void (*stream_func)(std::ostream&,
66*6777b538SAndroid Build Coastguard Worker                                                      const void*));
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker #ifdef __has_builtin
69*6777b538SAndroid Build Coastguard Worker #define SUPPORTS_BUILTIN_ADDRESSOF (__has_builtin(__builtin_addressof))
70*6777b538SAndroid Build Coastguard Worker #else
71*6777b538SAndroid Build Coastguard Worker #define SUPPORTS_BUILTIN_ADDRESSOF 0
72*6777b538SAndroid Build Coastguard Worker #endif
73*6777b538SAndroid Build Coastguard Worker 
74*6777b538SAndroid Build Coastguard Worker template <typename T>
75*6777b538SAndroid Build Coastguard Worker   requires(base::internal::SupportsOstreamOperator<const T&> &&
76*6777b538SAndroid Build Coastguard Worker            !std::is_function_v<std::remove_pointer_t<T>>)
CheckOpValueStr(const T & v)77*6777b538SAndroid Build Coastguard Worker inline char* CheckOpValueStr(const T& v) {
78*6777b538SAndroid Build Coastguard Worker   auto f = [](std::ostream& s, const void* p) {
79*6777b538SAndroid Build Coastguard Worker     s << *reinterpret_cast<const T*>(p);
80*6777b538SAndroid Build Coastguard Worker   };
81*6777b538SAndroid Build Coastguard Worker 
82*6777b538SAndroid Build Coastguard Worker   // operator& might be overloaded, so do the std::addressof dance.
83*6777b538SAndroid Build Coastguard Worker   // __builtin_addressof is preferred since it also handles Obj-C ARC pointers.
84*6777b538SAndroid Build Coastguard Worker   // Some casting is still needed, because T might be volatile.
85*6777b538SAndroid Build Coastguard Worker #if SUPPORTS_BUILTIN_ADDRESSOF
86*6777b538SAndroid Build Coastguard Worker   const void* vp = const_cast<const void*>(
87*6777b538SAndroid Build Coastguard Worker       reinterpret_cast<const volatile void*>(__builtin_addressof(v)));
88*6777b538SAndroid Build Coastguard Worker #else
89*6777b538SAndroid Build Coastguard Worker   const void* vp = reinterpret_cast<const void*>(
90*6777b538SAndroid Build Coastguard Worker       const_cast<const char*>(&reinterpret_cast<const volatile char&>(v)));
91*6777b538SAndroid Build Coastguard Worker #endif
92*6777b538SAndroid Build Coastguard Worker   return StreamValToStr(vp, f);
93*6777b538SAndroid Build Coastguard Worker }
94*6777b538SAndroid Build Coastguard Worker 
95*6777b538SAndroid Build Coastguard Worker #undef SUPPORTS_BUILTIN_ADDRESSOF
96*6777b538SAndroid Build Coastguard Worker 
97*6777b538SAndroid Build Coastguard Worker // Overload for types that have no operator<< but do have .ToString() defined.
98*6777b538SAndroid Build Coastguard Worker template <typename T>
99*6777b538SAndroid Build Coastguard Worker   requires(!base::internal::SupportsOstreamOperator<const T&> &&
100*6777b538SAndroid Build Coastguard Worker            base::internal::SupportsToString<const T&>)
CheckOpValueStr(const T & v)101*6777b538SAndroid Build Coastguard Worker inline char* CheckOpValueStr(const T& v) {
102*6777b538SAndroid Build Coastguard Worker   // .ToString() may not return a std::string, e.g. blink::WTF::String.
103*6777b538SAndroid Build Coastguard Worker   return CheckOpValueStr(v.ToString());
104*6777b538SAndroid Build Coastguard Worker }
105*6777b538SAndroid Build Coastguard Worker 
106*6777b538SAndroid Build Coastguard Worker // Provide an overload for functions and function pointers. Function pointers
107*6777b538SAndroid Build Coastguard Worker // don't implicitly convert to void* but do implicitly convert to bool, so
108*6777b538SAndroid Build Coastguard Worker // without this function pointers are always printed as 1 or 0. (MSVC isn't
109*6777b538SAndroid Build Coastguard Worker // standards-conforming here and converts function pointers to regular
110*6777b538SAndroid Build Coastguard Worker // pointers, so this is a no-op for MSVC.)
111*6777b538SAndroid Build Coastguard Worker template <typename T>
requires(std::is_function_v<std::remove_pointer_t<T>>)112*6777b538SAndroid Build Coastguard Worker   requires(std::is_function_v<std::remove_pointer_t<T>>)
113*6777b538SAndroid Build Coastguard Worker inline char* CheckOpValueStr(const T& v) {
114*6777b538SAndroid Build Coastguard Worker   return CheckOpValueStr(reinterpret_cast<const void*>(v));
115*6777b538SAndroid Build Coastguard Worker }
116*6777b538SAndroid Build Coastguard Worker 
117*6777b538SAndroid Build Coastguard Worker // We need overloads for enums that don't support operator<<.
118*6777b538SAndroid Build Coastguard Worker // (i.e. scoped enums where no operator<< overload was declared).
119*6777b538SAndroid Build Coastguard Worker template <typename T>
120*6777b538SAndroid Build Coastguard Worker   requires(!base::internal::SupportsOstreamOperator<const T&> &&
121*6777b538SAndroid Build Coastguard Worker            std::is_enum_v<T>)
CheckOpValueStr(const T & v)122*6777b538SAndroid Build Coastguard Worker inline char* CheckOpValueStr(const T& v) {
123*6777b538SAndroid Build Coastguard Worker   return CheckOpValueStr(static_cast<std::underlying_type_t<T>>(v));
124*6777b538SAndroid Build Coastguard Worker }
125*6777b538SAndroid Build Coastguard Worker 
126*6777b538SAndroid Build Coastguard Worker // Takes ownership of `v1_str` and `v2_str`, destroying them with free(). For
127*6777b538SAndroid Build Coastguard Worker // use with CheckOpValueStr() which allocates these strings using strdup().
128*6777b538SAndroid Build Coastguard Worker // Returns allocated string (with strdup) for passing into
129*6777b538SAndroid Build Coastguard Worker // ::logging::CheckError::(D)CheckOp methods.
130*6777b538SAndroid Build Coastguard Worker // TODO(pbos): Annotate this ABSL_ATTRIBUTE_RETURNS_NONNULL after solving
131*6777b538SAndroid Build Coastguard Worker // compile failure.
132*6777b538SAndroid Build Coastguard Worker BASE_EXPORT char* CreateCheckOpLogMessageString(const char* expr_str,
133*6777b538SAndroid Build Coastguard Worker                                                 char* v1_str,
134*6777b538SAndroid Build Coastguard Worker                                                 char* v2_str);
135*6777b538SAndroid Build Coastguard Worker 
136*6777b538SAndroid Build Coastguard Worker // Helper macro for binary operators.
137*6777b538SAndroid Build Coastguard Worker // The 'switch' is used to prevent the 'else' from being ambiguous when the
138*6777b538SAndroid Build Coastguard Worker // macro is used in an 'if' clause such as:
139*6777b538SAndroid Build Coastguard Worker // if (a == 1)
140*6777b538SAndroid Build Coastguard Worker //   CHECK_EQ(2, a);
141*6777b538SAndroid Build Coastguard Worker #define CHECK_OP_FUNCTION_IMPL(check_failure_function, name, op, val1, val2, \
142*6777b538SAndroid Build Coastguard Worker                                ...)                                          \
143*6777b538SAndroid Build Coastguard Worker   switch (0)                                                                 \
144*6777b538SAndroid Build Coastguard Worker   case 0:                                                                    \
145*6777b538SAndroid Build Coastguard Worker   default:                                                                   \
146*6777b538SAndroid Build Coastguard Worker     if (char* const message_on_fail = ::logging::Check##name##Impl(          \
147*6777b538SAndroid Build Coastguard Worker             (val1), (val2), #val1 " " #op " " #val2);                        \
148*6777b538SAndroid Build Coastguard Worker         !message_on_fail)                                                    \
149*6777b538SAndroid Build Coastguard Worker       ;                                                                      \
150*6777b538SAndroid Build Coastguard Worker     else                                                                     \
151*6777b538SAndroid Build Coastguard Worker       check_failure_function(message_on_fail __VA_OPT__(, ) __VA_ARGS__)
152*6777b538SAndroid Build Coastguard Worker 
153*6777b538SAndroid Build Coastguard Worker #if !CHECK_WILL_STREAM()
154*6777b538SAndroid Build Coastguard Worker 
155*6777b538SAndroid Build Coastguard Worker // Discard log strings to reduce code bloat.
156*6777b538SAndroid Build Coastguard Worker #define CHECK_OP(name, op, val1, val2, ...)                                \
157*6777b538SAndroid Build Coastguard Worker   BASE_IF(BASE_IS_EMPTY(__VA_ARGS__), CHECK((val1)op(val2)),               \
158*6777b538SAndroid Build Coastguard Worker           CHECK_OP_FUNCTION_IMPL(::logging::CheckError::CheckOp, name, op, \
159*6777b538SAndroid Build Coastguard Worker                                  val1, val2, __VA_ARGS__))
160*6777b538SAndroid Build Coastguard Worker 
161*6777b538SAndroid Build Coastguard Worker #else
162*6777b538SAndroid Build Coastguard Worker 
163*6777b538SAndroid Build Coastguard Worker #define CHECK_OP(name, op, val1, val2, ...)                              \
164*6777b538SAndroid Build Coastguard Worker   CHECK_OP_FUNCTION_IMPL(::logging::CheckError::CheckOp, name, op, val1, \
165*6777b538SAndroid Build Coastguard Worker                          val2 __VA_OPT__(, ) __VA_ARGS__)
166*6777b538SAndroid Build Coastguard Worker 
167*6777b538SAndroid Build Coastguard Worker #endif
168*6777b538SAndroid Build Coastguard Worker 
169*6777b538SAndroid Build Coastguard Worker // The second overload avoids address-taking of static members for
170*6777b538SAndroid Build Coastguard Worker // fundamental types.
171*6777b538SAndroid Build Coastguard Worker #define DEFINE_CHECK_OP_IMPL(name, op)                                  \
172*6777b538SAndroid Build Coastguard Worker   template <typename T, typename U>                                     \
173*6777b538SAndroid Build Coastguard Worker     requires(!std::is_fundamental_v<T> || !std::is_fundamental_v<U>)    \
174*6777b538SAndroid Build Coastguard Worker   constexpr char* Check##name##Impl(const T& v1, const U& v2,           \
175*6777b538SAndroid Build Coastguard Worker                                     const char* expr_str) {             \
176*6777b538SAndroid Build Coastguard Worker     if (LIKELY(ANALYZER_ASSUME_TRUE(v1 op v2)))                         \
177*6777b538SAndroid Build Coastguard Worker       return nullptr;                                                   \
178*6777b538SAndroid Build Coastguard Worker     return CreateCheckOpLogMessageString(expr_str, CheckOpValueStr(v1), \
179*6777b538SAndroid Build Coastguard Worker                                          CheckOpValueStr(v2));          \
180*6777b538SAndroid Build Coastguard Worker   }                                                                     \
181*6777b538SAndroid Build Coastguard Worker   template <typename T, typename U>                                     \
182*6777b538SAndroid Build Coastguard Worker     requires(std::is_fundamental_v<T> && std::is_fundamental_v<U>)      \
183*6777b538SAndroid Build Coastguard Worker   constexpr char* Check##name##Impl(T v1, U v2, const char* expr_str) { \
184*6777b538SAndroid Build Coastguard Worker     if (LIKELY(ANALYZER_ASSUME_TRUE(v1 op v2)))                         \
185*6777b538SAndroid Build Coastguard Worker       return nullptr;                                                   \
186*6777b538SAndroid Build Coastguard Worker     return CreateCheckOpLogMessageString(expr_str, CheckOpValueStr(v1), \
187*6777b538SAndroid Build Coastguard Worker                                          CheckOpValueStr(v2));          \
188*6777b538SAndroid Build Coastguard Worker   }
189*6777b538SAndroid Build Coastguard Worker 
190*6777b538SAndroid Build Coastguard Worker // clang-format off
191*6777b538SAndroid Build Coastguard Worker DEFINE_CHECK_OP_IMPL(EQ, ==)
192*6777b538SAndroid Build Coastguard Worker DEFINE_CHECK_OP_IMPL(NE, !=)
193*6777b538SAndroid Build Coastguard Worker DEFINE_CHECK_OP_IMPL(LE, <=)
194*6777b538SAndroid Build Coastguard Worker DEFINE_CHECK_OP_IMPL(LT, < )
195*6777b538SAndroid Build Coastguard Worker DEFINE_CHECK_OP_IMPL(GE, >=)
196*6777b538SAndroid Build Coastguard Worker DEFINE_CHECK_OP_IMPL(GT, > )
197*6777b538SAndroid Build Coastguard Worker #undef DEFINE_CHECK_OP_IMPL
198*6777b538SAndroid Build Coastguard Worker #define CHECK_EQ(val1, val2, ...) \
199*6777b538SAndroid Build Coastguard Worker   CHECK_OP(EQ, ==, val1, val2 __VA_OPT__(, ) __VA_ARGS__)
200*6777b538SAndroid Build Coastguard Worker #define CHECK_NE(val1, val2, ...) \
201*6777b538SAndroid Build Coastguard Worker   CHECK_OP(NE, !=, val1, val2 __VA_OPT__(, ) __VA_ARGS__)
202*6777b538SAndroid Build Coastguard Worker #define CHECK_LE(val1, val2, ...) \
203*6777b538SAndroid Build Coastguard Worker   CHECK_OP(LE, <=, val1, val2 __VA_OPT__(, ) __VA_ARGS__)
204*6777b538SAndroid Build Coastguard Worker #define CHECK_LT(val1, val2, ...) \
205*6777b538SAndroid Build Coastguard Worker   CHECK_OP(LT, < , val1, val2 __VA_OPT__(, ) __VA_ARGS__)
206*6777b538SAndroid Build Coastguard Worker #define CHECK_GE(val1, val2, ...) \
207*6777b538SAndroid Build Coastguard Worker   CHECK_OP(GE, >=, val1, val2 __VA_OPT__(, ) __VA_ARGS__)
208*6777b538SAndroid Build Coastguard Worker #define CHECK_GT(val1, val2, ...) \
209*6777b538SAndroid Build Coastguard Worker   CHECK_OP(GT, > , val1, val2 __VA_OPT__(, ) __VA_ARGS__)
210*6777b538SAndroid Build Coastguard Worker // clang-format on
211*6777b538SAndroid Build Coastguard Worker 
212*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
213*6777b538SAndroid Build Coastguard Worker 
214*6777b538SAndroid Build Coastguard Worker #define DCHECK_OP(name, op, val1, val2) \
215*6777b538SAndroid Build Coastguard Worker   CHECK_OP_FUNCTION_IMPL(::logging::CheckError::DCheckOp, name, op, val1, val2)
216*6777b538SAndroid Build Coastguard Worker 
217*6777b538SAndroid Build Coastguard Worker #else
218*6777b538SAndroid Build Coastguard Worker 
219*6777b538SAndroid Build Coastguard Worker // Don't do any evaluation but still reference the same stuff as when enabled.
220*6777b538SAndroid Build Coastguard Worker #define DCHECK_OP(name, op, val1, val2)                      \
221*6777b538SAndroid Build Coastguard Worker   EAT_CHECK_STREAM_PARAMS((::logging::CheckOpValueStr(val1), \
222*6777b538SAndroid Build Coastguard Worker                            ::logging::CheckOpValueStr(val2), (val1)op(val2)))
223*6777b538SAndroid Build Coastguard Worker 
224*6777b538SAndroid Build Coastguard Worker #endif
225*6777b538SAndroid Build Coastguard Worker 
226*6777b538SAndroid Build Coastguard Worker // clang-format off
227*6777b538SAndroid Build Coastguard Worker #define DCHECK_EQ(val1, val2) DCHECK_OP(EQ, ==, val1, val2)
228*6777b538SAndroid Build Coastguard Worker #define DCHECK_NE(val1, val2) DCHECK_OP(NE, !=, val1, val2)
229*6777b538SAndroid Build Coastguard Worker #define DCHECK_LE(val1, val2) DCHECK_OP(LE, <=, val1, val2)
230*6777b538SAndroid Build Coastguard Worker #define DCHECK_LT(val1, val2) DCHECK_OP(LT, < , val1, val2)
231*6777b538SAndroid Build Coastguard Worker #define DCHECK_GE(val1, val2) DCHECK_OP(GE, >=, val1, val2)
232*6777b538SAndroid Build Coastguard Worker #define DCHECK_GT(val1, val2) DCHECK_OP(GT, > , val1, val2)
233*6777b538SAndroid Build Coastguard Worker // clang-format on
234*6777b538SAndroid Build Coastguard Worker 
235*6777b538SAndroid Build Coastguard Worker #define DUMP_WILL_BE_CHECK_OP(name, op, val1, val2)                          \
236*6777b538SAndroid Build Coastguard Worker   CHECK_OP_FUNCTION_IMPL(::logging::CheckError::DumpWillBeCheckOp, name, op, \
237*6777b538SAndroid Build Coastguard Worker                          val1, val2)
238*6777b538SAndroid Build Coastguard Worker 
239*6777b538SAndroid Build Coastguard Worker #define DUMP_WILL_BE_CHECK_EQ(val1, val2) \
240*6777b538SAndroid Build Coastguard Worker   DUMP_WILL_BE_CHECK_OP(EQ, ==, val1, val2)
241*6777b538SAndroid Build Coastguard Worker #define DUMP_WILL_BE_CHECK_NE(val1, val2) \
242*6777b538SAndroid Build Coastguard Worker   DUMP_WILL_BE_CHECK_OP(NE, !=, val1, val2)
243*6777b538SAndroid Build Coastguard Worker #define DUMP_WILL_BE_CHECK_LE(val1, val2) \
244*6777b538SAndroid Build Coastguard Worker   DUMP_WILL_BE_CHECK_OP(LE, <=, val1, val2)
245*6777b538SAndroid Build Coastguard Worker #define DUMP_WILL_BE_CHECK_LT(val1, val2) \
246*6777b538SAndroid Build Coastguard Worker   DUMP_WILL_BE_CHECK_OP(LT, <, val1, val2)
247*6777b538SAndroid Build Coastguard Worker #define DUMP_WILL_BE_CHECK_GE(val1, val2) \
248*6777b538SAndroid Build Coastguard Worker   DUMP_WILL_BE_CHECK_OP(GE, >=, val1, val2)
249*6777b538SAndroid Build Coastguard Worker #define DUMP_WILL_BE_CHECK_GT(val1, val2) \
250*6777b538SAndroid Build Coastguard Worker   DUMP_WILL_BE_CHECK_OP(GT, >, val1, val2)
251*6777b538SAndroid Build Coastguard Worker 
252*6777b538SAndroid Build Coastguard Worker }  // namespace logging
253*6777b538SAndroid Build Coastguard Worker 
254*6777b538SAndroid Build Coastguard Worker #endif  // BASE_CHECK_OP_H_
255