xref: /aosp_15_r20/external/llvm-libc/test/UnitTest/TestLogger.cpp (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/TestLogger.h"
2*71db0c75SAndroid Build Coastguard Worker #include "src/__support/CPP/string.h"
3*71db0c75SAndroid Build Coastguard Worker #include "src/__support/CPP/string_view.h"
4*71db0c75SAndroid Build Coastguard Worker #include "src/__support/OSUtil/io.h"               // write_to_stderr
5*71db0c75SAndroid Build Coastguard Worker #include "src/__support/big_int.h"                 // is_big_int
6*71db0c75SAndroid Build Coastguard Worker #include "src/__support/macros/config.h"
7*71db0c75SAndroid Build Coastguard Worker #include "src/__support/macros/properties/types.h" // LIBC_TYPES_HAS_INT128
8*71db0c75SAndroid Build Coastguard Worker #include "src/__support/uint128.h"
9*71db0c75SAndroid Build Coastguard Worker 
10*71db0c75SAndroid Build Coastguard Worker #include <stdint.h>
11*71db0c75SAndroid Build Coastguard Worker 
12*71db0c75SAndroid Build Coastguard Worker namespace LIBC_NAMESPACE_DECL {
13*71db0c75SAndroid Build Coastguard Worker namespace testing {
14*71db0c75SAndroid Build Coastguard Worker 
15*71db0c75SAndroid Build Coastguard Worker // cpp::string_view specialization
16*71db0c75SAndroid Build Coastguard Worker template <>
17*71db0c75SAndroid Build Coastguard Worker TestLogger &TestLogger::operator<< <cpp::string_view>(cpp::string_view str) {
18*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::write_to_stderr(str);
19*71db0c75SAndroid Build Coastguard Worker   return *this;
20*71db0c75SAndroid Build Coastguard Worker }
21*71db0c75SAndroid Build Coastguard Worker 
22*71db0c75SAndroid Build Coastguard Worker // cpp::string specialization
23*71db0c75SAndroid Build Coastguard Worker template <> TestLogger &TestLogger::operator<< <cpp::string>(cpp::string str) {
24*71db0c75SAndroid Build Coastguard Worker   return *this << static_cast<cpp::string_view>(str);
25*71db0c75SAndroid Build Coastguard Worker }
26*71db0c75SAndroid Build Coastguard Worker 
27*71db0c75SAndroid Build Coastguard Worker // const char* specialization
28*71db0c75SAndroid Build Coastguard Worker template <> TestLogger &TestLogger::operator<< <const char *>(const char *str) {
29*71db0c75SAndroid Build Coastguard Worker   return *this << cpp::string_view(str);
30*71db0c75SAndroid Build Coastguard Worker }
31*71db0c75SAndroid Build Coastguard Worker 
32*71db0c75SAndroid Build Coastguard Worker // char* specialization
33*71db0c75SAndroid Build Coastguard Worker template <> TestLogger &TestLogger::operator<< <char *>(char *str) {
34*71db0c75SAndroid Build Coastguard Worker   return *this << cpp::string_view(str);
35*71db0c75SAndroid Build Coastguard Worker }
36*71db0c75SAndroid Build Coastguard Worker 
37*71db0c75SAndroid Build Coastguard Worker // char specialization
operator <<(char ch)38*71db0c75SAndroid Build Coastguard Worker template <> TestLogger &TestLogger::operator<<(char ch) {
39*71db0c75SAndroid Build Coastguard Worker   return *this << cpp::string_view(&ch, 1);
40*71db0c75SAndroid Build Coastguard Worker }
41*71db0c75SAndroid Build Coastguard Worker 
42*71db0c75SAndroid Build Coastguard Worker // bool specialization
operator <<(bool cond)43*71db0c75SAndroid Build Coastguard Worker template <> TestLogger &TestLogger::operator<<(bool cond) {
44*71db0c75SAndroid Build Coastguard Worker   return *this << (cond ? "true" : "false");
45*71db0c75SAndroid Build Coastguard Worker }
46*71db0c75SAndroid Build Coastguard Worker 
47*71db0c75SAndroid Build Coastguard Worker // void * specialization
operator <<(void * addr)48*71db0c75SAndroid Build Coastguard Worker template <> TestLogger &TestLogger::operator<<(void *addr) {
49*71db0c75SAndroid Build Coastguard Worker   return *this << "0x" << cpp::to_string(reinterpret_cast<uintptr_t>(addr));
50*71db0c75SAndroid Build Coastguard Worker }
51*71db0c75SAndroid Build Coastguard Worker 
operator <<(T t)52*71db0c75SAndroid Build Coastguard Worker template <typename T> TestLogger &TestLogger::operator<<(T t) {
53*71db0c75SAndroid Build Coastguard Worker   if constexpr (is_big_int_v<T> ||
54*71db0c75SAndroid Build Coastguard Worker                 (cpp::is_integral_v<T> && cpp::is_unsigned_v<T> &&
55*71db0c75SAndroid Build Coastguard Worker                  (sizeof(T) > sizeof(uint64_t)))) {
56*71db0c75SAndroid Build Coastguard Worker     static_assert(sizeof(T) % 8 == 0, "Unsupported size of UInt");
57*71db0c75SAndroid Build Coastguard Worker     const IntegerToString<T, radix::Hex::WithPrefix> buffer(t);
58*71db0c75SAndroid Build Coastguard Worker     return *this << buffer.view();
59*71db0c75SAndroid Build Coastguard Worker   } else {
60*71db0c75SAndroid Build Coastguard Worker     return *this << cpp::to_string(t);
61*71db0c75SAndroid Build Coastguard Worker   }
62*71db0c75SAndroid Build Coastguard Worker }
63*71db0c75SAndroid Build Coastguard Worker 
64*71db0c75SAndroid Build Coastguard Worker // is_integral specializations
65*71db0c75SAndroid Build Coastguard Worker // char is already specialized to handle character
66*71db0c75SAndroid Build Coastguard Worker template TestLogger &TestLogger::operator<< <short>(short);
67*71db0c75SAndroid Build Coastguard Worker template TestLogger &TestLogger::operator<< <int>(int);
68*71db0c75SAndroid Build Coastguard Worker template TestLogger &TestLogger::operator<< <long>(long);
69*71db0c75SAndroid Build Coastguard Worker template TestLogger &TestLogger::operator<< <long long>(long long);
70*71db0c75SAndroid Build Coastguard Worker template TestLogger &TestLogger::operator<< <unsigned char>(unsigned char);
71*71db0c75SAndroid Build Coastguard Worker template TestLogger &TestLogger::operator<< <unsigned short>(unsigned short);
72*71db0c75SAndroid Build Coastguard Worker template TestLogger &TestLogger::operator<< <unsigned int>(unsigned int);
73*71db0c75SAndroid Build Coastguard Worker template TestLogger &TestLogger::operator<< <unsigned long>(unsigned long);
74*71db0c75SAndroid Build Coastguard Worker template TestLogger &
75*71db0c75SAndroid Build Coastguard Worker     TestLogger::operator<< <unsigned long long>(unsigned long long);
76*71db0c75SAndroid Build Coastguard Worker 
77*71db0c75SAndroid Build Coastguard Worker #ifdef LIBC_TYPES_HAS_INT128
78*71db0c75SAndroid Build Coastguard Worker template TestLogger &TestLogger::operator<< <__uint128_t>(__uint128_t);
79*71db0c75SAndroid Build Coastguard Worker #endif // LIBC_TYPES_HAS_INT128
80*71db0c75SAndroid Build Coastguard Worker template TestLogger &TestLogger::operator<< <UInt<128>>(UInt<128>);
81*71db0c75SAndroid Build Coastguard Worker template TestLogger &TestLogger::operator<< <UInt<192>>(UInt<192>);
82*71db0c75SAndroid Build Coastguard Worker template TestLogger &TestLogger::operator<< <UInt<256>>(UInt<256>);
83*71db0c75SAndroid Build Coastguard Worker template TestLogger &TestLogger::operator<< <UInt<320>>(UInt<320>);
84*71db0c75SAndroid Build Coastguard Worker 
85*71db0c75SAndroid Build Coastguard Worker // TODO: Add floating point formatting once it's supported by StringStream.
86*71db0c75SAndroid Build Coastguard Worker 
87*71db0c75SAndroid Build Coastguard Worker TestLogger tlog;
88*71db0c75SAndroid Build Coastguard Worker 
89*71db0c75SAndroid Build Coastguard Worker } // namespace testing
90*71db0c75SAndroid Build Coastguard Worker } // namespace LIBC_NAMESPACE_DECL
91