libfilezilla
optional.hpp
Go to the documentation of this file.
1#ifndef LIBFILEZILLA_OPTIONAL_HEADER
2#define LIBFILEZILLA_OPTIONAL_HEADER
3
4
9namespace fz {
10
18template<typename T>
19class sparse_optional final
20{
21public:
23 explicit sparse_optional(T const& v);
24
26 explicit sparse_optional(T * v);
27
31
32 void clear();
33
34 explicit operator bool() const { return v_ != nullptr; };
35
36 T& operator*() { return *v_; }
37 T const& operator*() const { return *v_; }
38
39 T* operator->() { return v_; }
40 T const* operator->() const { return v_; }
41
42 bool operator==(sparse_optional<T> const& cmp) const;
43 inline bool operator!=(sparse_optional<T> const& cmp) const { return !(*this == cmp); }
44 bool operator<(sparse_optional<T> const& cmp) const;
45
46 sparse_optional<T>& operator=(sparse_optional<T> const& v);
47 sparse_optional<T>& operator=(sparse_optional<T> && v) noexcept;
48private:
49 T* v_;
50};
51
52
53template<typename T>
55 : v_()
56{
57}
58
59template<typename T>
60sparse_optional<T>::sparse_optional(T const& v)
61 : v_(new T(v))
62{
63}
64
65template<typename T>
67 : v_(v)
68{
69}
70
71template<typename T>
73{
74 if (v) {
75 v_ = new T(*v);
76 }
77 else {
78 v_ = nullptr;
79 }
80}
81
82template<typename T>
83sparse_optional<T>::sparse_optional(sparse_optional<T> && v) noexcept
84{
85 v_ = v.v_;
86 v.v_ = nullptr;
87}
88
89template<typename T>
90sparse_optional<T>::~sparse_optional()
91{
92 delete v_;
93}
94
95template<typename T>
96void sparse_optional<T>::clear()
97{
98 delete v_;
99 v_ = nullptr;
100}
101
102template<typename T>
103sparse_optional<T>& sparse_optional<T>::operator=(sparse_optional<T> const& v)
104{
105 if (this != &v) {
106 T* value{};
107 if (v.v_) {
108 value = new T(*v.v_);
109 }
110 delete v_;
111 v_ = value;
112 }
113
114 return *this;
115}
116
117template<typename T>
118sparse_optional<T>& sparse_optional<T>::operator=(sparse_optional<T> && v) noexcept
119{
120 if (this != &v) {
121 delete v_;
122 v_ = v.v_;
123 v.v_ = nullptr;
124 }
125
126 return *this;
127}
128
129template<typename T>
130bool sparse_optional<T>::operator==(sparse_optional<T> const& cmp) const
131{
132 if (!v_ && !cmp.v_) {
133 return true;
134 }
135
136 if (!v_ || !cmp.v_) {
137 return false;
138 }
139
140 return *v_ == *cmp.v_;
141}
142
143template<typename T>
144bool sparse_optional<T>::operator<(sparse_optional<T> const& cmp) const
145{
146 if (!v_ || !cmp.v_) {
147 return cmp.v_ != nullptr;
148 }
149
150 return *v_ < *cmp.v_;
151}
152
153}
154
155#endif
Similar to C++17's std::optional, but stores the data in dynamic memory.
Definition: optional.hpp:20
The namespace used by libfilezilla.
Definition: apply.hpp:17