diff options
author | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-02-17 00:21:48 +0100 |
---|---|---|
committer | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-02-17 22:29:50 +0100 |
commit | a141c401f78467bc15f62882fca5d55a007cacbb (patch) | |
tree | 908ac71a8640f78f45d22c6808c5fa6e373000fa /asl/status_or.hpp | |
parent | cb77cbe9ce4cddad6a460aa190ff70f0c13e4703 (diff) |
Reorganize everything
Diffstat (limited to 'asl/status_or.hpp')
-rw-r--r-- | asl/status_or.hpp | 186 |
1 files changed, 0 insertions, 186 deletions
diff --git a/asl/status_or.hpp b/asl/status_or.hpp deleted file mode 100644 index ec76e47..0000000 --- a/asl/status_or.hpp +++ /dev/null @@ -1,186 +0,0 @@ -#pragma once - -#include "asl/status.hpp" -#include "asl/maybe_uninit.hpp" -#include "asl/hash.hpp" - -namespace asl -{ - -template<is_object T> -class status_or -{ - status m_status; - maybe_uninit<T> m_value{}; - -public: - // @Todo Convert copy - // @Todo Convert move - - constexpr status_or(const status_or& other) - requires copy_constructible<T> - : m_status{other.m_status} - { - if (other.ok()) - { - m_value.construct_unsafe(other.m_value.as_init_unsafe()); - } - } - - constexpr status_or(status_or&& other) - requires move_constructible<T> - : m_status{ASL_MOVE(other.m_status)} - { - if (other.ok()) - { - m_value.construct_unsafe(ASL_MOVE(other.m_value.as_init_unsafe())); - } - } - - constexpr status_or& operator=(const status_or& other) - requires copyable<T> - { - if (&other != this) - { - if (ok()) - { - if (other.ok()) - { - m_value.assign_unsafe(other.m_value.as_init_unsafe()); - } - else - { - m_value.destroy_unsafe(); - } - } - else if (other.ok()) - { - m_value.construct_unsafe(other.m_value.as_init_unsafe()); - } - m_status = other.m_status; - } - return *this; - } - - constexpr status_or& operator=(status_or&& other) - requires moveable<T> - { - if (&other != this) - { - if (ok()) - { - if (other.ok()) - { - m_value.assign_unsafe(ASL_MOVE(other.m_value.as_init_unsafe())); - } - else - { - m_value.destroy_unsafe(); - } - } - else if (other.ok()) - { - m_value.construct_unsafe(ASL_MOVE(other.m_value.as_init_unsafe())); - } - m_status = ASL_MOVE(other.m_status); - } - return *this; - } - - constexpr ~status_or() - { - if (m_status.ok()) - { - m_value.destroy_unsafe(); - } - } - - // NOLINTNEXTLINE(*-explicit-conversions) - constexpr status_or(const status& status) : m_status{status} - { - ASL_ASSERT_RELEASE(!m_status.ok()); - } - - // NOLINTNEXTLINE(*-explicit-conversions) - constexpr status_or(status&& status) : m_status{ASL_MOVE(status)} - { - ASL_ASSERT_RELEASE(!m_status.ok()); - } - - status_or& operator=(status status) = delete; - - template<typename U = T> - constexpr explicit (!convertible_from<T, U&&>) - status_or(U&& value) - requires ( - constructible_from<T, U&&> && - !same_as<un_cvref_t<U>, status_or> && - !same_as<un_cvref_t<U>, status> - ) - : m_status{status_code::ok} - , m_value{in_place, ASL_FWD(value)} - {} - - constexpr bool ok() const { return m_status.ok(); } - - constexpr status_code code() const { return m_status.code(); } - - constexpr string_view message() const { return m_status.message(); } - - constexpr status&& throw_status() && { return ASL_MOVE(m_status); } - - // @Todo(C++23) Deducing this - constexpr const T& value() const& - { - ASL_ASSERT_RELEASE(ok()); - return m_value.as_init_unsafe(); - } - - constexpr T& value() & - { - ASL_ASSERT_RELEASE(ok()); - return m_value.as_init_unsafe(); - } - - constexpr T&& value() && - { - ASL_ASSERT_RELEASE(ok()); - return ASL_MOVE(m_value.as_init_unsafe()); - } - - template<typename U> - constexpr T value_or(U&& other_value) const& - requires copy_constructible<T> && convertible_from<T, U&&> - { - return ok() ? value() : static_cast<T>(ASL_FWD(other_value)); - } - - template<typename U> - constexpr T value_or(U&& other_value) && - requires move_constructible<T> && convertible_from<T, U&&> - { - return ok() ? ASL_MOVE(value()) : static_cast<T>(ASL_FWD(other_value)); - } - - friend void AslFormat(Formatter& f, const status_or& status) - { - AslFormat(f, status.m_status); - } - - template<typename H> - requires hashable<T> - friend H AslHashValue(H h, const status_or& s) - { - if (s.ok()) - { - return H::combine(ASL_MOVE(h), s.m_status, s.value()); - } - return H::combine(ASL_MOVE(h), s.m_status); - } -}; - -template<typename T> -status_or(T) -> status_or<T>; - -} // namespace asl - |