1#ifndef LIBFILEZILLA_SHARED_HEADER
2#define LIBFILEZILLA_SHARED_HEADER
27 shared_optional()
noexcept(!Init || std::is_nothrow_constructible_v<T>);
42 const T& operator*()
const;
43 const T* operator->()
const;
62 inline bool operator!=(T
const& cmp)
const {
return !(*
this == cmp); }
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_;
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
bool operator==(symmetric_key const &lhs, symmetric_key const &rhs)
Side-channel safe comparison.
bool operator<(strtokenizer< LhsString, LhsDelims > const &lhs, strtokenizer< RhsString, RhsDelims > const &rhs)
strtokenizer class less-than comparator.
Definition string.hpp:565