1#ifndef LIBFILEZILLA_SHARED_HEADER
2#define LIBFILEZILLA_SHARED_HEADER
24template<
typename T,
bool Init = false>
class shared_optional final
27 shared_optional()
noexcept(!Init || std::is_nothrow_constructible_v<T>);
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);
42 const T& operator*()
const;
43 const T* operator->()
const;
53 bool operator==(shared_optional<T, Init>
const& cmp)
const;
54 bool operator==(T
const& cmp)
const;
55 bool operator<(shared_optional<T, Init>
const& cmp)
const;
56 bool operator<(T
const& cmp)
const;
59 bool is_same(shared_optional<T, Init>
const& cmp)
const;
61 inline bool operator!=(
const shared_optional<T, Init>& cmp)
const {
return !(*
this == cmp); }
62 inline bool operator!=(T
const& cmp)
const {
return !(*
this == cmp); }
65 shared_optional<T, Init>& operator=(shared_optional<T, Init>
const& v) =
default;
66 shared_optional<T, Init>& operator=(shared_optional<T, Init> && v)
noexcept =
default;
68 explicit operator bool()
const {
return static_cast<bool>(data_); }
70 bool empty()
const {
return !data_; }
72 long use_count()
const {
return data_.use_count(); }
75 std::shared_ptr<T> data_;
89template<
typename T,
bool Init> shared_optional<T, Init>::shared_optional() noexcept(!Init || std::is_nothrow_constructible_v<T>)
90 : data_(Init ? std::make_shared<T>() :
nullptr)
94template<
typename T,
bool Init> shared_optional<T, Init>::shared_optional(
const T& v)
95 : data_(std::make_shared<T>(v))
99template<
typename T,
bool Init>
bool shared_optional<T, Init>::operator==(shared_optional<T, Init>
const& cmp)
const
101 if (data_ == cmp.data_) {
104 else if (!Init && (!data_ || !cmp.data_)) {
108 return *data_ == *cmp.data_;
111template<
typename T,
bool Init>
bool shared_optional<T, Init>::operator==(T
const& cmp)
const
113 if (!Init && !data_) {
116 return *data_ == cmp;
121 return data_ == cmp.data_;
126 if (!Init && !data_) {
127 data_ = std::make_shared<T>();
129 if (data_.use_count() > 1) {
130 data_ = std::make_shared<T>(*data_);
138 if (data_ == cmp.data_) {
141 else if (!Init && !data_) {
142 return static_cast<bool>(cmp.data_);
144 else if (!Init && !cmp.data_) {
147 return *data_ < *cmp.data_;
150template<
typename T,
bool Init>
bool shared_optional<T, Init>::operator<(T
const& cmp)
const
152 if (!Init && !data_) {
158template<
typename T,
bool Init>
void shared_optional<T, Init>::clear()
163 else if (data_.use_count() <= 1) {
167 data_ = std::make_shared<T>();
171template<
typename T,
bool Init>
const T& shared_optional<T, Init>::operator*()
const
176template<
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:25
bool is_same(shared_optional< T, Init > const &cmp) const
Only compares the pointers.
Definition shared.hpp:119
T & get()
Gets a reference to the stored object.
Definition shared.hpp:124
The namespace used by libfilezilla.
Definition apply.hpp:17
shared_optional< T, true > shared_value
like shared_optional but can never be empty
Definition shared.hpp:86