Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //code...
- any_type_t *retVal = function_that_runs_very_long_time(a, b, &&c, **d, &e, *f);
- //other code...
- //code...
- any_type_t *retVal =
- TIMER(
- function_that_runs_very_long_time(a, b, &&c, **d, &e, *f),
- "TIMING FOR VALUE <%d, %d>", a, b
- );
- //other code...
- #define TIMER(expr, fmt_msg, ...)
- ({
- struct timeval before, after;
- uint64_t time_span;
- int time_span_sec, time_span_usec;
- gettimeofday(&before, NULL);
- typeof(expr) _timer_expr__ = (expr); // <- static if?
- gettimeofday(&after, NULL);
- time_span = (after.tv_sec * 1000000 + after.tv_usec)
- - (before.tv_sec * 1000000 + before.tv_usec);
- time_span_sec = time_span / 1000000;
- time_span_usec = time_span % 1000000;
- TRACE(fmt_msg "n%s : %d.%d seconds",
- #expr, time_span_sec, time_span_usec, ...);
- _timer_expr__;
- })
- #define __type_is_void(expr) __builtin_types_compatible_p(typeof(expr), void)
- #define __DO(expr)
- ({ typeof(expr) __ret; __ret = (expr); __ret; })
- #define __DO_VOID(expr)
- (void) (expr)
- #define DO(expr)
- __builtin_choose_expr(__type_is_void(expr),
- __DO_VOID(expr),
- __DO(expr)) # won't work
- test.c:28:9: error: variable or field β__retβ declared void
- test.c:28:9: error: void value not ignored as it ought to be
- #define __expr_or_zero(expr) __builtin_choose_expr(__type_is_void(expr), 0, (expr))
- #define DO(expr)
- __builtin_choose_expr(__type_is_void(expr),
- __DO_VOID(expr),
- __DO(__expr_or_zero(expr))) # works fine!
- #define TIMER(is_void, expr, fmt_msg, ...)
- ({
- struct timeval before, after;
- uint64_t time_span;
- int time_span_sec, time_span_usec;
- gettimeofday(&before, NULL);
- if (is_void)
- (expr)
- else
- typeof(expr) _timer_expr__ = (expr); // <- static if?
- gettimeofday(&after, NULL);
- time_span = (after.tv_sec * 1000000 + after.tv_usec)
- - (before.tv_sec * 1000000 + before.tv_usec);
- time_span_sec = time_span / 1000000;
- time_span_usec = time_span % 1000000;
- TRACE(fmt_msg "n%s : %d.%d seconds",
- #expr, time_span_sec, time_span_usec, ...);
- if (!is_void)
- _timer_expr__;
- })
- #include <stdio.h>
- #define __type_is_void(expr) _Generic((typeof(expr)*){0}, void*:1, default:0)
- #define __expr_or_zero(expr) _Generic((typeof(expr)*){0}, void*:0, default:(expr))
- #define DO(expr)
- _Generic((typeof(expr)*){0},
- void*:__DO_VOID(expr),
- default:__DO(__expr_or_zero(expr)))
- #define __DO(expr)
- ({ typeof(expr) __ret; puts("do nonvoid"); __ret = (expr); __ret; })
- #define __DO_VOID(expr)
- (void)({ puts("do void"); (void)(expr); })
- void foo(void) { }
- int bar(void) { return 1; }
- int main(void)
- {
- DO(foo());
- DO(bar());
- return 0;
- }
Add Comment
Please, Sign In to add comment