HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
expected_optional.hpp
1
2
3#pragma once
4
5#include "../utility/utility.hpp"
6#include "../macros.hpp"
7#include <expected>
8#include <optional>
9#include <variant>
10#include <exception>
11
12hi_export_module(hikogui.parser : expected_optional);
13
14hi_export namespace hi {
15inline namespace v1 {
16
17template<typename T, typename E>
19public:
20 using value_type = T;
21 using error_type = E;
22
23 constexpr expected_optional(expected_optional const&) noexcept = default;
24 constexpr expected_optional(expected_optional&&) noexcept = default;
25 constexpr expected_optional& operator=(expected_optional const&) noexcept = default;
26 constexpr expected_optional& operator=(expected_optional&&) noexcept = default;
27
28 constexpr expected_optional() noexcept = default;
29
30 constexpr expected_optional(std::nullopt_t) noexcept : _v{std::in_place_index<0>, std::monostate{}} {}
31
32 template<typename Arg = T>
33 constexpr explicit(not std::is_convertible_v<Arg, T>) expected_optional(Arg&& arg) noexcept : _v{std::in_place_index<1>, std::forward<Arg>(arg)}
34 {
35 }
36
37 template<typename Arg>
38 constexpr explicit(not std::is_convertible_v<const Arg&, E>) expected_optional(std::unexpected<Arg> const& arg) noexcept :
39 _v{std::in_place_index<2>, arg.error()}
40 {
41 }
42
43 constexpr expected_optional &operator=(std::nullopt_t) noexcept
44 {
45 _v.template emplace<0>();
46 return *this;
47 }
48
49 template<typename Arg = T>
50 constexpr expected_optional &operator=(Arg &&arg) noexcept
51 {
52 _v.template emplace<1>(std::forward<Arg>(arg));
53 return *this;
54 }
55
56 template<typename Arg = E>
57 constexpr expected_optional &operator=(std::unexpected<Arg> const &arg) noexcept
58 {
59 _v.template emplace<2>(arg);
60 return *this;
61 }
62
63 template<typename Arg = E>
64 constexpr expected_optional &operator=(std::unexpected<Arg> &&arg) noexcept
65 {
66 _v.template emplace<2>(std::move(arg));
67 return *this;
68 }
69
70 template<typename... Args>
71 constexpr value_type &emplace(Args &&... args) noexcept
72 {
73 return _v.template emplace<1>(std::forward<Args>(args)...);
74 }
75
76 [[nodiscard]] constexpr bool has_value() const noexcept
77 {
78 return _v.index() == 1;
79 }
80
81 constexpr explicit operator bool() const noexcept
82 {
83 return has_value();
84 }
85
86 [[nodiscard]] constexpr bool has_error() const noexcept
87 {
88 return _v.index() == 2;
89 }
90
91 [[nodiscard]] constexpr value_type const& operator*() const noexcept
92 {
93 hi_axiom(_v.index() == 1);
94 return std::get<1>(_v);
95 }
96
97 [[nodiscard]] constexpr value_type& operator*() noexcept
98 {
99 hi_axiom(_v.index() == 1);
100 return std::get<1>(_v);
101 }
102
103 [[nodiscard]] constexpr value_type const* operator->() const noexcept
104 {
105 hi_axiom(_v.index() == 1);
106 return std::addressof(std::get<1>(_v));
107 }
108
109 [[nodiscard]] constexpr value_type* operator->() noexcept
110 {
111 hi_axiom(_v.index() == 1);
112 return std::addressof(std::get<1>(_v));
113 }
114
115 [[nodiscard]] constexpr error_type const& error() const noexcept
116 {
117 hi_axiom(_v.index() == 2);
118 return std::get<2>(_v);
119 }
120
121 [[nodiscard]] constexpr error_type& error() noexcept
122 {
123 hi_axiom(_v.index() == 2);
124 return std::get<2>(_v);
125 }
126
127private:
128 std::variant<std::monostate, T, E> _v;
129};
130
131} // namespace v1
132}
The HikoGUI namespace.
Definition array_generic.hpp:21
The HikoGUI API version 1.
Definition array_generic.hpp:22
constexpr matrix2 operator*(matrix2 const &lhs, matrix2 const &rhs) noexcept
Matrix/Matrix multiplication.
Definition transform.hpp:69
Definition expected_optional.hpp:18
T addressof(T... args)
T forward(T... args)
T move(T... args)
T unexpected(T... args)