diff options
Diffstat (limited to 'option.h')
-rw-r--r-- | option.h | 37 |
1 files changed, 34 insertions, 3 deletions
@@ -29,7 +29,7 @@ struct option { // -- CONSTRUCTOR - NONE ----------------------------------------------------- constexpr option() = default; - constexpr option(none) : option() {} + constexpr option(none) noexcept : option() {} // -- CONSTRUCTOR - VALUE ---------------------------------------------------- @@ -47,11 +47,40 @@ struct option { } } - template <typename U = T> - constexpr option(T&& val) : m_has_value{true} { + constexpr option(const T& val) : m_has_value{true} { + new (&m_value) T(val); + } + + constexpr option(T&& val) noexcept : m_has_value{true} { new (&m_value) T(std::move(val)); } + // -- ASSIGNMENT ------------------------------------------------------------- + + constexpr option& operator=(const option& op) { + if (this == &op) { + return *this; + } + reset(); + if (op.has_value()) { + new (&m_value) T(op.value()); + m_has_value = true; + } + return *this; + } + + constexpr option& operator=(option&& op) noexcept { + if (this == &op) { + return *this; + } + reset(); + if (op.has_value()) { + new (&m_value) T(std::move(op.take())); + m_has_value = true; + } + return *this; + } + // -- DESTRUCTOR ------------------------------------------------------------- ~option() { @@ -62,6 +91,8 @@ struct option { template <typename... Params> constexpr T& emplace(Params&&... params) { + static_assert(std::is_constructible<T, Params...>::value, + "T not constructible from Params..."); reset(); new (&m_value) T(std::forward<Params>(params)...); m_has_value = true; |