1#ifndef NEFORCE_CORE_MEMORY_SHARED_PTR_HPP__
2#define NEFORCE_CORE_MEMORY_SHARED_PTR_HPP__
18NEFORCE_BEGIN_NAMESPACE__
30class smart_pointer_atomic;
39struct __smart_ptr_counter {
41 atomic<unsigned long> strong_count_;
42 atomic<unsigned long> weak_count_;
48 virtual void delete_object() = 0;
53 virtual void delete_this() = 0;
60 __smart_ptr_counter() noexcept :
64 __smart_ptr_counter(__smart_ptr_counter&&) =
delete;
66 virtual ~__smart_ptr_counter() =
default;
82 void decref_strong() noexcept {
93 void decref_weak() noexcept {
105 bool try_incref_strong() noexcept {
135template <
typename T,
typename Deleter>
136struct __smart_ptr_counter_impl final : __smart_ptr_counter {
137 compressed_pair<Deleter, T*> ptr_pair_{default_construct_tag{},
nullptr};
142 ptr_pair_(default_construct_tag{}, ptr) {}
145 ptr_pair_(exact_arg_construct_tag{}, _NEFORCE
move(deleter), ptr) {}
147 void delete_object()
override {
148 ptr_pair_.get_base()(ptr_pair_.value);
149 ptr_pair_.value =
nullptr;
152 void delete_this() noexcept
override {
delete this; }
162template <
typename T,
typename Deleter>
163struct __smart_ptr_counter_impl_fused final : __smart_ptr_counter {
164 compressed_pair<Deleter, T*> ptr_pair_{default_construct_tag{},
nullptr};
168 explicit __smart_ptr_counter_impl_fused(T* ptr,
void* mem,
size_t align, Deleter deleter) noexcept :
169 ptr_pair_(exact_arg_construct_tag{}, _NEFORCE
move(deleter), ptr),
173 void delete_object() noexcept
override {
174 ptr_pair_.get_base()(ptr_pair_.value);
175 ptr_pair_.value =
nullptr;
178 void delete_this() noexcept
override {
179#if NEFORCE_STANDARD_17
180 operator delete(mem_, std::align_val_t{align_});
182 operator delete(mem_);
195template <
typename T,
typename Deleter,
typename Alloc>
196struct __smart_ptr_counter_impl_allocated final : __smart_ptr_counter {
197 compressed_pair<Deleter, T*> ptr_pair_{default_construct_tag{},
nullptr};
198 compressed_pair<Alloc, size_t> size_pair_{default_construct_tag{}, 0};
201 explicit __smart_ptr_counter_impl_allocated(T* ptr,
void* mem,
const size_t size, Deleter deleter,
202 Alloc alloc) noexcept :
203 ptr_pair_(exact_arg_construct_tag{}, _NEFORCE
move(deleter), ptr),
204 size_pair_(exact_arg_construct_tag{}, _NEFORCE
move(alloc),
size),
207 void delete_object() noexcept
override {
208 ptr_pair_.
get_base()(ptr_pair_.value);
209 ptr_pair_.
value =
nullptr;
212 void delete_this() noexcept
override {
213 using alloc_traits = allocator_traits<Alloc>;
214 using byte_allocator =
typename alloc_traits::template alloc_rebind_t<Alloc, byte_t>;
215 byte_allocator byte_alloc(size_pair_.
get_base());
237void __setup_enable_shared_from_impl(T* ptr, __smart_ptr_counter* owner,
true_type)
noexcept {
244void __setup_enable_shared_from_impl(T*, __smart_ptr_counter*,
false_type)
noexcept {}
247void __setup_enable_shared_from(T* ptr, __smart_ptr_counter* owner)
noexcept {
252shared_ptr<T> __make_shared_fused(T* ptr, __smart_ptr_counter* owner)
noexcept {
274 using owner_type = inner::__smart_ptr_counter;
276 template <
typename U,
typename Deleter>
277 using owner_deleter = inner::__smart_ptr_counter_impl<U, Deleter>;
279 template <
typename U>
280 using owner_default = inner::__smart_ptr_counter_impl<U, default_delete<U>>;
283 owner_type* owner_ =
nullptr;
290 explicit shared_ptr(T* ptr, owner_type* owner) noexcept :
294 template <
typename U>
297 template <
typename U>
300 template <
typename U>
301 friend class inner::smart_pointer_atomic;
303 template <
typename U>
304 friend shared_ptr<U> inner::__make_shared_fused(U*, inner::__smart_ptr_counter*)
noexcept;
320 template <
typename U, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
323 owner_(new owner_default<U>(ptr_)) {
324 inner::__setup_enable_shared_from(ptr_, owner_);
334 template <
typename U,
typename Deleter, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
337 owner_(new owner_deleter<U, Deleter>(ptr_, _NEFORCE
forward<Deleter>(deleter))) {
338 inner::__setup_enable_shared_from(ptr_, owner_);
347 template <
typename U,
typename Deleter, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
357 owner_(other.owner_) {
359 owner_->incref_strong();
368 shared_ptr&
operator=(
const shared_ptr& other)
noexcept {
373 owner_->decref_strong();
376 owner_ = other.owner_;
378 owner_->incref_strong();
388 template <
typename U, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
391 owner_(other.owner_) {
393 owner_->incref_strong();
403 owner_(other.owner_) {
404 other.ptr_ =
nullptr;
405 other.owner_ =
nullptr;
418 owner_->decref_strong();
421 owner_ = other.owner_;
422 other.ptr_ =
nullptr;
423 other.owner_ =
nullptr;
432 template <
typename U, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
435 owner_(other.owner_) {
436 other.ptr_ =
nullptr;
437 other.owner_ =
nullptr;
447 template <
typename U>
450 owner_(other.owner_) {
452 owner_->incref_strong();
459 template <
typename U>
462 owner_(other.owner_) {
463 other.ptr_ =
nullptr;
464 other.owner_ =
nullptr;
470 template <
typename U, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
471 shared_ptr&
operator=(
const shared_ptr<U>& other)
noexcept {
473 owner_->decref_strong();
476 owner_ = other.owner_;
478 owner_->incref_strong();
486 template <
typename U, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
489 owner_->decref_strong();
492 owner_ = other.owner_;
493 other.ptr_ =
nullptr;
494 other.owner_ =
nullptr;
509 owner_->decref_strong();
520 template <
typename U>
523 owner_->decref_strong();
528 owner_ =
new owner_default<U>(ptr_);
529 inner::__setup_enable_shared_from<T>(ptr_, owner_);
539 template <
typename U,
typename Deleter>
540 void reset(U* ptr, Deleter deleter) {
542 owner_->decref_strong();
547 owner_ =
new owner_deleter<U, Deleter>(ptr_, _NEFORCE
move(deleter));
548 inner::__setup_enable_shared_from<T>(ptr_, owner_);
555 NEFORCE_NODISCARD
long use_count() const noexcept {
return owner_ ? owner_->use_count() : 0; }
561 NEFORCE_NODISCARD
bool unique() const noexcept {
return owner_ ? owner_->use_count() == 1 :
true; }
567 void swap(shared_ptr& other)
noexcept {
571 _NEFORCE
swap(ptr_, other.ptr_);
572 _NEFORCE
swap(owner_, other.owner_);
579 NEFORCE_NODISCARD T*
get() const noexcept {
return ptr_; }
585 NEFORCE_NODISCARD T*
operator->() const noexcept {
return ptr_; }
597 NEFORCE_NODISCARD
explicit operator bool() const noexcept {
return ptr_ !=
nullptr; }
605 template <
typename U>
606 NEFORCE_NODISCARD
bool owner_equal(
const shared_ptr<U>& rhs)
const noexcept {
607 return owner_ == rhs.owner_;
613 template <
typename U>
614 NEFORCE_NODISCARD
bool owner_equal(
const weak_ptr<U>& rhs)
const noexcept {
615 return owner_ == rhs.owner_;
624 template <
typename U>
625 NEFORCE_NODISCARD
bool owner_before(
const shared_ptr<U>& rhs)
const noexcept {
626 return owner_ < rhs.owner_;
632 template <
typename U>
633 NEFORCE_NODISCARD
bool owner_before(
const weak_ptr<U>& rhs)
const noexcept {
634 return owner_ < rhs.owner_;
641template <
typename T,
typename U>
643 return lhs.owner_equal(rhs);
649template <
typename T,
typename U>
651 return !(lhs == rhs);
657template <
typename T,
typename U>
659 return lhs.owner_before(rhs);
665template <
typename T,
typename U>
673template <
typename T,
typename U>
681template <
typename T,
typename U>
692class shared_ptr<T[]> : shared_ptr<T> {
694 using shared_ptr<T>::shared_ptr;
715 mutable inner::__smart_ptr_counter* owner_ =
nullptr;
717 template <
typename U>
718 friend void inner::__setup_enable_shared_from_impl(U* ptr, inner::__smart_ptr_counter* owner,
true_type)
noexcept;
720 template <
typename U>
721 friend void inner::__setup_enable_shared_from(U*, inner::__smart_ptr_counter*)
noexcept;
723 template <
typename U>
724 friend class shared_ptr;
726 template <
typename U>
727 friend class weak_ptr;
745 owner_->incref_strong();
746 return inner::__make_shared_fused(
static_cast<T*
>(
this), owner_);
759 owner_->incref_strong();
760 return inner::__make_shared_fused(
static_cast<const T*
>(
this), owner_);
788template <
typename T,
typename... Args>
791 using Counter = inner::__smart_ptr_counter_impl_fused<T,
decltype(deleter)>;
792 constexpr size_t align =
max(
alignof(T),
alignof(Counter));
793 constexpr size_t offset = (
sizeof(Counter) + align - 1) & ~(align - 1);
794 constexpr size_t size = offset +
sizeof(T);
795#if NEFORCE_STANDARD_17
796 void* mem =
operator new(
size, std::align_val_t{align});
797 auto* counter =
static_cast<Counter*
>(mem);
799 void* mem =
operator new(
size + align - 1);
800 size_t aligned_addr = (
reinterpret_cast<size_t>(mem) + (align - 1)) & ~(align - 1);
801 Counter* counter =
reinterpret_cast<Counter*
>(aligned_addr);
803 T*
object =
reinterpret_cast<T*
>(
reinterpret_cast<byte_t*
>(counter) + offset);
807#if NEFORCE_STANDARD_17
808 operator delete(mem, std::align_val_t{align});
810 operator delete(mem);
812 NEFORCE_THROW_EXCEPTION(
memory_exception(
"shared ptr construction failed."));
814 _NEFORCE
construct(
reinterpret_cast<Counter*
>(counter),
object, mem, align, _NEFORCE
move(deleter));
815 inner::__setup_enable_shared_from(
object, counter);
816 return inner::__make_shared_fused(
object, counter);
829 value* tmp =
nullptr;
831 tmp =
new value[len];
834 operator delete[](tmp);
835 NEFORCE_THROW_EXCEPTION(
memory_exception(
"shared ptr construction failed."));
852template <
typename T,
typename Alloc,
typename... Args>
855 auto deleter = [](T* p) { p->~T(); };
856 using ControlBlock = inner::__smart_ptr_counter_impl_allocated<T,
decltype(deleter), Alloc>;
858 const size_t align = _NEFORCE
max(
alignof(ControlBlock),
alignof(T));
859 const size_t offset = (
sizeof(ControlBlock) + align - 1) & ~(align - 1);
860 const size_t total_size = offset +
sizeof(T);
861 const size_t raw_size = total_size + align - 1;
864 using byte_allocator =
typename alloc_traits::template alloc_rebind_t<Alloc, byte_t>;
865 byte_allocator byte_alloc(alloc);
870 const uintptr_t aligned_addr = (raw_addr + align - 1) & ~
static_cast<uintptr_t>(align - 1);
871 auto aligned_mem =
reinterpret_cast<byte_t*
>(aligned_addr);
872 T* object_ptr =
reinterpret_cast<T*
>(aligned_mem + offset);
878 NEFORCE_THROW_EXCEPTION(
memory_exception(
"shared ptr ref object construction failed."));
881 ControlBlock* ctrl_block =
nullptr;
883 ctrl_block = _NEFORCE
construct(
reinterpret_cast<ControlBlock*
>(aligned_mem), object_ptr, raw_mem, raw_size,
888 NEFORCE_THROW_EXCEPTION(
memory_exception(
"shared ptr control block construction failed."));
891 inner::__setup_enable_shared_from(object_ptr, ctrl_block);
892 return inner::__make_shared_fused(object_ptr, ctrl_block);
903template <
typename T,
typename U>
915template <
typename T,
typename U>
927template <
typename T,
typename U>
939template <
typename T,
typename U>
941 T* tmp =
dynamic_cast<T*
>(ptr.
get());
942 if (tmp !=
nullptr) {
961 NEFORCE_CONSTEXPR20
size_t operator()(
const shared_ptr<T>& ptr)
const
973class smart_pointer_atomic {
975 using value_type = T;
978 struct atomic_counter {
980 using count_type = inner::__smart_ptr_counter;
987 static void dereference(count_type* counter,
true_type)
noexcept { counter->decref_strong(); }
989 static void dereference(count_type* counter,
false_type)
noexcept { counter->decref_weak(); }
992 constexpr atomic_counter() noexcept = default;
994 explicit atomic_counter(count_type* counter) noexcept :
995 value_(reinterpret_cast<
uintptr_t>(counter)) {
1002 if (
auto counter =
reinterpret_cast<count_type*
>(value)) {
1003 this->dereference(counter, is_shared_ptr<T>());
1007 atomic_counter(
const atomic_counter&) =
delete;
1008 atomic_counter& operator=(
const atomic_counter&) =
delete;
1015 while (cur & lock_bit) {
1016 this_thread::relax();
1021 this_thread::relax();
1022 cur = cur & ~lock_bit;
1024 return reinterpret_cast<count_type*
>(cur);
1029 count_type* swap_unlock(count_type* counter,
memory_order mo)
noexcept {
1033 auto addr =
reinterpret_cast<uintptr_t>(counter);
1035 return reinterpret_cast<count_type*
>(addr & ~lock_bit);
1040 const auto unlocked = old_value & ~lock_bit;
1043 value_.
wait(unlocked, mo);
1047 void notify_one() noexcept { value_.
notify_one(); }
1049 void notify_all() noexcept { value_.
notify_all(); }
1052 typename T::element_type* ptr_ =
nullptr;
1053 atomic_counter refcount_;
1055 friend struct atomic<T>;
1058 static typename atomic_counter::count_type* incref(
typename atomic_counter::count_type* counter,
true_type) {
1060 counter->incref_strong();
1065 static typename atomic_counter::count_type* incref(
typename atomic_counter::count_type* counter,
false_type) {
1067 counter->incref_weak();
1073 constexpr smart_pointer_atomic() noexcept = default;
1075 explicit smart_pointer_atomic(value_type value) noexcept :
1077 refcount_(value.owner_) {
1078 value.owner_ =
nullptr;
1079 value.ptr_ =
nullptr;
1082 ~smart_pointer_atomic() =
default;
1084 smart_pointer_atomic(
const smart_pointer_atomic&) =
delete;
1085 void operator=(
const smart_pointer_atomic&) =
delete;
1094 auto counter = refcount_.lock(mo);
1096 value.owner_ = this->incref(counter, is_shared_ptr<T>());
1103 _NEFORCE
swap(ptr_, value.ptr_);
1104 auto* old_owner = refcount_.swap_unlock(value.owner_, mo);
1105 value.owner_ = old_owner;
1108 bool compare_exchange_strong(value_type& expected, value_type desired,
memory_order mo1,
1112 if (ptr_ == expected.ptr_ && counter == expected.owner_) {
1113 ptr_ = desired.ptr_;
1114 auto* old_owner = refcount_.swap_unlock(desired.owner_, mo1);
1115 desired.owner_ = old_owner;
1117 auto* new_counter = this->incref(counter, is_shared_ptr<T>());
1118 refcount_.unlock(mo2);
1119 expected.ptr_ = ptr_;
1120 expected.owner_ = new_counter;
1128 if (ptr_ == mold.ptr_ && counter == mold.owner_) {
1129 refcount_.wait_unlock(mo);
1135 void notify_one() noexcept { refcount_.notify_one(); }
1137 void notify_all() noexcept { refcount_.notify_all(); }
1155template <
typename T>
1160 static constexpr bool is_always_lock_free =
false;
1163 inner::smart_pointer_atomic<value_type> atomic_;
1182 atomic_(
move(value)) {}
1185 void operator=(
const atomic&) =
delete;
1223 atomic_.swap(desired, mo);
1231 return atomic_.compare_exchange_strong(expected, desired, mo, mo2);
1275NEFORCE_END_NAMESPACE__
add_lvalue_reference_t< T > operator[](size_t idx)
数组下标运算符
shared_ptr(shared_ptr &&other) noexcept
移动构造函数
shared_ptr & operator=(shared_ptr< U > &&other) noexcept
类型转换移动赋值运算符
shared_ptr(shared_ptr< U > &&other) noexcept
类型转换移动构造函数
NEFORCE_NODISCARD bool owner_before(const shared_ptr< U > &rhs) const noexcept
比较所有权顺序
NEFORCE_NODISCARD long use_count() const noexcept
获取引用计数
NEFORCE_NODISCARD T * operator->() const noexcept
指针解引用运算符
shared_ptr(unique_ptr< U, Deleter > &&unique)
独享智能指针构造函数
NEFORCE_NODISCARD bool owner_before(const weak_ptr< U > &rhs) const noexcept
与弱指针比较所有权顺序
void reset(U *ptr)
重置共享指针并管理新对象
shared_ptr(const shared_ptr &other) noexcept
拷贝构造函数
NEFORCE_NODISCARD add_lvalue_reference_t< T > operator*() const noexcept
解引用运算符
NEFORCE_NODISCARD bool owner_equal(const weak_ptr< U > &rhs) const noexcept
与弱指针检查所有权是否相等
shared_ptr(const shared_ptr< U > &other) noexcept
类型转换拷贝构造函数
shared_ptr(const shared_ptr< U > &other, T *ptr) noexcept
从共享指针和别名指针别名构造函数
shared_ptr & operator=(const shared_ptr< U > &other) noexcept
类型转换拷贝赋值运算符
shared_ptr(nullptr_t np=nullptr) noexcept
默认构造函数
NEFORCE_NODISCARD bool owner_equal(const shared_ptr< U > &rhs) const noexcept
检查所有权是否相等
periodic_task_state element_type
shared_ptr(U *ptr, Deleter &&deleter)
从原始指针和自定义删除器构造函数
~shared_ptr() noexcept
析构函数
void reset(U *ptr, Deleter deleter)
带自定义删除器重置共享指针并管理新对象
void reset() noexcept
重置共享指针
shared_ptr(U *ptr)
从原始指针构造函数
void swap(shared_ptr &other) noexcept
交换两个共享指针
shared_ptr(shared_ptr< U > &&other, T *ptr) noexcept
移动别名构造函数
NEFORCE_NODISCARD bool unique() const noexcept
NEFORCE_NODISCARD T * get() const noexcept
获取原始指针
shared_ptr & operator=(shared_ptr &&other) noexcept
移动赋值运算符
shared_ptr & operator=(const shared_ptr &other) noexcept
拷贝赋值运算符
typename add_reference< T >::lvalue add_lvalue_reference_t
add_lvalue_reference的便捷别名
NEFORCE_NODISCARD constexpr T * addressof(T &x) noexcept
获取对象的地址
NEFORCE_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
NEFORCE_INLINE17 constexpr bool is_base_of_v
is_base_of的便捷变量模板
constexpr const T & max(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(a, b)))
返回两个值中的较大者
unsigned char byte_t
字节类型,定义为无符号字符
unsigned long long uint64_t
64位无符号整数类型
decltype(nullptr) nullptr_t
空指针类型
NEFORCE_NORETURN NEFORCE_ALWAYS_INLINE_INLINE void unreachable() noexcept
标记不可达代码路径
#define NEFORCE_CONSTEXPR_ASSERT(COND)
编译时常量断言
NEFORCE_CONSTEXPR20 T * construct(T *ptr, Args &&... args) noexcept(is_nothrow_constructible_v< T, Args... >)
在指定内存位置构造对象
NEFORCE_INLINE17 constexpr bool is_invocable_v
is_invocable的便捷变量模板
NEFORCE_INLINE17 constexpr auto memory_order_acq_rel
获取-释放内存顺序常量
NEFORCE_INLINE17 constexpr auto memory_order_release
释放内存顺序常量
NEFORCE_INLINE17 constexpr auto memory_order_seq_cst
顺序一致性内存顺序常量
NEFORCE_INLINE17 constexpr auto memory_order_relaxed
宽松内存顺序常量
NEFORCE_INLINE17 constexpr auto memory_order_acquire
获取内存顺序常量
constexpr memory_order cmpexch_failure_order(const memory_order mo) noexcept
获取原子比较交换操作失败时的内存顺序
@ release
释放操作,确保前面的读写不会被重排到后面
typename remove_extent< T >::type remove_extent_t
remove_extent的便捷别名
shared_ptr< T > const_pointer_cast(const shared_ptr< U > &ptr)
CV类型转换
NEFORCE_NODISCARD bool operator==(const shared_ptr< T > &lhs, const shared_ptr< U > &rhs) noexcept
相等比较运算符
NEFORCE_NODISCARD bool operator!=(const shared_ptr< T > &lhs, const shared_ptr< U > &rhs) noexcept
不等比较运算符
shared_ptr< T > dynamic_pointer_cast(const shared_ptr< U > &ptr)
动态类型转换
NEFORCE_NODISCARD bool operator>(const shared_ptr< T > &lhs, const shared_ptr< U > &rhs) noexcept
大于比较运算符
NEFORCE_NODISCARD bool operator>=(const shared_ptr< T > &lhs, const shared_ptr< U > &rhs) noexcept
大于等于比较运算符
enable_if_t<!is_unbounded_array_v< T > &&is_constructible_v< T, Args... >, shared_ptr< T > > make_shared(Args &&... args)
融合分配创建共享指针
enable_if_t<!is_array_v< T > &&is_constructible_v< T, Args... >, shared_ptr< T > > allocate_shared(Alloc &alloc, Args &&... args)
使用分配器创建共享指针
NEFORCE_NODISCARD bool operator<=(const shared_ptr< T > &lhs, const shared_ptr< U > &rhs) noexcept
小于等于比较运算符
shared_ptr< T > static_pointer_cast(const shared_ptr< U > &ptr)
静态类型转换
NEFORCE_NODISCARD bool operator<(const shared_ptr< T > &lhs, const shared_ptr< U > &rhs) noexcept
小于比较运算符(基于所有权顺序)
shared_ptr< T > reinterpret_pointer_cast(const shared_ptr< U > &ptr)
重解释类型转换
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
void swap()=delete
删除无参数的swap重载
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
NEFORCE_INLINE17 constexpr bool is_nothrow_default_constructible_v
is_nothrow_default_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_destructible_v
is_nothrow_destructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_constructible_v
is_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_move_constructible_v
is_nothrow_move_constructible的便捷变量模板
bool_constant< true > true_type
表示true的类型
bool_constant< false > false_type
表示false的类型
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
static NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 pointer allocate(Alloc &alloc, size_type n)
分配内存
static NEFORCE_CONSTEXPR20 void deallocate(Alloc &alloc, pointer ptr, size_type n)
释放内存
static NEFORCE_CONSTEXPR20 void destroy(Alloc &alloc, T *ptr) noexcept(noexcept(allocator_traits::__destroy_aux(alloc, ptr, 0)))
销毁对象
static NEFORCE_CONSTEXPR20 void construct(Alloc &alloc, T *ptr, Args &&... args) noexcept(noexcept(allocator_traits::__construct_aux(alloc, ptr, _NEFORCE forward< Args >(args)...)))
在已分配内存上构造对象
constexpr atomic(nullptr_t=nullptr) noexcept
默认构造函数
void wait(value_type mold, memory_order mo=memory_order_seq_cst) const noexcept
等待值改变
bool compare_exchange_weak(value_type &expected, value_type desired, memory_order mo, memory_order mo2) noexcept
比较交换弱版本
void operator=(value_type desired) noexcept
赋值操作符
bool is_lock_free() const noexcept
检查是否无锁
void notify_all() noexcept
通知所有等待者
value_type exchange(value_type desired, memory_order mo=memory_order_seq_cst) noexcept
交换操作
bool compare_exchange_strong(value_type &expected, value_type desired, memory_order mo, memory_order mo2) noexcept
比较交换强版本
void store(value_type desired, memory_order mo=memory_order_seq_cst) noexcept
原子存储
atomic(value_type value) noexcept
从shared_ptr构造
value_type load(memory_order mo=memory_order_seq_cst) const noexcept
原子加载
void operator=(nullptr_t) noexcept
赋空值操作符
void notify_one() noexcept
通知一个等待者
bool compare_exchange_strong(value_type &expected, value_type desired, memory_order mo=memory_order_seq_cst) noexcept
简化比较交换强版本
bool compare_exchange_weak(value_type &expected, value_type desired, memory_order mo=memory_order_seq_cst) noexcept
简化比较交换弱版本
NEFORCE_ALWAYS_INLINE bool compare_exchange_strong(value_type &expected, value_type desired, const memory_order success, const memory_order failure) noexcept
强比较交换操作
NEFORCE_ALWAYS_INLINE void wait(value_type old, const memory_order mo=memory_order_seq_cst) const noexcept
等待值改变
NEFORCE_ALWAYS_INLINE void notify_one() noexcept
通知一个等待线程
NEFORCE_ALWAYS_INLINE value_type exchange(value_type value, const memory_order mo=memory_order_seq_cst) noexcept
原子交换操作
NEFORCE_ALWAYS_INLINE void notify_all() noexcept
通知所有等待线程
NEFORCE_ALWAYS_INLINE value_type fetch_sub(value_type value, const memory_order mo=memory_order_seq_cst) noexcept
原子获取并减去操作
NEFORCE_ALWAYS_INLINE value_type load(const memory_order mo=memory_order_seq_cst) const noexcept
原子加载操作
T load(const memory_order mo=memory_order_seq_cst) const noexcept
原子加载操作
bool compare_exchange_strong(T &expected, T desired, const memory_order success, const memory_order failure) noexcept
强比较交换操作
void store(T value, const memory_order mo=memory_order_seq_cst) noexcept
原子存储操作
bool compare_exchange_weak(T &expected, T desired, const memory_order success, const memory_order failure) noexcept
弱比较交换操作
constexpr compressed_pair & get_base() noexcept
获取基类引用
enable_shared_from_this() noexcept
构造函数
shared_ptr< const T > shared_from_this() const
获取指向自身的常量共享指针
shared_ptr< T > shared_from_this()
获取指向自身的共享指针
static constexpr bool value