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  delete v_;
107  if (v.v_) {
108  v_ = new T(*v.v_);
109  }
110  else {
111  v_ = nullptr;
112  }
113  }
114 
115  return *this;
116 }
117 
118 template<typename T>
119 sparse_optional<T>& sparse_optional<T>::operator=(sparse_optional<T> && v) noexcept
120 {
121  if (this != &v) {
122  delete v_;
123  v_ = v.v_;
124  v.v_ = nullptr;
125  }
126 
127  return *this;
128 }
129 
130 template<typename T>
131 bool sparse_optional<T>::operator==(sparse_optional<T> const& cmp) const
132 {
133  if (!v_ && !cmp.v_) {
134  return true;
135  }
136 
137  if (!v_ || !cmp.v_) {
138  return false;
139  }
140 
141  return *v_ == *cmp.v_;
142 }
143 
144 template<typename T>
145 bool sparse_optional<T>::operator<(sparse_optional<T> const& cmp) const
146 {
147  if (!v_ || !cmp.v_) {
148  return cmp.v_ != nullptr;
149  }
150 
151  return *v_ < *cmp.v_;
152 }
153 
154 }
155 
156 #endif
The namespace used by libfilezilla.
Definition: apply.hpp:16
Similar to C++17&#39;s std::optional, but stores the data in dynamic memory.
Definition: optional.hpp:19