#ifndef THROTTLE_QUADRANT_UTILITIES_HPP #define THROTTLE_QUADRANT_UTILITIES_HPP #include void* operator new(size_t size, void* ptr); namespace tq { template struct optional { optional() : m_engaged{ false } { } optional(optional const& other) : m_engaged{ other.has_value() } { if (m_engaged) { construct_from(other.value()); } } explicit optional(ValueType const& value) : m_engaged{ true } { construct_from(value); } ~optional() { destroy(); } auto operator=(optional const& other) -> optional& { destroy(); m_engaged = other.m_engaged; if (m_engaged) { construct_from(other.value()); } } auto has_value() const -> bool { return m_engaged; } auto value() const -> ValueType const& { return *(reinterpret_cast(m_storage)); } private: auto construct_from(ValueType const& value) -> void { new (static_cast(m_storage)) ValueType{ value }; } auto destroy() -> void { if (has_value()) { (reinterpret_cast(m_storage))->~ValueType(); } } alignas(ValueType) byte m_storage[sizeof(ValueType)]; bool m_engaged; }; } #endif