17 template<
typename T,
typename Deleter = std::default_delete<T>>
25 constexpr ClonePtr() noexcept : value_{
nullptr} {}
28 constexpr ClonePtr(std::nullptr_t) noexcept : value_{
nullptr} {}
34 explicit ClonePtr(std::unique_ptr<element_type, deleter_type> p) noexcept : value_{std::move(p)} {}
43 template<typename
U, typename
E>
46 (not std::is_array_v<
U>)
and
59 value_ = std::unique_ptr<element_type>{rhs.value_->clone()};
69 ClonePtr& operator=(std::unique_ptr<
T, Deleter>&& ptr) noexcept
75 template<
typename U,
typename E>
77 (not std::is_array_v<U>)
and
79 std::is_assignable_v<Deleter&, E&&>
82 value_ = std::move(rhs.value_);
94 return value_.release();
104 value_.swap(other.value_);
114 return value_.get_deleter();
119 return value_.get_deleter();
122 explicit operator bool() const noexcept
127 std::add_lvalue_reference_t<T>
operator*() const noexcept(noexcept(*std::declval<
pointer>()))
142 template<
typename T2,
typename D2>
145 return lhs.
get() == rhs.
get();
148 template<
typename CharT,
typename Traits>
149 friend std::basic_ostream<CharT, Traits>&
operator<<(std::basic_ostream<CharT, Traits>& os,
const ClonePtr& p)
151 return os << p.
get();
155 template<
typename,
typename>
friend class ClonePtr;
157 std::unique_ptr<T, Deleter> value_;
161 template<
typename T,
typename... Args>
162 requires std::constructible_from<
T, Args&&...>
165 return ClonePtr<T>{std::make_unique<T>(std::forward<Args>(args)...)};
169template<
typename T,
typename Deleter>
170struct std::hash<
osc::ClonePtr<T, Deleter>> final {
173 return std::hash(p.get());
Definition clone_ptr.h:18
pointer release() noexcept
Definition clone_ptr.h:92
friend std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const ClonePtr &p)
Definition clone_ptr.h:149
void reset(pointer ptr=pointer()) noexcept
Definition clone_ptr.h:97
const Deleter & get_deleter() const noexcept
Definition clone_ptr.h:117
Deleter & get_deleter() noexcept
Definition clone_ptr.h:112
ClonePtr(pointer p) noexcept
Definition clone_ptr.h:31
pointer get() const noexcept
Definition clone_ptr.h:107
friend void swap(ClonePtr &lhs, ClonePtr &rhs) noexcept
Definition clone_ptr.h:137
std::add_lvalue_reference_t< T > operator*() const noexcept(noexcept(*std::declval< pointer >()))
Definition clone_ptr.h:127
constexpr ClonePtr(std::nullptr_t) noexcept
Definition clone_ptr.h:28
pointer operator->() const noexcept
Definition clone_ptr.h:132
T * pointer
Definition clone_ptr.h:20
ClonePtr & operator=(ClonePtr &&) noexcept=default
ClonePtr(std::unique_ptr< element_type, deleter_type > p) noexcept
Definition clone_ptr.h:34
ClonePtr(const ClonePtr &src)
Definition clone_ptr.h:37
constexpr ClonePtr() noexcept
Definition clone_ptr.h:25
T element_type
Definition clone_ptr.h:21
friend bool operator==(const ClonePtr &lhs, const ClonePtr< T2, D2 > &rhs)
Definition clone_ptr.h:143
ClonePtr(ClonePtr &&) noexcept=default
Deleter deleter_type
Definition clone_ptr.h:22
ClonePtr & operator=(std::nullptr_t) noexcept
Definition clone_ptr.h:86
void swap(ClonePtr &other) noexcept
Definition clone_ptr.h:102
~ClonePtr() noexcept=default
Definition custom_decoration_generator.h:5
ClonePtr< T > make_cloneable(Args &&... args)
Definition clone_ptr.h:163
and
Definition algorithms.h:158
size_t operator()(const osc::ClonePtr< T, Deleter > &p) const noexcept
Definition clone_ptr.h:171