mirror of
https://github.com/slendidev/lunar.git
synced 2025-12-16 20:19:52 +02:00
27 lines
566 B
C
27 lines
566 B
C
|
|
#pragma once
|
||
|
|
|
||
|
|
#include <string_view>
|
||
|
|
using namespace std::string_view_literals;
|
||
|
|
|
||
|
|
template<typename F> struct privDefer {
|
||
|
|
F f;
|
||
|
|
privDefer(F f)
|
||
|
|
: f(f)
|
||
|
|
{
|
||
|
|
}
|
||
|
|
~privDefer() { f(); }
|
||
|
|
};
|
||
|
|
|
||
|
|
template<typename F> privDefer<F> defer_func(F f) { return privDefer<F>(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
|