From 5be09d7edff924e7486d743e9d15edf07f555341 Mon Sep 17 00:00:00 2001 From: Mikhail Burakov Date: Mon, 18 Nov 2024 06:34:31 +0100 Subject: WIP --- util.h | 48 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) (limited to 'util.h') diff --git a/util.h b/util.h index 62e7c4e..bba74a2 100644 --- a/util.h +++ b/util.h @@ -18,15 +18,49 @@ #ifndef STREAMER_UTIL_H_ #define STREAMER_UTIL_H_ -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define MAX(a, b) ((a) > (b) ? (a) : (b)) - -#define LENGTH(x) (sizeof(x) / sizeof *(x)) - #define STR_IMPL(x) #x #define STR(x) STR_IMPL(x) +#define FROM_HERE __FILE__ ":" STR(__LINE__) " " + +template +struct Defer { + Defer(T&& op) : op_{op} {} + ~Defer() { op_(); } + const T& op_; +}; + +template +Defer(T&&) -> Defer; + +template +struct PodCloser { + struct pointer { + decltype(dflt) value_; + pointer() : value_{dflt} {} + pointer(decltype(nullptr)) : value_{dflt} {} + pointer(decltype(dflt) value) : value_{value} {} + explicit operator bool() const { return value_ != dflt; } + friend bool operator==(pointer, pointer) = default; + operator decltype(dflt)() const { return value_; } + }; + void operator()(const pointer ptr) { + if (ptr.value_ != dflt) closer(ptr.value_); + } +}; + +template +struct ClassOf; + +template +struct ClassOf { + using T = C; +}; -#define LOG(x, ...) \ - fprintf(stderr, __FILE__ ":" STR(__LINE__) " " x "\n", ##__VA_ARGS__) +template +inline auto Trampoline(T* head, Args... tail) { + using C = ClassOf::T; + auto self = static_cast(head); + return (self->*fun)(tail...); +} #endif // STREAMER_UTIL_H_ -- cgit v1.2.3