CDT  v4.2.0
инструменты разработчика
print.hpp
См. документацию.
1
5#pragma once
6#include <utility>
7#include <string>
8
9
10
11namespace eosio {
12 namespace internal_use_do_not_use {
13 extern "C" {
14 __attribute__((eosio_wasm_import))
15 void prints(const char*);
16
17 __attribute__((eosio_wasm_import))
18 void prints_l(const char*, uint32_t);
19
20 __attribute__((eosio_wasm_import))
21 void printi(int64_t);
22
23 __attribute__((eosio_wasm_import))
24 void printui(uint64_t);
25
26 __attribute__((eosio_wasm_import))
27 void printi128(const int128_t*);
28
29 __attribute__((eosio_wasm_import))
30 void printui128(const uint128_t*);
31
32 __attribute__((eosio_wasm_import))
33 void printsf(float);
34
35 __attribute__((eosio_wasm_import))
36 void printdf(double);
37
38 __attribute__((eosio_wasm_import))
39 void printqf(const long double*);
40
41 __attribute__((eosio_wasm_import))
42 void printn(uint64_t);
43
44 __attribute__((eosio_wasm_import))
45 void printhex(const void*, uint32_t);
46 }
47 };
48
77 inline void printhex( const void* ptr, uint32_t size) {
79 }
80
88 inline void printl( const char* ptr, size_t len ) {
89 internal_use_do_not_use::prints_l(ptr, len);
90 }
91
98 inline void print( const char* ptr ) {
99 internal_use_do_not_use::prints(ptr);
100 }
101
107 template <typename T, std::enable_if_t<std::is_integral<std::decay_t<T>>::value &&
108 std::is_signed<std::decay_t<T>>::value, int> = 0>
109 inline void print( T num ) {
110 if constexpr(std::is_same<T, int128_t>::value)
111 internal_use_do_not_use::printi128(&num);
112 else if constexpr(std::is_same<T, char>::value)
113 internal_use_do_not_use::prints_l( &num, 1 );
114 else
115 internal_use_do_not_use::printi(num);
116 }
117
123 template <typename T, std::enable_if_t<std::is_integral<std::decay_t<T>>::value &&
124 !std::is_signed<std::decay_t<T>>::value, int> = 0>
125 inline void print( T num ) {
126 if constexpr(std::is_same<T, uint128_t>::value)
127 internal_use_do_not_use::printui128(&num);
128 else if constexpr(std::is_same<T, bool>::value)
129 internal_use_do_not_use::prints(num?"true":"false");
130 else
131 internal_use_do_not_use::printui(num);
132 }
133
140 inline void print( float num ) { internal_use_do_not_use::printsf( num ); }
141
148 inline void print( double num ) { internal_use_do_not_use::printdf( num ); }
149
156 inline void print( long double num ) { internal_use_do_not_use::printqf( &num ); }
157
165 template<typename T, std::enable_if_t<!std::is_integral<std::decay_t<T>>::value, int> = 0>
166 inline void print( T&& t ) {
167 if constexpr (std::is_same<std::decay_t<T>, std::string>::value)
168 internal_use_do_not_use::prints_l( t.c_str(), t.size() );
169 else if constexpr (std::is_same<std::decay_t<T>, char*>::value)
170 internal_use_do_not_use::prints(t);
171 else
172 t.print();
173 }
174
181 inline void print_f( const char* s ) {
182 internal_use_do_not_use::prints(s);
183 }
184
199 template <typename Arg, typename... Args>
200 inline void print_f( const char* s, Arg val, Args... rest ) {
201 while ( *s != '\0' ) {
202 if ( *s == '%' ) {
203 print( val );
204 print_f( s+1, rest... );
205 return;
206 }
207 internal_use_do_not_use::prints_l( s, 1 );
208 s++;
209 }
210 }
211
231 template<typename Arg, typename... Args>
232 void print( Arg&& a, Args&&... args ) {
233 print(std::forward<Arg>(a));
234 print(std::forward<Args>(args)...);
235 }
236
242 class iostream {};
243
245
265 template<typename T>
266 inline iostream& operator<<( iostream& out, const T& v ) {
267 print( v );
268 return out;
269 }
270
272
273 static iostream cout;
274}