/* * Copyright (c) 2018-2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace AK { template class NeverDestroyed { AK_MAKE_NONCOPYABLE(NeverDestroyed); AK_MAKE_NONMOVABLE(NeverDestroyed); public: template NeverDestroyed(Args&&... args) { new (storage) T(forward(args)...); } ~NeverDestroyed() = default; T* operator->() { return &get(); } T const* operator->() const { return &get(); } T& operator*() { return get(); } T const& operator*() const { return get(); } T& get() { return reinterpret_cast(storage); } T const& get() const { return reinterpret_cast(storage); } private: alignas(T) u8 storage[sizeof(T)]; }; } #if USING_AK_GLOBALLY using AK::NeverDestroyed; #endif