#pragma once #include using namespace std::string_view_literals; template struct privDefer { F f; privDefer(F f) : f(f) { } ~privDefer() { f(); } }; template privDefer defer_func(F f) { return privDefer(f); } #define DEFER_1(x, y) x##y #define DEFER_2(x, y) DEFER_1(x, y) #define DEFER_3(x) DEFER_2(x, __COUNTER__) #define defer(code) auto DEFER_3(_defer_) = defer_func([&]() { code; }) #if defined(_MSC_VER) # define ALIGN(a) __declspec(align(a)) #else # define ALIGN(a) __attribute__((aligned(a))) #endif