1 #ifndef LIBFILEZILLA_SHARED_HEADER
2 #define LIBFILEZILLA_SHARED_HEADER
37 const T& operator*()
const;
38 const T* operator->()
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;
54 inline bool operator!=(T
const& cmp)
const {
return !(*
this == cmp); }
60 explicit operator bool()
const {
return static_cast<bool>(data_); }
62 bool empty()
const {
return !data_; }
64 std::shared_ptr<T> data_;
79 : data_(Init ? std::make_shared<T>() : 0)
83 template<
typename T,
bool Init> shared_optional<T, Init>::shared_optional(
const T& v)
84 : data_(std::make_shared<T>(v))
88 template<
typename T,
bool Init>
bool shared_optional<T, Init>::operator==(shared_optional<T, Init>
const& cmp)
const
90 if (data_ == cmp.data_) {
93 else if (!Init && (!data_ || !cmp.data_)) {
97 return *data_ == *cmp.data_;
100 template<
typename T,
bool Init>
bool shared_optional<T, Init>::operator==(T
const& cmp)
const
102 if (!Init && !data_) {
105 return *data_ == cmp;
110 if (!Init && !data_) {
111 data_ = std::make_shared<T>();
113 if (!data_.unique()) {
114 data_ = std::make_shared<T>(*data_);
122 if (data_ == cmp.data_)
124 else if (!Init && !data_) {
125 return static_cast<bool>(cmp.data_);
127 else if (!Init && !cmp.data_) {
130 return *data_ < *cmp.data_;
133 template<
typename T,
bool Init>
bool shared_optional<T, Init>::operator<(T
const& cmp)
const
135 if (!Init && !data_) {
141 template<
typename T,
bool Init>
void shared_optional<T, Init>::clear()
146 else if (data_.unique()) {
150 data_ = std::make_shared<T>();
154 template<
typename T,
bool Init>
const T& shared_optional<T, Init>::operator*()
const
159 template<
typename T,
bool Init>
const T* shared_optional<T, Init>::operator->()
const
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