diff options
Diffstat (limited to 'lib/nes/common/box.hh')
| -rw-r--r-- | lib/nes/common/box.hh | 78 |
1 files changed, 0 insertions, 78 deletions
diff --git a/lib/nes/common/box.hh b/lib/nes/common/box.hh deleted file mode 100644 index 7bf2848..0000000 --- a/lib/nes/common/box.hh +++ /dev/null @@ -1,78 +0,0 @@ -#pragma once - -#include "nes/common/types.hh" -#include "nes/common/debug.hh" - -namespace nes -{ - /// Wrapper around an object, allowing for it to be uninitialized or reassigned even if the object type doesn't - /// support it. - /// - /// Basically a std::unique_ptr but stored in-place (and thus not movable). - template<typename T> - class box - { - bool initialized_{ false }; - alignas(T) u8 buffer_[sizeof(T)]; - - public: - /// Create an empty box. - explicit box() = default; - - ~box() - { - clear(); - } - - box(box const&) = delete; - box(box&&) = delete; - auto operator=(box const&) -> box& = delete; - auto operator=(box&&) -> box& = delete; - - auto operator*() -> T& - { - NES_ASSERT(has_value() && "expected box to be non-empty"); - return *get(); - } - - auto operator*() const -> T const& - { - NES_ASSERT(has_value() && "expected box to be non-empty"); - return *get(); - } - - auto operator->() -> T* - { - NES_ASSERT(has_value() && "expected box to be non-empty"); - return get(); - } - - auto operator->() const -> T const* - { - NES_ASSERT(has_value() && "expected box to be non-empty"); - return get(); - } - - operator bool() const { return has_value(); } - - auto has_value() const -> bool { return initialized_; } - auto get() -> T* { return has_value() ? std::launder(reinterpret_cast<T*>(buffer_)) : nullptr; } - auto get() const -> T const* { return has_value() ? std::launder(reinterpret_cast<T const *>(buffer_)) : nullptr; } - - /// Construct a new value in-place, potentially replacing the old value. - template<typename... Args> - auto emplace(Args&&... args) -> void - { - clear(); - new (buffer_) T(std::forward<Args>(args)...); - initialized_ = true; - } - - /// Clear the boxed value. - auto clear() -> void - { - if (initialized_) { (*this)->~T(); } - initialized_ = false; - } - }; -} // namespace nes
\ No newline at end of file |
