libfilezilla
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
shared.hpp
Go to the documentation of this file.
1 #ifndef LIBFILEZILLA_SHARED_HEADER
2 #define LIBFILEZILLA_SHARED_HEADER
3 
4 #include <memory>
5 
9 namespace fz {
10 
24 template<typename T, bool Init = false> class shared_optional final
25 {
26 public:
28  shared_optional(shared_optional<T, Init> const& v) = default;
29  shared_optional(shared_optional<T, Init> && v) noexcept = default;
30  explicit shared_optional(const T& v);
31 
32  void clear();
33 
35  T& get();
36 
37  const T& operator*() const;
38  const T* operator->() const;
39 
48  bool operator==(shared_optional<T, Init> const& cmp) const;
49  bool operator==(T const& cmp) const;
50  bool operator<(shared_optional<T, Init> const& cmp) const;
51  bool operator<(T const& cmp) const;
52 
53  inline bool operator!=(const shared_optional<T, Init>& cmp) const { return !(*this == cmp); }
54  inline bool operator!=(T const& cmp) const { return !(*this == cmp); }
56 
57  shared_optional<T, Init>& operator=(shared_optional<T, Init> const& v) = default;
58  shared_optional<T, Init>& operator=(shared_optional<T, Init> && v) noexcept = default;
59 
60  explicit operator bool() const { return static_cast<bool>(data_); }
61 
62  bool empty() const { return !data_; }
63 private:
64  std::shared_ptr<T> data_;
65 };
66 
74 template<typename T>
76 
77 
78 template<typename T, bool Init> shared_optional<T, Init>::shared_optional()
79  : data_(Init ? std::make_shared<T>() : 0)
80 {
81 }
82 
83 template<typename T, bool Init> shared_optional<T, Init>::shared_optional(const T& v)
84  : data_(std::make_shared<T>(v))
85 {
86 }
87 
88 template<typename T, bool Init> bool shared_optional<T, Init>::operator==(shared_optional<T, Init> const& cmp) const
89 {
90  if (data_ == cmp.data_) {
91  return true;
92  }
93  else if (!Init && (!data_ || !cmp.data_)) {
94  return false;
95  }
96 
97  return *data_ == *cmp.data_;
98 }
99 
100 template<typename T, bool Init> bool shared_optional<T, Init>::operator==(T const& cmp) const
101 {
102  if (!Init && !data_) {
103  return false;
104  }
105  return *data_ == cmp;
106 }
107 
108 template<typename T, bool Init> T& shared_optional<T, Init>::get()
109 {
110  if (!Init && !data_) {
111  data_ = std::make_shared<T>();
112  }
113  if (!data_.unique()) {
114  data_ = std::make_shared<T>(*data_);
115  }
116 
117  return *data_;
118 }
119 
120 template<typename T, bool Init> bool shared_optional<T, Init>::operator<(shared_optional<T, Init> const& cmp) const
121 {
122  if (data_ == cmp.data_)
123  return false;
124  else if (!Init && !data_) {
125  return static_cast<bool>(cmp.data_);
126  }
127  else if (!Init && !cmp.data_) {
128  return false;
129  }
130  return *data_ < *cmp.data_;
131 }
132 
133 template<typename T, bool Init> bool shared_optional<T, Init>::operator<(T const& cmp) const
134 {
135  if (!Init && !data_) {
136  return true;
137  }
138  return *data_ < cmp;
139 }
140 
141 template<typename T, bool Init> void shared_optional<T, Init>::clear()
142 {
143  if (!Init) {
144  data_.reset();
145  }
146  else if (data_.unique()) {
147  *data_ = T();
148  }
149  else {
150  data_ = std::make_shared<T>();
151  }
152 }
153 
154 template<typename T, bool Init> const T& shared_optional<T, Init>::operator*() const
155 {
156  return *data_;
157 }
158 
159 template<typename T, bool Init> const T* shared_optional<T, Init>::operator->() const
160 {
161  return data_.get();
162 }
163 
164 }
165 
166 #endif
shared_optional is like std::shared_ptr but with relational operators acting like C++17's std::option...
Definition: shared.hpp:24
The namespace used by libfilezilla.
Definition: apply.hpp:16