From 85462f25d6335bcca9423b6fc1e624d9a76a2375 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Wed, 2 Oct 2024 23:47:54 +0200 Subject: More work on option again --- asl/option.hpp | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) (limited to 'asl/option.hpp') diff --git a/asl/option.hpp b/asl/option.hpp index 6aa5ebb..8662250 100644 --- a/asl/option.hpp +++ b/asl/option.hpp @@ -1,5 +1,6 @@ #pragma once +#include "asl/assert.hpp" #include "asl/meta.hpp" #include "asl/maybe_uninit.hpp" @@ -9,12 +10,32 @@ namespace asl struct nullopt_t {}; static constexpr nullopt_t nullopt{}; +// @Todo(option) Niche +// @Todo(option) Reference +// @Todo(option) Function +// @Todo(option) Arrays + template class option { maybe_uninit m_payload; bool m_has_value = false; + template + constexpr void construct(Args&&... args) & + { + ASL_ASSERT(!m_has_value); + m_payload.init_unsafe(ASL_FWD(args)...); + m_has_value = true; + } + + template + constexpr void assign(Arg&& arg) & + { + ASL_ASSERT(m_has_value); + m_payload.as_init_unsafe() = ASL_FWD(arg); + } + public: constexpr option() = default; constexpr option(nullopt_t) {} // NOLINT(*-explicit-conversions) @@ -23,8 +44,7 @@ public: { if (other.m_has_value) { - m_payload.init_unsafe(other.m_payload.as_init_unsafe()); - m_has_value = true; + construct(other.m_payload.as_init_unsafe()); } } @@ -32,8 +52,7 @@ public: { if (other.m_has_value) { - m_payload.init_unsafe(ASL_MOVE(other.m_payload.as_init_unsafe())); - m_has_value = true; + construct(ASL_MOVE(other.m_payload.as_init_unsafe())); } } @@ -45,12 +64,11 @@ public: { if (m_has_value) { - m_payload.as_init_unsafe() = other.m_payload.as_init_unsafe(); + assign(other.m_payload.as_init_unsafe()); } else { - m_payload.init_unsafe(other.m_payload.as_init_unsafe()); - m_has_value = true; + construct(other.m_payload.as_init_unsafe()); } } else if (m_has_value) @@ -69,12 +87,11 @@ public: { if (m_has_value) { - m_payload.as_init_unsafe() = ASL_MOVE(other.m_payload.as_init_unsafe()); + assign(ASL_MOVE(other.m_payload.as_init_unsafe())); } else { - m_payload.init_unsafe(ASL_MOVE(other.m_payload.as_init_unsafe())); - m_has_value = true; + construct(ASL_MOVE(other.m_payload.as_init_unsafe())); } } else if (m_has_value) -- cgit