FastLED 3.9.15
Loading...
Searching...
No Matches
optional.h
Go to the documentation of this file.
1
2
3#pragma once
4
5#include "fl/variant.h"
6
7namespace fl {
8
9// nullopt support for compatibility with std::optional patterns
10struct nullopt_t {};
11constexpr nullopt_t nullopt{};
12
13template <typename T> class Optional;
14template <typename T> using optional = Optional<T>;
15
16struct Empty {};
17
18template <typename T> class Optional {
19
20 public:
23 Optional(const Optional &other) : mValue(other.mValue) {}
24 Optional(Optional &&other) noexcept : mValue(fl::move(other.mValue)) {}
25
26 Optional(const T &value) : mValue(value) {}
27 Optional(T &&value) : mValue(fl::move(value)) {}
28 ~Optional() { mValue.reset(); }
29
30 void emplace(T &&value) { mValue = fl::move(value); }
31
32 bool empty() const { return !mValue.template is<T>(); }
33 bool has_value() const { return !empty(); } // std::optional compatibility
34 T *ptr() { return mValue.template ptr<T>(); }
35 const T *ptr() const { return mValue.template ptr<T>(); }
36
37 void reset() { mValue.reset(); }
38
39 Optional &operator=(const Optional &other) {
40 if (this != &other) {
41 mValue = other.mValue;
42 }
43 return *this;
44 }
45
46 Optional &operator=(Optional &&other) noexcept {
47 if (this != &other) {
48 mValue = fl::move(other.mValue);
49 }
50 return *this;
51 }
52
54 mValue = Empty();
55 return *this;
56 }
57
58 Optional &operator=(const T &value) {
59 mValue = value;
60 return *this;
61 }
62
63 Optional &operator=(T &&value) {
64 mValue = fl::move(value);
65 return *this;
66 }
67
68 bool operator()() const { return !empty(); }
69 bool operator!() const { return empty(); }
70
71 // Explicit conversion to bool for contextual boolean evaluation
72 explicit operator bool() const { return !empty(); }
73
74 bool operator==(const Optional &other) const {
75 if (empty() && other.empty()) {
76 return true;
77 }
78 if (empty() || other.empty()) {
79 return false;
80 }
81 return *ptr() == *other.ptr();
82 }
83
84 bool operator!=(const Optional &other) const { return !(*this == other); }
85
86 bool operator==(const T &value) const {
87 if (empty()) {
88 return false;
89 }
90 return *ptr() == value;
91 }
92
93 bool operator==(nullopt_t) const { return empty(); }
94 bool operator!=(nullopt_t) const { return !empty(); }
95
96 // Dereference operators for compatibility with std::optional
97 T& operator*() { return *ptr(); }
98 const T& operator*() const { return *ptr(); }
99 T* operator->() { return ptr(); }
100 const T* operator->() const { return ptr(); }
101
102 template <typename TT, typename UU>
103 bool operator==(const Variant<TT, UU> &other) const {
104 if (!other.template holdsTypeOf<T>()) {
105 return false;
106 }
107 if (empty()) {
108 return false;
109 }
110 if (other.empty()) {
111 return false;
112 }
113 return *ptr() == *other.template ptr<T>();
114 }
115
116 void swap(Optional &other) {
117 if (this != &other) {
118 mValue.swap(other.mValue);
119 }
120 }
121
122 private:
124};
125
126// Helper function to create optionals
127template <typename T>
128optional<T> make_optional(const T& value) {
129 return optional<T>(value);
130}
131
132template <typename T>
134 return optional<T>(fl::move(value));
135}
136
137} // namespace fl
bool empty() const
Definition optional.h:32
bool operator!() const
Definition optional.h:69
bool operator==(const Optional &other) const
Definition optional.h:74
Optional & operator=(const T &value)
Definition optional.h:58
bool operator()() const
Definition optional.h:68
void emplace(T &&value)
Definition optional.h:30
Optional & operator=(nullopt_t)
Definition optional.h:53
void reset()
Definition optional.h:37
bool operator!=(nullopt_t) const
Definition optional.h:94
Optional(Optional &&other) noexcept
Definition optional.h:24
bool operator==(const T &value) const
Definition optional.h:86
T * operator->()
Definition optional.h:99
Optional(T &&value)
Definition optional.h:27
bool operator==(nullopt_t) const
Definition optional.h:93
void swap(Optional &other)
Definition optional.h:116
const T & operator*() const
Definition optional.h:98
Optional & operator=(Optional &&other) noexcept
Definition optional.h:46
Optional(const T &value)
Definition optional.h:26
Optional(nullopt_t)
Definition optional.h:22
Optional & operator=(const Optional &other)
Definition optional.h:39
Optional & operator=(T &&value)
Definition optional.h:63
fl::Variant< T, Empty > mValue
Definition optional.h:123
bool operator==(const Variant< TT, UU > &other) const
Definition optional.h:103
const T * operator->() const
Definition optional.h:100
bool operator!=(const Optional &other) const
Definition optional.h:84
T * ptr()
Definition optional.h:34
const T * ptr() const
Definition optional.h:35
bool has_value() const
Definition optional.h:33
Optional(const Optional &other)
Definition optional.h:23
T & operator*()
Definition optional.h:97
bool empty() const noexcept
Definition variant.h:104
constexpr remove_reference< T >::type && move(T &&t) noexcept
Definition move.h:27
optional< T > make_optional(const T &value)
Definition optional.h:128
Optional< T > optional
Definition optional.h:14
constexpr nullopt_t nullopt
Definition optional.h:11
IMPORTANT!
Definition crgb.h:20