36 #if defined(TIMEMORY_CORE_SOURCE)
37 # define TIMEMORY_UTILITY_SOURCE
38 #elif defined(TIMEMORY_USE_CORE_EXTERN)
39 # define TIMEMORY_USE_UTILITY_EXTERN
42 #if defined(TIMEMORY_USE_EXTERN) && !defined(TIMEMORY_USE_UTILITY_EXTERN)
43 # define TIMEMORY_USE_UTILITY_EXTERN
52 #if !defined(CREATE_STATIC_VARIABLE_ACCESSOR)
53 # define CREATE_STATIC_VARIABLE_ACCESSOR(TYPE, FUNC_NAME, VARIABLE) \
54 static TYPE& FUNC_NAME() \
56 static TYPE _instance = Type::VARIABLE; \
63 #if !defined(CREATE_STATIC_FUNCTION_ACCESSOR)
64 # define CREATE_STATIC_FUNCTION_ACCESSOR(TYPE, FUNC_NAME, VARIABLE) \
65 static TYPE& FUNC_NAME() \
67 static TYPE _instance = Type::VARIABLE(); \
80 #if !defined(TIMEMORY_STRINGIZE)
81 # define TIMEMORY_STRINGIZE(X) TIMEMORY_STRINGIZE2(X)
85 #if !defined(TIMEMORY_STRINGIZE2)
86 # define TIMEMORY_STRINGIZE2(X) # X
89 #if !defined(TIMEMORY_TRUNCATED_FILE_STRING)
90 # define TIMEMORY_TRUNCATED_FILE_STRING(FILE) \
92 std::string _f{ FILE }; \
93 auto _pos = _f.find("/timemory/"); \
94 if(_pos != std::string::npos) \
96 return _f.substr(_pos + 1); \
102 #if !defined(TIMEMORY_FILE_LINE_FUNC_STRING)
103 # define TIMEMORY_FILE_LINE_FUNC_STRING \
106 std::string{ "[" } + TIMEMORY_TRUNCATED_FILE_STRING(__FILE__) + ":" + \
107 std::to_string(__LINE__) + "@'" + __FUNCTION__ + "']" \
111 #if !defined(TIMEMORY_PID_TID_STRING)
112 # define TIMEMORY_PID_TID_STRING \
115 std::string{ "[pid=" } + std::to_string(::tim::process::get_id()) + \
116 std::string{ "][tid=" } + std::to_string(::tim::threading::get_id()) + \
121 template <
typename Arg>
122 TIMEMORY_NOINLINE
auto
125 return arg.proxy_value();
128 template <
typename Arg>
129 TIMEMORY_NOINLINE
auto
132 return std::forward<Arg>(arg);
135 template <
typename... Args>
136 TIMEMORY_NOINLINE
void
140 fprintf(stderr,
"%s[%s:%i@'%s']> ", _pid_tid,
_file, _line, _func);
142 fprintf(stderr,
"...\n");
146 #if !defined(PRINT_HERE)
147 # define PRINT_HERE(...) \
148 timemory_print_here(TIMEMORY_PID_TID_STRING.c_str(), \
149 TIMEMORY_TRUNCATED_FILE_STRING(__FILE__).c_str(), __LINE__, \
150 __FUNCTION__, __VA_ARGS__)
153 #if !defined(DEBUG_PRINT_HERE)
155 # define DEBUG_PRINT_HERE(...) \
156 if(::tim::settings::debug()) \
158 timemory_print_here(TIMEMORY_PID_TID_STRING.c_str(), \
159 TIMEMORY_TRUNCATED_FILE_STRING(__FILE__).c_str(), \
160 __LINE__, __FUNCTION__, __VA_ARGS__); \
163 # define DEBUG_PRINT_HERE(...)
167 #if !defined(VERBOSE_PRINT_HERE)
168 # define VERBOSE_PRINT_HERE(VERBOSE_LEVEL, ...) \
169 if(::tim::settings::verbose() >= VERBOSE_LEVEL) \
171 timemory_print_here(TIMEMORY_PID_TID_STRING.c_str(), \
172 TIMEMORY_TRUNCATED_FILE_STRING(__FILE__).c_str(), \
173 __LINE__, __FUNCTION__, __VA_ARGS__); \
177 #if !defined(CONDITIONAL_PRINT_HERE)
178 # define CONDITIONAL_PRINT_HERE(CONDITION, ...) \
181 timemory_print_here(TIMEMORY_PID_TID_STRING.c_str(), \
182 TIMEMORY_TRUNCATED_FILE_STRING(__FILE__).c_str(), \
183 __LINE__, __FUNCTION__, __VA_ARGS__); \
187 #if !defined(TIMEMORY_CONDITIONAL_BACKTRACE)
188 # define TIMEMORY_CONDITIONAL_BACKTRACE(CONDITION, DEPTH) \
191 ::tim::print_backtrace<DEPTH>(std::cerr, TIMEMORY_PID_TID_STRING, \
192 TIMEMORY_FILE_LINE_FUNC_STRING); \
196 #if !defined(TIMEMORY_CONDITIONAL_DEMANGLED_BACKTRACE)
197 # define TIMEMORY_CONDITIONAL_DEMANGLED_BACKTRACE(CONDITION, DEPTH) \
200 ::tim::print_demangled_backtrace<DEPTH>(std::cerr, TIMEMORY_PID_TID_STRING, \
201 TIMEMORY_FILE_LINE_FUNC_STRING); \
205 #if !defined(PRETTY_PRINT_HERE)
206 # if defined(_TIMEMORY_GNU) || defined(_TIMEMORY_CLANG)
207 # define PRETTY_PRINT_HERE(...) \
208 timemory_print_here(TIMEMORY_PID_TID_STRING.c_str(), \
209 TIMEMORY_TRUNCATED_FILE_STRING(__FILE__).c_str(), \
210 __LINE__, __PRETTY_FUNCTION__, __VA_ARGS__)
212 # define PRETTY_PRINT_HERE(...) \
213 timemory_print_here(TIMEMORY_PID_TID_STRING.c_str(), \
214 TIMEMORY_TRUNCATED_FILE_STRING(__FILE__).c_str(), \
215 __LINE__, __FUNCTION__, __VA_ARGS__)
219 #if !defined(TIMEMORY_CONDITIONAL_BACKTRACE)
220 # define TIMEMORY_CONDITIONAL_BACKTRACE(CONDITION, DEPTH) \
223 ::tim::print_backtrace<DEPTH>(std::cerr, TIMEMORY_PID_TID_STRING); \
227 #if !defined(TIMEMORY_CONDITIONAL_DEMANGLED_BACKTRACE)
228 # define TIMEMORY_CONDITIONAL_DEMANGLED_BACKTRACE(CONDITION, DEPTH) \
231 ::tim::print_demangled_backtrace<DEPTH>(std::cerr, TIMEMORY_PID_TID_STRING); \
237 template <
typename... Args>
239 __LOG(
std::string file,
int line,
const char* msg, Args&&... args)
241 auto _pos = file.find(
"/timemory/");
242 if(_pos == std::string::npos)
243 _pos = file.find_last_of(
'/');
244 if(_pos != std::string::npos)
245 file = file.substr(_pos);
246 fprintf(stderr,
"[Log @ %s:%i]> ", file.c_str(), line);
247 fprintf(stderr, msg, std::forward<Args>(args)...);
248 fprintf(stderr,
"\n");
256 if(file.find(
'/') != std::string::npos)
257 file = file.substr(file.find_last_of(
'/'));
258 fprintf(stderr,
"[Log @ %s:%i]> %s\n", file.c_str(), line, msg);
263 # define _LOG(...) __LOG(__FILE__, __LINE__, __VA_ARGS__)
267 template <
typename... Args>
269 _DBG(
const char* msg, Args&&... args)
271 fprintf(stderr, msg, std::forward<Args>(args)...);
277 _DBG(
const char* msg)
279 fprintf(stderr,
"%s", msg);
295 #if defined(TIMEMORY_UTILITY_SOURCE)
296 # define TIMEMORY_UTILITY_LINKAGE(...) __VA_ARGS__
297 # define TIMEMORY_UTILITY_INLINE
298 #elif defined(TIMEMORY_USE_EXTERN) || defined(TIMEMORY_USE_UTILITY_EXTERN)
299 # define TIMEMORY_UTILITY_LINKAGE(...) __VA_ARGS__
300 # define TIMEMORY_UTILITY_INLINE
302 # define TIMEMORY_UTILITY_LINKAGE(...) inline __VA_ARGS__
303 # define TIMEMORY_UTILITY_INLINE inline
304 # define TIMEMORY_UTILITY_HEADER_MODE
tim::mpl::apply< std::string > string
auto timemory_proxy_value(Arg &&arg, int) -> decltype(arg.proxy_value())
void timemory_print_here(const char *_pid_tid, const char *_file, int _line, const char *_func, Args &&... args)