From f607cab235879ede382cf186642c87e5155b6b52 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 26 Dec 2019 22:12:45 +0100 Subject: [PATCH] AK: Add NeverDestroyed, for things that should never be destroyed This template allows you to define static globals without having them destroyed on exit. --- AK/NeverDestroyed.h | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 AK/NeverDestroyed.h 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;