88 :
ptr_(other.exchange(
nullptr)) {}
97 store(other.exchange(
nullptr));
108 store(std::move(ptr));
120 std::memory_order order = std::memory_order_seq_cst)
noexcept {
121#if __cpp_lib_atomic_shared_ptr >= 201711L
122 ptr_.store(std::move(ptr), order);
124 std::atomic_store_explicit(&
ptr_, std::move(ptr), order);
136 [[nodiscard]] std::shared_ptr<T>
load(
137 std::memory_order order = std::memory_order_seq_cst)
const noexcept {
138#if __cpp_lib_atomic_shared_ptr >= 201711L
139 return ptr_.load(order);
141 return std::atomic_load_explicit(&
ptr_, order);
152 std::shared_ptr<T> ptr,
153 std::memory_order order = std::memory_order_seq_cst)
noexcept {
154#if __cpp_lib_atomic_shared_ptr >= 201711L
155 return ptr_.exchange(std::move(ptr), order);
157 return std::atomic_exchange_explicit(&
ptr_, std::move(ptr), order);
173 std::shared_ptr<T>& expected,
174 std::shared_ptr<T> desired,
175 std::memory_order
success = std::memory_order_seq_cst,
176 std::memory_order failure = std::memory_order_seq_cst)
noexcept {
177#if __cpp_lib_atomic_shared_ptr >= 201711L
178 return ptr_.compare_exchange_weak(expected, std::move(desired),
success, failure);
180 return std::atomic_compare_exchange_weak_explicit(
181 &
ptr_, &expected, std::move(desired),
success, failure);
196 std::shared_ptr<T>& expected,
197 std::shared_ptr<T> desired,
198 std::memory_order
success = std::memory_order_seq_cst,
199 std::memory_order failure = std::memory_order_seq_cst)
noexcept {
200#if __cpp_lib_atomic_shared_ptr >= 201711L
201 return ptr_.compare_exchange_strong(expected, std::move(desired),
success, failure);
203 return std::atomic_compare_exchange_strong_explicit(
204 &
ptr_, &expected, std::move(desired),
success, failure);
212 [[nodiscard]]
operator std::shared_ptr<T>() const noexcept {
237 [[nodiscard]]
explicit operator bool() const noexcept {
238 return load() !=
nullptr;
263 store(std::shared_ptr<T>(ptr));
267#if __cpp_lib_atomic_shared_ptr >= 201711L
268 std::atomic<std::shared_ptr<T>>
ptr_{
nullptr};
270 std::shared_ptr<T>
ptr_{
nullptr};
282template<
typename T,
typename... Args>
std::shared_ptr< T > exchange(std::shared_ptr< T > ptr, std::memory_order order=std::memory_order_seq_cst) noexcept
Atomically exchange the value.
bool compare_exchange_weak(std::shared_ptr< T > &expected, std::shared_ptr< T > desired, std::memory_order success=std::memory_order_seq_cst, std::memory_order failure=std::memory_order_seq_cst) noexcept
Atomically compare and exchange (weak)
atomic_shared_ptr & operator=(std::shared_ptr< T > ptr) noexcept
Assign from shared_ptr.
void reset(T *ptr) noexcept
Reset to new value.
void reset() noexcept
Reset to nullptr.
void store(std::shared_ptr< T > ptr, std::memory_order order=std::memory_order_seq_cst) noexcept
Atomically store a new value.
std::shared_ptr< T > load(std::memory_order order=std::memory_order_seq_cst) const noexcept
Atomically load the current value.
atomic_shared_ptr(atomic_shared_ptr &&other) noexcept
Move constructor.
atomic_shared_ptr & operator=(const atomic_shared_ptr &other)
Copy assignment - atomically copies the shared_ptr.
atomic_shared_ptr(const atomic_shared_ptr &other)
Copy constructor - atomically copies the shared_ptr.
T & operator*() const noexcept
Dereference operator.
T * operator->() const noexcept
Member access operator.
bool compare_exchange_strong(std::shared_ptr< T > &expected, std::shared_ptr< T > desired, std::memory_order success=std::memory_order_seq_cst, std::memory_order failure=std::memory_order_seq_cst) noexcept
Atomically compare and exchange (strong)
atomic_shared_ptr & operator=(atomic_shared_ptr &&other) noexcept
Move assignment.
atomic_shared_ptr() noexcept=default
Default constructor - initializes with nullptr.
std::shared_ptr< T > ptr_
T * get_unsafe() const noexcept
Get raw pointer (unsafe - for debugging only)
Core threading foundation of the thread system library.
atomic_shared_ptr< T > make_atomic_shared(Args &&... args)
Make an atomic_shared_ptr with a new object.