#define __PREVENT_DESTRUCTION(self) \ ~self() = delete #define __PREVENT_JUST_CONSTRUCTION(self) \ self() = delete #define __PREVENT_CONSTRUCTION(self) \ __PREVENT_JUST_CONSTRUCTION(self); \ __PREVENT_DESTRUCTION(self) #define __PREVENT_COPY(self) \ self(const self &) = delete; \ self &operator=(const self &) = delete template <typename T> static constexpr decltype(sizeof(T)) __real_sizeof() { return sizeof(std::conditional_t<std::is_reference_v<T>, void *, T>); } template <typename T> using __make_reference = T &;