36#if defined(TIMEMORY_CORE_SOURCE)
37# define TIMEMORY_UTILITY_SOURCE
38# define TIMEMORY_UTILITY_INLINE
39#elif defined(TIMEMORY_USE_CORE_EXTERN)
40# define TIMEMORY_USE_UTILITY_EXTERN
41# define TIMEMORY_UTILITY_INLINE
43# define TIMEMORY_UTILITY_INLINE inline
44# define TIMEMORY_UTILITY_HEADER_ONLY 1
47#if defined(TIMEMORY_USE_EXTERN) && !defined(TIMEMORY_USE_UTILITY_EXTERN)
48# define TIMEMORY_USE_UTILITY_EXTERN
57#if !defined(CREATE_STATIC_VARIABLE_ACCESSOR)
58# define CREATE_STATIC_VARIABLE_ACCESSOR(TYPE, FUNC_NAME, VARIABLE) \
59 static TYPE& FUNC_NAME() \
61 static TYPE _instance = Type::VARIABLE; \
68#if !defined(CREATE_STATIC_FUNCTION_ACCESSOR)
69# define CREATE_STATIC_FUNCTION_ACCESSOR(TYPE, FUNC_NAME, VARIABLE) \
70 static TYPE& FUNC_NAME() \
72 static TYPE _instance = Type::VARIABLE(); \
85#if !defined(TIMEMORY_STRINGIZE)
86# define TIMEMORY_STRINGIZE(X) TIMEMORY_STRINGIZE2(X)
90#if !defined(TIMEMORY_STRINGIZE2)
91# define TIMEMORY_STRINGIZE2(X) # X
94#if !defined(TIMEMORY_TRUNCATED_FILE_STRING)
95# define TIMEMORY_TRUNCATED_FILE_STRING(FILE) \
97 std::string _f{ FILE }; \
98 auto _pos = _f.find("/timemory/"); \
99 if(_pos != std::string::npos) \
101 return _f.substr(_pos + 1); \
107#if !defined(TIMEMORY_FILE_LINE_FUNC_STRING)
108# define TIMEMORY_FILE_LINE_FUNC_STRING \
111 std::string{ "[" } + TIMEMORY_TRUNCATED_FILE_STRING(__FILE__) + ":" + \
112 std::to_string(__LINE__) + "@'" + __FUNCTION__ + "']" \
116#if !defined(TIMEMORY_PID_TID_STRING)
117# define TIMEMORY_PID_TID_STRING \
120 std::string{ "[pid=" } + std::to_string(::tim::process::get_id()) + \
121 std::string{ "][tid=" } + std::to_string(::tim::threading::get_id()) + \
126template <
typename Arg>
127TIMEMORY_NOINLINE
auto
130 return arg.proxy_value();
133template <
typename Arg>
134TIMEMORY_NOINLINE
auto
137 return std::forward<Arg>(arg);
140template <
typename... Args>
141TIMEMORY_NOINLINE
void
145 fprintf(stderr,
"%s[%s:%i@'%s']> ", _pid_tid,
_file, _line, _func);
147 fprintf(stderr,
"...\n");
151#if !defined(PRINT_HERE)
152# define PRINT_HERE(...) \
153 timemory_print_here(TIMEMORY_PID_TID_STRING.c_str(), \
154 TIMEMORY_TRUNCATED_FILE_STRING(__FILE__).c_str(), __LINE__, \
155 __FUNCTION__, __VA_ARGS__)
158#if !defined(DEBUG_PRINT_HERE)
160# define DEBUG_PRINT_HERE(...) \
161 if(::tim::settings::debug()) \
163 timemory_print_here(TIMEMORY_PID_TID_STRING.c_str(), \
164 TIMEMORY_TRUNCATED_FILE_STRING(__FILE__).c_str(), \
165 __LINE__, __FUNCTION__, __VA_ARGS__); \
168# define DEBUG_PRINT_HERE(...)
172#if !defined(VERBOSE_PRINT_HERE)
173# define VERBOSE_PRINT_HERE(VERBOSE_LEVEL, ...) \
174 if(::tim::settings::verbose() >= VERBOSE_LEVEL) \
176 timemory_print_here(TIMEMORY_PID_TID_STRING.c_str(), \
177 TIMEMORY_TRUNCATED_FILE_STRING(__FILE__).c_str(), \
178 __LINE__, __FUNCTION__, __VA_ARGS__); \
182#if !defined(CONDITIONAL_PRINT_HERE)
183# define CONDITIONAL_PRINT_HERE(CONDITION, ...) \
186 timemory_print_here(TIMEMORY_PID_TID_STRING.c_str(), \
187 TIMEMORY_TRUNCATED_FILE_STRING(__FILE__).c_str(), \
188 __LINE__, __FUNCTION__, __VA_ARGS__); \
192#if !defined(TIMEMORY_CONDITIONAL_BACKTRACE)
193# define TIMEMORY_CONDITIONAL_BACKTRACE(CONDITION, DEPTH) \
196 ::tim::print_backtrace<DEPTH>(std::cerr, TIMEMORY_PID_TID_STRING, \
197 TIMEMORY_FILE_LINE_FUNC_STRING); \
201#if !defined(TIMEMORY_CONDITIONAL_DEMANGLED_BACKTRACE)
202# define TIMEMORY_CONDITIONAL_DEMANGLED_BACKTRACE(CONDITION, DEPTH) \
205 ::tim::print_demangled_backtrace<DEPTH>(std::cerr, TIMEMORY_PID_TID_STRING, \
206 TIMEMORY_FILE_LINE_FUNC_STRING); \
210#if !defined(PRETTY_PRINT_HERE)
211# if defined(TIMEMORY_GNU_COMPILER) || defined(TIMEMORY_CLANG_COMPILER)
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__, __PRETTY_FUNCTION__, __VA_ARGS__)
217# define PRETTY_PRINT_HERE(...) \
218 timemory_print_here(TIMEMORY_PID_TID_STRING.c_str(), \
219 TIMEMORY_TRUNCATED_FILE_STRING(__FILE__).c_str(), \
220 __LINE__, __FUNCTION__, __VA_ARGS__)
224#if !defined(TIMEMORY_CONDITIONAL_BACKTRACE)
225# define TIMEMORY_CONDITIONAL_BACKTRACE(CONDITION, DEPTH) \
228 ::tim::print_backtrace<DEPTH>(std::cerr, TIMEMORY_PID_TID_STRING); \
232#if !defined(TIMEMORY_CONDITIONAL_DEMANGLED_BACKTRACE)
233# define TIMEMORY_CONDITIONAL_DEMANGLED_BACKTRACE(CONDITION, DEPTH) \
236 ::tim::print_demangled_backtrace<DEPTH>(std::cerr, TIMEMORY_PID_TID_STRING); \
242template <
typename... Args>
244__LOG(
std::string file,
int line,
const char* msg, Args&&... args)
246 auto _pos = file.find(
"/timemory/");
247 if(_pos == std::string::npos)
248 _pos = file.find_last_of(
'/');
249 if(_pos != std::string::npos)
250 file = file.substr(_pos);
251 fprintf(stderr,
"[Log @ %s:%i]> ", file.c_str(), line);
252 fprintf(stderr, msg, std::forward<Args>(args)...);
253 fprintf(stderr,
"\n");
261 if(file.find(
'/') != std::string::npos)
262 file = file.substr(file.find_last_of(
'/'));
263 fprintf(stderr,
"[Log @ %s:%i]> %s\n", file.c_str(), line, msg);
268# define _LOG(...) __LOG(__FILE__, __LINE__, __VA_ARGS__)
272template <
typename... Args>
274_DBG(
const char* msg, Args&&... args)
276 fprintf(stderr, msg, std::forward<Args>(args)...);
284 fprintf(stderr,
"%s", msg);
300#if defined(TIMEMORY_UTILITY_SOURCE)
301# define TIMEMORY_UTILITY_LINKAGE(...) __VA_ARGS__
302# define TIMEMORY_UTILITY_INLINE
303#elif defined(TIMEMORY_USE_EXTERN) || defined(TIMEMORY_USE_UTILITY_EXTERN)
304# define TIMEMORY_UTILITY_LINKAGE(...) __VA_ARGS__
305# define TIMEMORY_UTILITY_INLINE
307# define TIMEMORY_UTILITY_LINKAGE(...) inline __VA_ARGS__
308# define TIMEMORY_UTILITY_INLINE inline
309# 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)