1#ifndef MSTL_CORE_MEMORY_WEAK_PTR_HPP__
2#define MSTL_CORE_MEMORY_WEAK_PTR_HPP__
36 _INNER __smart_ptr_counter* owner_ =
nullptr;
39 friend class weak_ptr;
42 friend class shared_ptr;
60 template <
typename U, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
62 : ptr_(sp.get()), owner_(
reinterpret_cast<_INNER __smart_ptr_counter*
>(sp.owner_)) {
64 owner_->incref_weak();
73 : ptr_(wp.ptr_), owner_(wp.owner_) {
75 owner_->incref_weak();
84 template <
typename U, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
86 : ptr_(wp.ptr_), owner_(wp.owner_) {
88 owner_->incref_weak();
97 : ptr_(wp.ptr_), owner_(wp.owner_) {
107 template <
typename U, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
109 : ptr_(wp.ptr_), owner_(wp.owner_) {
129 if (owner_) owner_->decref_weak();
132 if (owner_) owner_->incref_weak();
142 template <
typename U, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
144 if (owner_) owner_->decref_weak();
147 if (owner_) owner_->incref_weak();
157 template <
typename U, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
159 if (owner_) owner_->decref_weak();
161 owner_ =
reinterpret_cast<_INNER __smart_ptr_counter*
>(sp.owner_);
162 if (owner_) owner_->incref_weak();
173 if (owner_) owner_->decref_weak();
187 template <
typename U, enable_if_t<is_convertible_v<U*, T*>,
int> = 0>
189 if (owner_) owner_->decref_weak();
204 owner_->decref_weak();
214 void swap(weak_ptr& wp)
noexcept {
225 return owner_ ?
static_cast<long>(owner_->use_count()) : 0;
232 MSTL_NODISCARD
bool expired() const noexcept {
242 MSTL_NODISCARD shared_ptr<T>
lock() const noexcept {
243 if (owner_ && owner_->try_incref_strong()) {
244 return shared_ptr<T>(ptr_, owner_);
246 return shared_ptr<T>();
255 template <
typename U>
256 MSTL_NODISCARD
bool owner_equal(
const weak_ptr<U>& rhs)
const noexcept {
257 return owner_ == rhs.owner_;
266 template <
typename U>
267 MSTL_NODISCARD
bool owner_equal(
const shared_ptr<U>& rhs)
const noexcept {
268 return owner_ ==
reinterpret_cast<_INNER __smart_ptr_counter*
>(rhs.owner_);
277 template <
typename U>
278 MSTL_NODISCARD
bool owner_before(
const weak_ptr<U>& rhs)
const noexcept {
279 return owner_ < rhs.owner_;
288 template <
typename U>
289 MSTL_NODISCARD
bool owner_before(
const shared_ptr<U>& rhs)
const noexcept {
290 return owner_ < reinterpret_cast<_INNER __smart_ptr_counter*>(rhs.owner_);
317 return lhs.owner_before(rhs);
324 return lhs.owner_before(rhs);
331 return lhs.owner_before(rhs);
347 return lhs.owner_before(rhs);
354 return lhs.owner_before(rhs);
361 return lhs.owner_before(rhs);
377 template <
typename T,
typename U>
379 return lhs.owner_before(rhs);
385 template <
typename T,
typename U>
387 return lhs.owner_before(rhs);
393 template <
typename T,
typename U>
395 return lhs.owner_before(rhs);
401 template <
typename T,
typename U>
403 return lhs.owner_before(rhs);
weak_ptr(nullptr_t np=nullptr) noexcept
默认构造函数
MSTL_NODISCARD bool expired() const noexcept
检查观察的对象是否已被销毁
void reset() noexcept
重置弱指针
weak_ptr(const weak_ptr< U > &wp) noexcept
类型转换拷贝构造函数
MSTL_NODISCARD bool owner_before(const shared_ptr< U > &rhs) const noexcept
与共享指针比较所有权顺序
weak_ptr(const shared_ptr< U > &sp) noexcept
共享智能指针构造函数
MSTL_NODISCARD long use_count() const noexcept
获取观察对象的引用计数
MSTL_NODISCARD bool owner_before(const weak_ptr< U > &rhs) const noexcept
比较所有权顺序
weak_ptr(const weak_ptr &wp) noexcept
拷贝构造函数
weak_ptr(weak_ptr &&wp) noexcept
移动构造函数
void swap(weak_ptr &wp) noexcept
交换两个弱指针
MSTL_NODISCARD bool owner_equal(const weak_ptr< U > &rhs) const noexcept
检查所有权是否相等
weak_ptr & operator=(const weak_ptr &wp) noexcept
拷贝赋值运算符
weak_ptr(weak_ptr< U > &&wp) noexcept
类型转换移动构造函数
MSTL_NODISCARD shared_ptr< T > lock() const noexcept
尝试获取共享智能指针
MSTL_NODISCARD bool owner_equal(const shared_ptr< U > &rhs) const noexcept
与共享指针检查所有权是否相等
MSTL_NODISCARD constexpr T * addressof(T &x) noexcept
获取对象的地址
decltype(nullptr) nullptr_t
空指针类型
#define _MSTL
全局命名空间MSTL前缀
#define _INNER
inner命名空间前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
void swap()=delete
删除无参数的swap重载
void is_transparent
支持透明比较
void is_transparent
支持透明比较
void is_transparent
支持透明比较