#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 &;