1#ifndef NEFORCE_CORE_MEMORY_WEAK_PTR_HPP__
2#define NEFORCE_CORE_MEMORY_WEAK_PTR_HPP__
18NEFORCE_BEGIN_NAMESPACE__
50 inner::__smart_ptr_counter* owner_ =
nullptr;
53 friend class weak_ptr;
56 friend class shared_ptr;
59 friend class inner::smart_pointer_atomic;
74 template <
typename U, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
75 weak_ptr(
const shared_ptr<U>& shared) noexcept :
77 owner_(
reinterpret_cast<inner::__smart_ptr_counter*
>(shared.owner_)) {
79 owner_->incref_weak();
89 owner_(other.owner_) {
90 if (owner_ !=
nullptr) {
91 owner_->incref_weak();
100 template <
typename U, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
103 owner_(other.owner_) {
104 if (owner_ !=
nullptr) {
105 owner_->incref_weak();
115 owner_(other.owner_) {
116 other.ptr_ =
nullptr;
117 other.owner_ =
nullptr;
125 template <
typename U, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
128 owner_(other.owner_) {
129 other.ptr_ =
nullptr;
130 other.owner_ =
nullptr;
148 if (owner_ !=
nullptr) {
149 owner_->decref_weak();
152 owner_ = other.owner_;
153 if (owner_ !=
nullptr) {
154 owner_->incref_weak();
165 template <
typename U, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
166 weak_ptr&
operator=(
const weak_ptr<U>& other)
noexcept {
168 owner_->decref_weak();
171 owner_ = other.owner_;
173 owner_->incref_weak();
184 template <
typename U, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
185 weak_ptr&
operator=(
const shared_ptr<U>& shared)
noexcept {
187 owner_->decref_weak();
190 owner_ =
reinterpret_cast<inner::__smart_ptr_counter*
>(shared.owner_);
192 owner_->incref_weak();
206 if (owner_ !=
nullptr) {
207 owner_->decref_weak();
210 owner_ = other.owner_;
211 other.ptr_ =
nullptr;
212 other.owner_ =
nullptr;
222 template <
typename U, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
225 owner_->decref_weak();
228 owner_ = other.owner_;
229 other.ptr_ =
nullptr;
230 other.owner_ =
nullptr;
240 if (owner_ !=
nullptr) {
241 owner_->decref_weak();
251 void swap(weak_ptr& other)
noexcept {
255 _NEFORCE
swap(ptr_, other.ptr_);
256 _NEFORCE
swap(owner_, other.owner_);
264 return owner_ !=
nullptr ?
static_cast<long>(owner_->use_count()) : 0;
279 NEFORCE_NODISCARD shared_ptr<T>
lock() const noexcept {
280 if (owner_ !=
nullptr && owner_->try_incref_strong()) {
281 return shared_ptr<T>(ptr_, owner_);
283 return shared_ptr<T>();
292 template <
typename U>
293 NEFORCE_NODISCARD
bool owner_equal(
const weak_ptr<U>& rhs)
const noexcept {
294 return owner_ == rhs.owner_;
303 template <
typename U>
304 NEFORCE_NODISCARD
bool owner_equal(
const shared_ptr<U>& rhs)
const noexcept {
305 return owner_ ==
reinterpret_cast<inner::__smart_ptr_counter*
>(rhs.owner_);
314 template <
typename U>
315 NEFORCE_NODISCARD
bool owner_before(
const weak_ptr<U>& rhs)
const noexcept {
316 return owner_ < rhs.owner_;
325 template <
typename U>
326 NEFORCE_NODISCARD
bool owner_before(
const shared_ptr<U>& rhs)
const noexcept {
327 return owner_ < reinterpret_cast<inner::__smart_ptr_counter*>(rhs.owner_);
354 return lhs.owner_before(rhs);
361 return lhs.owner_before(rhs);
368 return lhs.owner_before(rhs);
384 return lhs.owner_before(rhs);
391 return lhs.owner_before(rhs);
398 return lhs.owner_before(rhs);
414 template <
typename T,
typename U>
416 return lhs.owner_before(rhs);
422 template <
typename T,
typename U>
424 return lhs.owner_before(rhs);
430 template <
typename T,
typename U>
432 return lhs.owner_before(rhs);
438 template <
typename T,
typename U>
440 return lhs.owner_before(rhs);
463 static constexpr bool is_always_lock_free =
false;
466 inner::smart_pointer_atomic<value_type> atomic_;
475 constexpr atomic() noexcept = default;
481 atomic(value_type value) noexcept :
482 atomic_(
move(value)) {}
485 void operator=(
const atomic&) =
delete;
518 atomic_.swap(desired, mo);
526 return atomic_.compare_exchange_strong(expected, desired, mo, mo2);
570NEFORCE_END_NAMESPACE__
weak_ptr & operator=(const weak_ptr &other) noexcept
拷贝赋值运算符
weak_ptr(const weak_ptr &other) noexcept
拷贝构造函数
weak_ptr(weak_ptr &&other) noexcept
移动构造函数
weak_ptr & operator=(const weak_ptr< U > &other) noexcept
类型转换拷贝赋值运算符
weak_ptr(nullptr_t=nullptr) noexcept
默认构造函数
weak_ptr(const weak_ptr< U > &other) noexcept
类型转换拷贝构造函数
bool owner_before(const weak_ptr< U > &rhs) const noexcept
比较所有权顺序
weak_ptr & operator=(const shared_ptr< U > &shared) noexcept
共享智能指针赋值运算符
long use_count() const noexcept
获取观察对象的引用计数
bool expired() const noexcept
检查观察的对象是否已被销毁
bool owner_before(const shared_ptr< U > &rhs) const noexcept
与共享指针比较所有权顺序
weak_ptr(weak_ptr< U > &&other) noexcept
类型转换移动构造函数
weak_ptr & operator=(weak_ptr &&other) noexcept
移动赋值运算符
void reset() noexcept
重置弱指针
shared_ptr< T > lock() const noexcept
尝试获取共享智能指针
void swap(weak_ptr &other) noexcept
交换两个弱指针
bool owner_equal(const weak_ptr< U > &rhs) const noexcept
检查所有权是否相等
bool owner_equal(const shared_ptr< U > &rhs) const noexcept
与共享指针检查所有权是否相等
weak_ptr & operator=(weak_ptr< U > &&other) noexcept
类型转换移动赋值运算符
weak_ptr(const shared_ptr< U > &shared) noexcept
共享智能指针构造函数
constexpr T * addressof(T &x) noexcept
获取对象的地址
decltype(nullptr) nullptr_t
空指针类型
constexpr auto memory_order_seq_cst
顺序一致性内存顺序常量
constexpr memory_order cmpexch_failure_order(const memory_order mo) noexcept
获取原子比较交换操作失败时的内存顺序
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
void swap()=delete
删除无参数的swap重载
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_seq_cst) noexcept
简化比较交换弱版本
bool compare_exchange_strong(value_type &expected, value_type desired, memory_order mo, memory_order mo2) noexcept
比较交换强版本
bool is_lock_free() const noexcept
检查是否无锁
value_type exchange(value_type desired, memory_order mo=memory_order_seq_cst) noexcept
交换操作
void store(value_type desired, memory_order mo=memory_order_seq_cst) noexcept
原子存储
void notify_one() noexcept
通知一个等待者
void operator=(value_type desired) 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 mo2) noexcept
比较交换弱版本
void notify_all() noexcept
通知所有等待者
value_type load(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
强比较交换操作
bool operator()(const shared_ptr< T > &lhs, const weak_ptr< T > &rhs) const noexcept
比较共享指针和弱指针的所有权
bool operator()(const weak_ptr< T > &lhs, const shared_ptr< T > &rhs) const noexcept
比较弱指针和共享指针的所有权
void is_transparent
支持透明比较
bool operator()(const shared_ptr< T > &lhs, const shared_ptr< T > &rhs) const noexcept
比较两个共享指针的所有权
bool operator()(const shared_ptr< T > &lhs, const weak_ptr< U > &rhs) const noexcept
比较共享指针和弱指针的所有权
bool operator()(const weak_ptr< T > &lhs, const weak_ptr< U > &rhs) const noexcept
比较两个弱指针的所有权
bool operator()(const shared_ptr< T > &lhs, const shared_ptr< U > &rhs) const noexcept
比较两个共享指针的所有权
bool operator()(const weak_ptr< T > &lhs, const shared_ptr< U > &rhs) const noexcept
比较弱指针和共享指针的所有权
void is_transparent
支持透明比较
bool operator()(const weak_ptr< T > &lhs, const shared_ptr< T > &rhs) const noexcept
比较弱指针和共享指针的所有权
bool operator()(const weak_ptr< T > &lhs, const weak_ptr< T > &rhs) const noexcept
比较两个弱指针的所有权
bool operator()(const shared_ptr< T > &lhs, const weak_ptr< T > &rhs) const noexcept
比较共享指针和弱指针的所有权
void is_transparent
支持透明比较