libfilezilla
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
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);
25  sparse_optional(sparse_optional<T> && v) noexcept;
26  ~sparse_optional();
27 
28  void clear();
29 
30  explicit operator bool() const { return v_ != 0; };
31 
32  T& operator*() { return *v_; }
33  T const& operator*() const { return *v_; }
34 
35  T* operator->() { return v_; }
36  T const* operator->() const { return v_; }
37 
38  bool operator==(sparse_optional<T> const& cmp) const;
39  inline bool operator!=(sparse_optional<T> const& cmp) const { return !(*this == cmp); }
40  bool operator<(sparse_optional<T> const& cmp) const;
41 
42  sparse_optional<T>& operator=(sparse_optional<T> const& v);
43  sparse_optional<T>& operator=(sparse_optional<T> && v) noexcept;
44 private:
45  T* v_;
46 };
47 
48 
49 template<typename T>
51  : v_()
52 {
53 }
54 
55 template<typename T>
56 sparse_optional<T>::sparse_optional(T const& v)
57  : v_(new T(v))
58 {
59 }
60 
61 template<typename T>
62 sparse_optional<T>::sparse_optional(sparse_optional<T> const& v)
63 {
64  if (v) {
65  v_ = new T(*v);
66  }
67  else {
68  v_ = 0;
69  }
70 }
71 
72 template<typename T>
73 sparse_optional<T>::sparse_optional(sparse_optional<T> && v) noexcept
74 {
75  v_ = v.v_;
76  v.v_ = 0;
77 }
78 
79 template<typename T>
80 sparse_optional<T>::~sparse_optional()
81 {
82  delete v_;
83 }
84 
85 template<typename T>
86 void sparse_optional<T>::clear()
87 {
88  delete v_;
89  v_ = 0;
90 }
91 
92 template<typename T>
93 sparse_optional<T>& sparse_optional<T>::operator=(sparse_optional<T> const& v)
94 {
95  if (this != &v) {
96  delete v_;
97  if (v.v_) {
98  v_ = new T(*v.v_);
99  }
100  else {
101  v_ = 0;
102  }
103  }
104 
105  return *this;
106 }
107 
108 template<typename T>
109 sparse_optional<T>& sparse_optional<T>::operator=(sparse_optional<T> && v) noexcept
110 {
111  if (this != &v) {
112  delete v_;
113  v_ = v.v_;
114  v.v_ = 0;
115  }
116 
117  return *this;
118 }
119 
120 template<typename T>
121 bool sparse_optional<T>::operator==(sparse_optional<T> const& cmp) const
122 {
123  if (!v_ && !cmp.v_) {
124  return true;
125  }
126 
127  if (!v_ || !cmp.v_) {
128  return false;
129  }
130 
131  return *v_ == *cmp.v_;
132 }
133 
134 template<typename T>
135 bool sparse_optional<T>::operator<(sparse_optional<T> const& cmp) const
136 {
137  if (!v_ || !cmp.v_) {
138  return cmp.v_ != 0;
139  }
140 
141  return *v_ < *cmp.v_;
142 }
143 
144 }
145 
146 #endif
The namespace used by libfilezilla.
Definition: apply.hpp:16
Similar to C++17's std::optional, but stores the data in dynamic memory.
Definition: optional.hpp:19