summaryrefslogtreecommitdiff
path: root/asl/option.hpp
diff options
context:
space:
mode:
authorSteven Le Rouzic <steven.lerouzic@gmail.com>2024-10-02 23:47:54 +0200
committerSteven Le Rouzic <steven.lerouzic@gmail.com>2024-12-20 15:35:58 +0100
commit85462f25d6335bcca9423b6fc1e624d9a76a2375 (patch)
treef2bac09a057573ff745de6dfd7b80fcd90ac8885 /asl/option.hpp
parent80b18cc979fcb1e772e5b7c7d45aa72602d461d7 (diff)
More work on option again
Diffstat (limited to 'asl/option.hpp')
-rw-r--r--asl/option.hpp37
1 files changed, 27 insertions, 10 deletions
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<is_object T>
class option
{
maybe_uninit<T> m_payload;
bool m_has_value = false;
+ template<typename... Args>
+ constexpr void construct(Args&&... args) &
+ {
+ ASL_ASSERT(!m_has_value);
+ m_payload.init_unsafe(ASL_FWD(args)...);
+ m_has_value = true;
+ }
+
+ template<typename Arg>
+ 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)