38 using internal_pointer = std::unique_ptr<T>;
43 using pointer =
typename internal_pointer::pointer;
65 void reset() noexcept;
69 [[nodiscard]] T*
get() noexcept;
70 [[nodiscard]] const T*
get() const noexcept;
72 explicit operator
bool() const noexcept;
73 [[nodiscard]]
bool has_value() const noexcept;
75 [[nodiscard]] T& operator*();
76 [[nodiscard]] const T& operator*() const;
78 [[nodiscard]] T* operator->();
79 [[nodiscard]] const T* operator->() const;
83 internal_pointer value_;
93 template <
class T,
class D>
110 concept clonable = std::derived_from<T, std::decay_t<decltype(*std::declval<T*>()->clone())>>
125 template <clonable T>
128 using internal_pointer = std::unique_ptr<T>;
133 using pointer =
typename internal_pointer::pointer;
149 requires
std::convertible_to<U*, T*>
153 requires
std::convertible_to<U*, T*>
161 requires
std::convertible_to<U*, T*>
165 requires
std::convertible_to<U*, T*>
178 constexpr explicit operator
bool() const noexcept;
180 [[nodiscard]] constexpr
std::add_lvalue_reference_t<T> operator*() const
183 [[nodiscard]] constexpr
pointer operator->() const noexcept;
187 [[nodiscard]] constexpr internal_pointer& ptr_impl() noexcept;
188 [[nodiscard]] constexpr const internal_pointer& ptr_impl() const noexcept;
190 internal_pointer m_data;
196 template <class T1, class T2>
200 template <class T1, class T2>
206 constexpr
bool operator==(const
cloning_ptr<T>& lhs,
std::nullptr_t) noexcept;
213 template <class T, class... Args>
227 : value_(
std::make_unique<T>(
std::move(value)))
233 : value_(value != nullptr ?
std::make_unique<T>(*value) :
std::unique_ptr<T>())
239 : value_(other.value_ ?
std::make_unique<T>(*other.value_) :
std::unique_ptr<T>())
250 *value_ = *other.value_;
254 value_ = std::make_unique<T>(*other.value_);
333 template <clonable T>
339 template <clonable T>
345 template <clonable T>
347 : m_data(rhs ? rhs->clone() :
nullptr)
351 template <clonable T>
352 template <clonable U>
353 requires std::convertible_to<U*, T*>
355 : m_data(rhs ? rhs->clone() :
nullptr)
359 template <clonable T>
360 template <clonable U>
361 requires std::convertible_to<U*, T*>
363 : m_data(rhs.release())
367 template <clonable T>
370 m_data = rhs ? rhs->clone() :
nullptr;
374 template <clonable T>
381 template <clonable T>
382 template <clonable U>
383 requires std::convertible_to<U*, T*>
386 m_data = rhs ? rhs->clone() :
nullptr;
390 template <clonable T>
391 template <clonable U>
392 requires std::convertible_to<U*, T*>
395 reset(rhs.release());
399 template <clonable T>
402 return ptr_impl().release();
405 template <clonable T>
408 ptr_impl().reset(ptr);
411 template <clonable T>
415 swap(ptr_impl(), other.ptr_impl());
418 template <clonable T>
421 return ptr_impl().get();
424 template <clonable T>
427 return bool(ptr_impl());
430 template <clonable T>
437 template <clonable T>
443 template <clonable T>
444 constexpr auto cloning_ptr<T>::ptr_impl() noexcept -> internal_pointer&
449 template <clonable T>
450 constexpr auto cloning_ptr<T>::ptr_impl() const noexcept -> const internal_pointer&
465 template <
class T1,
class T2>
469 return lhs.get() == rhs.get();
472 template <
class T1,
class T2>
477 return lhs.get() <=> rhs.get();
487 requires std::three_way_comparable<typename cloning_ptr<T>::pointer>
488 constexpr std::compare_three_way_result_t<typename cloning_ptr<T>::pointer>
492 return lhs.get() <=>
static_cast<pointer
>(
nullptr);
495 template <
class T,
class... Args>
Smart pointer behaving like a copiable std::unique_ptr.
constexpr pointer operator->() const noexcept
typename internal_pointer::element_type element_type
constexpr pointer get() const noexcept
constexpr cloning_ptr() noexcept=default
constexpr self_type & operator=(const self_type &) noexcept
constexpr void reset(pointer ptr=pointer()) noexcept
constexpr std::add_lvalue_reference_t< T > operator*() const noexcept(noexcept(*std::declval< pointer >()))
void swap(self_type &) noexcept
constexpr pointer release() noexcept
cloning_ptr< T > self_type
typename internal_pointer::pointer pointer
typename internal_pointer::element_type element_type
typename internal_pointer::pointer pointer
value_ptr & operator=(const value_ptr &other)
constexpr value_ptr() noexcept=default
bool has_value() const noexcept
Matches types that provide a clone method.
#define SPARROW_ASSERT_TRUE(expr__)
constexpr bool is_unique_ptr_v
constexpr std::compare_three_way_result_t< typename cloning_ptr< T1 >::pointer, typename cloning_ptr< T2 >::pointer > operator<=>(const cloning_ptr< T1 > &lhs, const cloning_ptr< T2 > &rhs) noexcept
SPARROW_API bool operator==(const array &lhs, const array &rhs)
Compares the content of two arrays.
SPARROW_API void swap(ArrowArray &lhs, ArrowArray &rhs)
Swaps the contents of the two ArrowArray objects.
cloning_ptr< T > make_cloning_ptr(Args &&... args)