libfilezilla
optional.hpp
Go to the documentation of this file.
1 #ifndef LIBFILEZILLA_OPTIONAL_HEADER
2 #define LIBFILEZILLA_OPTIONAL_HEADER
3 
4 
9 namespace fz {
10 
18 template<typename T>
19 class sparse_optional final
20 {
21 public:
23  explicit sparse_optional(T const& v);
24 
26  explicit sparse_optional(T * v);
27 
29  sparse_optional(sparse_optional<T> && v) noexcept;
30  ~sparse_optional();
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;
48 private:
49  T* v_;
50 };
51 
52 
53 template<typename T>
55  : v_()
56 {
57 }
58 
59 template<typename T>
60 sparse_optional<T>::sparse_optional(T const& v)
61  : v_(new T(v))
62 {
63 }
64 
65 template<typename T>
67  : v_(v)
68 {
69 }
70 
71 template<typename T>
73 {
74  if (v) {
75  v_ = new T(*v);
76  }
77  else {
78  v_ = nullptr;
79  }
80 }
81 
82 template<typename T>
83 sparse_optional<T>::sparse_optional(sparse_optional<T> && v) noexcept
84 {
85  v_ = v.v_;
86  v.v_ = nullptr;
87 }
88 
89 template<typename T>
90 sparse_optional<T>::~sparse_optional()
91 {
92  delete v_;
93 }
94 
95 template<typename T>
96 void sparse_optional<T>::clear()
97 {
98  delete v_;
99  v_ = nullptr;
100 }
101 
102 template<typename T>
103 sparse_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 
117 template<typename T>
118 sparse_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 
129 template<typename T>
130 bool 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 
143 template<typename T>
144 bool 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
fz::sparse_optional
Similar to C++17's std::optional, but stores the data in dynamic memory.
Definition: optional.hpp:20
fz
The namespace used by libfilezilla.
Definition: apply.hpp:17