diff --git a/AK/NeverDestroyed.h b/AK/NeverDestroyed.h new file mode 100644 index 0000000000..227d6d5eb0 --- /dev/null +++ b/AK/NeverDestroyed.h @@ -0,0 +1,36 @@ +#pragma once + +#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(); } + const T* operator->() const { return &get(); } + + T& operator*() { return get(); } + const T* operator*() const { return get(); } + + T& get() { return reinterpret_cast(storage); } + const T& get() const { return reinterpret_cast(storage); } + +private: + alignas(T) u8 storage[sizeof(T)]; +}; + +} + +using AK::NeverDestroyed;