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 bool empty() const { return !mValue.template is<T>(); }
30 bool has_value() const { return !empty(); } // std::optional compatibility
31 T *ptr() { return mValue.template ptr<T>(); }
32 const T *ptr() const { return mValue.template ptr<T>(); }
33
34 void reset() { mValue.reset(); }
35
36 Optional &operator=(const Optional &other) {
37 if (this != &other) {
38 mValue = other.mValue;
39 }
40 return *this;
41 }
42
43 Optional &operator=(Optional &&other) noexcept {
44 if (this != &other) {
45 mValue = fl::move(other.mValue);
46 }
47 return *this;
48 }
49
51 mValue = Empty();
52 return *this;
53 }
54
55 Optional &operator=(const T &value) {
56 mValue = value;
57 return *this;
58 }
59
60 bool operator()() const { return !empty(); }
61 bool operator!() const { return empty(); }
62
63 // Explicit conversion to bool for contextual boolean evaluation
64 explicit operator bool() const { return !empty(); }
65
66 bool operator==(const Optional &other) const {
67 if (empty() && other.empty()) {
68 return true;
69 }
70 if (empty() || other.empty()) {
71 return false;
72 }
73 return *ptr() == *other.ptr();
74 }
75
76 bool operator!=(const Optional &other) const { return !(*this == other); }
77
78 bool operator==(const T &value) const {
79 if (empty()) {
80 return false;
81 }
82 return *ptr() == value;
83 }
84
85 bool operator==(nullopt_t) const { return empty(); }
86 bool operator!=(nullopt_t) const { return !empty(); }
87
88 // Dereference operators for compatibility with std::optional
89 T& operator*() { return *ptr(); }
90 const T& operator*() const { return *ptr(); }
91 T* operator->() { return ptr(); }
92 const T* operator->() const { return ptr(); }
93
94 template <typename TT, typename UU>
95 bool operator==(const Variant<TT, UU> &other) const {
96 if (!other.template holdsTypeOf<T>()) {
97 return false;
98 }
99 if (empty()) {
100 return false;
101 }
102 if (other.empty()) {
103 return false;
104 }
105 return *ptr() == *other.template ptr<T>();
106 }
107
108 void swap(Optional &other) {
109 if (this != &other) {
110 mValue.swap(other.mValue);
111 }
112 }
113
114 private:
116};
117
118// Helper function to create optionals
119template <typename T>
120optional<T> make_optional(const T& value) {
121 return optional<T>(value);
122}
123
124template <typename T>
126 return optional<T>(fl::move(value));
127}
128
129} // namespace fl
bool empty() const
Definition optional.h:29
bool operator!() const
Definition optional.h:61
bool operator==(const Optional &other) const
Definition optional.h:66
Optional & operator=(const T &value)
Definition optional.h:55
bool operator()() const
Definition optional.h:60
Optional & operator=(nullopt_t)
Definition optional.h:50
void reset()
Definition optional.h:34
bool operator!=(nullopt_t) const
Definition optional.h:86
Optional(Optional &&other) noexcept
Definition optional.h:24
bool operator==(const T &value) const
Definition optional.h:78
T * operator->()
Definition optional.h:91
Optional(T &&value)
Definition optional.h:27
bool operator==(nullopt_t) const
Definition optional.h:85
void swap(Optional &other)
Definition optional.h:108
const T & operator*() const
Definition optional.h:90
Optional & operator=(Optional &&other) noexcept
Definition optional.h:43
Optional(const T &value)
Definition optional.h:26
Optional(nullopt_t)
Definition optional.h:22
Optional & operator=(const Optional &other)
Definition optional.h:36
fl::Variant< T, Empty > mValue
Definition optional.h:115
bool operator==(const Variant< TT, UU > &other) const
Definition optional.h:95
const T * operator->() const
Definition optional.h:92
bool operator!=(const Optional &other) const
Definition optional.h:76
T * ptr()
Definition optional.h:31
const T * ptr() const
Definition optional.h:32
bool has_value() const
Definition optional.h:30
Optional(const Optional &other)
Definition optional.h:23
T & operator*()
Definition optional.h:89
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:120
Optional< T > optional
Definition optional.h:14
constexpr nullopt_t nullopt
Definition optional.h:11
IMPORTANT!
Definition crgb.h:20