37 using internal_pointer = std::unique_ptr<T>;
42 using pointer =
typename internal_pointer::pointer;
64 constexpr
void reset() noexcept;
68 [[nodiscard]] constexpr T*
get() noexcept;
69 [[nodiscard]] constexpr const T*
get() const noexcept;
71 constexpr explicit operator
bool() const noexcept;
72 [[nodiscard]] constexpr
bool has_value() const noexcept;
74 [[nodiscard]] constexpr T& operator*();
75 [[nodiscard]] constexpr const T& operator*() const;
77 [[nodiscard]] constexpr T* operator->();
78 [[nodiscard]] constexpr const T* operator->() const;
82 internal_pointer value_;
92 template <
class T,
class D>
109 concept clonable = std::derived_from<T, std::decay_t<decltype(*std::declval<T*>()->clone())>>
124 template <clonable T>
127 using internal_pointer = std::unique_ptr<T>;
132 using pointer =
typename internal_pointer::pointer;
148 requires
std::convertible_to<U*, T*>
152 requires
std::convertible_to<U*, T*>
160 requires
std::convertible_to<U*, T*>
164 requires
std::convertible_to<U*, T*>
177 constexpr explicit operator
bool() const noexcept;
179 [[nodiscard]] constexpr
std::add_lvalue_reference_t<T>
180 operator*() const noexcept(noexcept(*
std::declval<
pointer>()));
182 [[nodiscard]] constexpr
pointer operator->() const noexcept;
186 [[nodiscard]] constexpr internal_pointer& ptr_impl() noexcept;
187 [[nodiscard]] constexpr const internal_pointer& ptr_impl() const noexcept;
189 internal_pointer m_data;
195 template <class T1, class T2>
199 template <class T1, class T2>
205 constexpr
bool operator==(const
cloning_ptr<T>& lhs,
std::nullptr_t) noexcept;
212 template <class T, class... Args>
226 : value_(
std::make_unique<T>(
std::move(value)))
232 : value_(value != nullptr ?
std::make_unique<T>(*value) :
std::unique_ptr<T>())
238 : value_(other.value_ ?
std::make_unique<T>(*other.value_) :
std::unique_ptr<T>())
249 *value_ = *other.value_;
253 value_ = std::make_unique<T>(*other.value_);
332 template <clonable T>
338 template <clonable T>
344 template <clonable T>
346 : m_data(rhs ? rhs->clone() :
nullptr)
350 template <clonable T>
351 template <clonable U>
352 requires std::convertible_to<U*, T*>
354 : m_data(rhs ? rhs->clone() :
nullptr)
358 template <clonable T>
359 template <clonable U>
360 requires std::convertible_to<U*, T*>
362 : m_data(rhs.release())
366 template <clonable T>
369 m_data = rhs ? rhs->clone() :
nullptr;
373 template <clonable T>
380 template <clonable T>
381 template <clonable U>
382 requires std::convertible_to<U*, T*>
385 m_data = rhs ? rhs->clone() :
nullptr;
389 template <clonable T>
390 template <clonable U>
391 requires std::convertible_to<U*, T*>
394 reset(rhs.release());
398 template <clonable T>
401 return ptr_impl().release();
404 template <clonable T>
407 ptr_impl().reset(ptr);
410 template <clonable T>
414 swap(ptr_impl(), other.ptr_impl());
417 template <clonable T>
420 return ptr_impl().get();
423 template <clonable T>
426 return bool(ptr_impl());
429 template <clonable T>
430 constexpr std::add_lvalue_reference_t<T>
436 template <clonable T>
442 template <clonable T>
443 constexpr auto cloning_ptr<T>::ptr_impl() noexcept -> internal_pointer&
448 template <clonable T>
449 constexpr auto cloning_ptr<T>::ptr_impl() const noexcept -> const internal_pointer&
464 template <
class T1,
class T2>
468 return lhs.get() == rhs.get();
471 template <
class T1,
class T2>
476 return lhs.get() <=> rhs.get();
486 requires std::three_way_comparable<typename cloning_ptr<T>::pointer>
487 constexpr std::compare_three_way_result_t<typename cloning_ptr<T>::pointer>
491 return lhs.get() <=>
static_cast<pointer
>(
nullptr);
494 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
constexpr bool has_value() const noexcept
constexpr T * get() noexcept
typename internal_pointer::element_type element_type
typename internal_pointer::pointer pointer
constexpr value_ptr & operator=(const value_ptr &other)
constexpr T & operator*()
constexpr void reset() noexcept
constexpr T * operator->()
constexpr value_ptr() noexcept=default
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)