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_) {
91 owner_->incref_weak();
100 template <
typename U, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
103 owner_(other.owner_) {
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;
149 owner_->decref_weak();
152 owner_ = other.owner_;
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();
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;
241 owner_->decref_weak();
251 void swap(weak_ptr& other)
noexcept {
255 _NEFORCE
swap(ptr_, other.ptr_);
256 _NEFORCE
swap(owner_, other.owner_);
263 NEFORCE_NODISCARD
long use_count() const noexcept {
return owner_ ?
static_cast<long>(owner_->use_count()) : 0; }
277 NEFORCE_NODISCARD shared_ptr<T>
lock() const noexcept {
278 if (owner_ && owner_->try_incref_strong()) {
279 return shared_ptr<T>(ptr_, owner_);
281 return shared_ptr<T>();
290 template <
typename U>
291 NEFORCE_NODISCARD
bool owner_equal(
const weak_ptr<U>& rhs)
const noexcept {
292 return owner_ == rhs.owner_;
301 template <
typename U>
302 NEFORCE_NODISCARD
bool owner_equal(
const shared_ptr<U>& rhs)
const noexcept {
303 return owner_ ==
reinterpret_cast<inner::__smart_ptr_counter*
>(rhs.owner_);
312 template <
typename U>
313 NEFORCE_NODISCARD
bool owner_before(
const weak_ptr<U>& rhs)
const noexcept {
314 return owner_ < rhs.owner_;
323 template <
typename U>
324 NEFORCE_NODISCARD
bool owner_before(
const shared_ptr<U>& rhs)
const noexcept {
325 return owner_ < reinterpret_cast<inner::__smart_ptr_counter*>(rhs.owner_);
352 return lhs.owner_before(rhs);
359 return lhs.owner_before(rhs);
366 return lhs.owner_before(rhs);
382 return lhs.owner_before(rhs);
389 return lhs.owner_before(rhs);
396 return lhs.owner_before(rhs);
412 template <
typename T,
typename U>
414 return lhs.owner_before(rhs);
420 template <
typename T,
typename U>
422 return lhs.owner_before(rhs);
428 template <
typename T,
typename U>
430 return lhs.owner_before(rhs);
436 template <
typename T,
typename U>
438 return lhs.owner_before(rhs);
461 static constexpr bool is_always_lock_free =
false;
464 inner::smart_pointer_atomic<value_type> atomic_;
473 constexpr atomic() noexcept = default;
479 atomic(value_type value) noexcept :
480 atomic_(
move(value)) {}
483 void operator=(
const atomic&) =
delete;
516 atomic_.swap(desired, mo);
524 return atomic_.compare_exchange_strong(expected, desired, mo, mo2);
568NEFORCE_END_NAMESPACE__
weak_ptr & operator=(const weak_ptr &other) noexcept
拷贝赋值运算符
weak_ptr(const weak_ptr &other) noexcept
拷贝构造函数
weak_ptr(weak_ptr &&other) noexcept
移动构造函数
NEFORCE_NODISCARD bool owner_equal(const shared_ptr< U > &rhs) const noexcept
与共享指针检查所有权是否相等
weak_ptr & operator=(const weak_ptr< U > &other) noexcept
类型转换拷贝赋值运算符
weak_ptr(nullptr_t=nullptr) noexcept
默认构造函数
weak_ptr(const weak_ptr< U > &other) noexcept
类型转换拷贝构造函数
NEFORCE_NODISCARD bool owner_equal(const weak_ptr< U > &rhs) const noexcept
检查所有权是否相等
weak_ptr & operator=(const shared_ptr< U > &shared) noexcept
共享智能指针赋值运算符
NEFORCE_NODISCARD long use_count() const noexcept
获取观察对象的引用计数
weak_ptr(weak_ptr< U > &&other) noexcept
类型转换移动构造函数
weak_ptr & operator=(weak_ptr &&other) noexcept
移动赋值运算符
void reset() noexcept
重置弱指针
NEFORCE_NODISCARD shared_ptr< T > lock() const noexcept
尝试获取共享智能指针
NEFORCE_NODISCARD bool owner_before(const shared_ptr< U > &rhs) const noexcept
与共享指针比较所有权顺序
void swap(weak_ptr &other) noexcept
交换两个弱指针
NEFORCE_NODISCARD bool expired() const noexcept
检查观察的对象是否已被销毁
weak_ptr & operator=(weak_ptr< U > &&other) noexcept
类型转换移动赋值运算符
weak_ptr(const shared_ptr< U > &shared) noexcept
共享智能指针构造函数
NEFORCE_NODISCARD bool owner_before(const weak_ptr< U > &rhs) const noexcept
比较所有权顺序
NEFORCE_NODISCARD constexpr T * addressof(T &x) noexcept
获取对象的地址
decltype(nullptr) nullptr_t
空指针类型
NEFORCE_INLINE17 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
强比较交换操作
NEFORCE_NODISCARD bool operator()(const shared_ptr< T > &lhs, const weak_ptr< T > &rhs) const noexcept
比较共享指针和弱指针的所有权
NEFORCE_NODISCARD bool operator()(const weak_ptr< T > &lhs, const shared_ptr< T > &rhs) const noexcept
比较弱指针和共享指针的所有权
void is_transparent
支持透明比较
NEFORCE_NODISCARD bool operator()(const shared_ptr< T > &lhs, const shared_ptr< T > &rhs) const noexcept
比较两个共享指针的所有权
NEFORCE_NODISCARD bool operator()(const weak_ptr< T > &lhs, const weak_ptr< U > &rhs) const noexcept
比较两个弱指针的所有权
NEFORCE_NODISCARD bool operator()(const shared_ptr< T > &lhs, const weak_ptr< U > &rhs) const noexcept
比较共享指针和弱指针的所有权
NEFORCE_NODISCARD bool operator()(const shared_ptr< T > &lhs, const shared_ptr< U > &rhs) const noexcept
比较两个共享指针的所有权
void is_transparent
支持透明比较
NEFORCE_NODISCARD bool operator()(const weak_ptr< T > &lhs, const shared_ptr< U > &rhs) const noexcept
比较弱指针和共享指针的所有权
NEFORCE_NODISCARD bool operator()(const weak_ptr< T > &lhs, const shared_ptr< T > &rhs) const noexcept
比较弱指针和共享指针的所有权
NEFORCE_NODISCARD bool operator()(const shared_ptr< T > &lhs, const weak_ptr< T > &rhs) const noexcept
比较共享指针和弱指针的所有权
NEFORCE_NODISCARD bool operator()(const weak_ptr< T > &lhs, const weak_ptr< T > &rhs) const noexcept
比较两个弱指针的所有权
void is_transparent
支持透明比较