NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
weak_ptr.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_MEMORY_WEAK_PTR_HPP__
2#define NEFORCE_CORE_MEMORY_WEAK_PTR_HPP__
3
16
18NEFORCE_BEGIN_NAMESPACE__
19
25
43template <typename T>
44class weak_ptr {
45public:
46 using element_type = T;
47
48private:
49 element_type* ptr_ = nullptr;
50 inner::__smart_ptr_counter* owner_ = nullptr;
51
52 template <typename U>
53 friend class weak_ptr;
54
55 template <typename U>
56 friend class shared_ptr;
57
58 template <typename U>
59 friend class inner::smart_pointer_atomic;
60
61public:
65 weak_ptr(nullptr_t = nullptr) noexcept {}
66
74 template <typename U, enable_if_t<is_convertible_v<U*, T*>, int> = 0>
75 weak_ptr(const shared_ptr<U>& shared) noexcept :
76 ptr_(shared.get()),
77 owner_(reinterpret_cast<inner::__smart_ptr_counter*>(shared.owner_)) {
78 if (owner_) {
79 owner_->incref_weak();
80 }
81 }
82
87 weak_ptr(const weak_ptr& other) noexcept :
88 ptr_(other.ptr_),
89 owner_(other.owner_) {
90 if (owner_) {
91 owner_->incref_weak();
92 }
93 }
94
100 template <typename U, enable_if_t<is_convertible_v<U*, T*>, int> = 0>
101 weak_ptr(const weak_ptr<U>& other) noexcept :
102 ptr_(other.ptr_),
103 owner_(other.owner_) {
104 if (owner_) {
105 owner_->incref_weak();
106 }
107 }
108
113 weak_ptr(weak_ptr&& other) noexcept :
114 ptr_(other.ptr_),
115 owner_(other.owner_) {
116 other.ptr_ = nullptr;
117 other.owner_ = nullptr;
118 }
119
125 template <typename U, enable_if_t<is_convertible_v<U*, T*>, int> = 0>
126 weak_ptr(weak_ptr<U>&& other) noexcept :
127 ptr_(other.ptr_),
128 owner_(other.owner_) {
129 other.ptr_ = nullptr;
130 other.owner_ = nullptr;
131 }
132
138
144 weak_ptr& operator=(const weak_ptr& other) noexcept {
145 if (_NEFORCE addressof(other) == this) {
146 return *this;
147 }
148 if (owner_) {
149 owner_->decref_weak();
150 }
151 ptr_ = other.ptr_;
152 owner_ = other.owner_;
153 if (owner_) {
154 owner_->incref_weak();
155 }
156 return *this;
157 }
158
165 template <typename U, enable_if_t<is_convertible_v<U*, T*>, int> = 0>
166 weak_ptr& operator=(const weak_ptr<U>& other) noexcept {
167 if (owner_) {
168 owner_->decref_weak();
169 }
170 ptr_ = other.ptr_;
171 owner_ = other.owner_;
172 if (owner_) {
173 owner_->incref_weak();
174 }
175 return *this;
176 }
177
184 template <typename U, enable_if_t<is_convertible_v<U*, T*>, int> = 0>
185 weak_ptr& operator=(const shared_ptr<U>& shared) noexcept {
186 if (owner_) {
187 owner_->decref_weak();
188 }
189 ptr_ = shared.get();
190 owner_ = reinterpret_cast<inner::__smart_ptr_counter*>(shared.owner_);
191 if (owner_) {
192 owner_->incref_weak();
193 }
194 return *this;
195 }
196
202 weak_ptr& operator=(weak_ptr&& other) noexcept {
203 if (_NEFORCE addressof(other) == this) {
204 return *this;
205 }
206 if (owner_) {
207 owner_->decref_weak();
208 }
209 ptr_ = other.ptr_;
210 owner_ = other.owner_;
211 other.ptr_ = nullptr;
212 other.owner_ = nullptr;
213 return *this;
214 }
215
222 template <typename U, enable_if_t<is_convertible_v<U*, T*>, int> = 0>
223 weak_ptr& operator=(weak_ptr<U>&& other) noexcept {
224 if (owner_) {
225 owner_->decref_weak();
226 }
227 ptr_ = other.ptr_;
228 owner_ = other.owner_;
229 other.ptr_ = nullptr;
230 other.owner_ = nullptr;
231 return *this;
232 }
233
239 void reset() noexcept {
240 if (owner_) {
241 owner_->decref_weak();
242 owner_ = nullptr;
243 }
244 ptr_ = nullptr;
245 }
246
251 void swap(weak_ptr& other) noexcept {
252 if (_NEFORCE addressof(other) == this) {
253 return;
254 }
255 _NEFORCE swap(ptr_, other.ptr_);
256 _NEFORCE swap(owner_, other.owner_);
257 }
258
263 NEFORCE_NODISCARD long use_count() const noexcept { return owner_ ? static_cast<long>(owner_->use_count()) : 0; }
264
269 NEFORCE_NODISCARD bool expired() const noexcept { return use_count() == 0; }
270
277 NEFORCE_NODISCARD shared_ptr<T> lock() const noexcept {
278 if (owner_ && owner_->try_incref_strong()) {
279 return shared_ptr<T>(ptr_, owner_);
280 }
281 return shared_ptr<T>();
282 }
283
290 template <typename U>
291 NEFORCE_NODISCARD bool owner_equal(const weak_ptr<U>& rhs) const noexcept {
292 return owner_ == rhs.owner_;
293 }
294
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_);
304 }
305
312 template <typename U>
313 NEFORCE_NODISCARD bool owner_before(const weak_ptr<U>& rhs) const noexcept {
314 return owner_ < rhs.owner_;
315 }
316
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_);
326 }
327};
328
329
335template <typename T>
337
344template <typename T>
346 using is_transparent = void;
347
351 NEFORCE_NODISCARD bool operator()(const shared_ptr<T>& lhs, const shared_ptr<T>& rhs) const noexcept {
352 return lhs.owner_before(rhs);
353 }
354
358 NEFORCE_NODISCARD bool operator()(const shared_ptr<T>& lhs, const weak_ptr<T>& rhs) const noexcept {
359 return lhs.owner_before(rhs);
360 }
361
365 NEFORCE_NODISCARD bool operator()(const weak_ptr<T>& lhs, const shared_ptr<T>& rhs) const noexcept {
366 return lhs.owner_before(rhs);
367 }
368};
369
374template <typename T>
376 using is_transparent = void;
377
381 NEFORCE_NODISCARD bool operator()(const weak_ptr<T>& lhs, const weak_ptr<T>& rhs) const noexcept {
382 return lhs.owner_before(rhs);
383 }
384
388 NEFORCE_NODISCARD bool operator()(const weak_ptr<T>& lhs, const shared_ptr<T>& rhs) const noexcept {
389 return lhs.owner_before(rhs);
390 }
391
395 NEFORCE_NODISCARD bool operator()(const shared_ptr<T>& lhs, const weak_ptr<T>& rhs) const noexcept {
396 return lhs.owner_before(rhs);
397 }
398};
399
405template <>
406struct owner_less<void> {
407 using is_transparent = void;
408
412 template <typename T, typename U>
413 NEFORCE_NODISCARD bool operator()(const shared_ptr<T>& lhs, const shared_ptr<U>& rhs) const noexcept {
414 return lhs.owner_before(rhs);
415 }
416
420 template <typename T, typename U>
421 NEFORCE_NODISCARD bool operator()(const shared_ptr<T>& lhs, const weak_ptr<U>& rhs) const noexcept {
422 return lhs.owner_before(rhs);
423 }
424
428 template <typename T, typename U>
429 NEFORCE_NODISCARD bool operator()(const weak_ptr<T>& lhs, const shared_ptr<U>& rhs) const noexcept {
430 return lhs.owner_before(rhs);
431 }
432
436 template <typename T, typename U>
437 NEFORCE_NODISCARD bool operator()(const weak_ptr<T>& lhs, const weak_ptr<U>& rhs) const noexcept {
438 return lhs.owner_before(rhs);
439 }
440};
441 // WeakPointer
443
449
456template <typename T>
457struct atomic<weak_ptr<T>> {
458public:
459 using value_type = weak_ptr<T>;
460
461 static constexpr bool is_always_lock_free = false;
462
463private:
464 inner::smart_pointer_atomic<value_type> atomic_;
465
466public:
471 bool is_lock_free() const noexcept { return false; }
472
473 constexpr atomic() noexcept = default;
474
479 atomic(value_type value) noexcept :
480 atomic_(move(value)) {}
481
482 atomic(const atomic&) = delete;
483 void operator=(const atomic&) = delete;
484
490 value_type load(memory_order mo = memory_order_seq_cst) const noexcept { return atomic_.load(mo); }
491
495 operator value_type() const noexcept { return atomic_.load(memory_order_seq_cst); }
496
502 void store(value_type desired, memory_order mo = memory_order_seq_cst) noexcept { atomic_.swap(desired, mo); }
503
507 void operator=(value_type desired) noexcept { atomic_.swap(desired, memory_order_seq_cst); }
508
515 value_type exchange(value_type desired, memory_order mo = memory_order_seq_cst) noexcept {
516 atomic_.swap(desired, mo);
517 return desired;
518 }
519
523 bool compare_exchange_strong(value_type& expected, value_type desired, memory_order mo, memory_order mo2) noexcept {
524 return atomic_.compare_exchange_strong(expected, desired, mo, mo2);
525 }
526
530 bool compare_exchange_strong(value_type& expected, value_type desired,
531 memory_order mo = memory_order_seq_cst) noexcept {
532 return compare_exchange_strong(expected, move(desired), mo, cmpexch_failure_order(mo));
533 }
534
538 bool compare_exchange_weak(value_type& expected, value_type desired, memory_order mo, memory_order mo2) noexcept {
539 return compare_exchange_strong(expected, move(desired), mo, mo2);
540 }
541
545 bool compare_exchange_weak(value_type& expected, value_type desired,
546 memory_order mo = memory_order_seq_cst) noexcept {
547 return compare_exchange_strong(expected, move(desired), mo);
548 }
549
553 void wait(value_type mold, memory_order mo = memory_order_seq_cst) const noexcept { atomic_.wait(move(mold), mo); }
554
558 void notify_one() noexcept { atomic_.notify_one(); }
559
563 void notify_all() noexcept { atomic_.notify_all(); }
564};
565 // AtomicOperations
567
568NEFORCE_END_NAMESPACE__
569#endif // NEFORCE_CORE_MEMORY_WEAK_PTR_HPP__
共享智能指针类模板
弱智能指针类模板
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
类型转换拷贝构造函数
~weak_ptr()
析构函数
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
比较所有权顺序
T element_type
元素类型
NEFORCE_NODISCARD constexpr T * addressof(T &x) noexcept
获取对象的地址
decltype(nullptr) nullptr_t
空指针类型
NEFORCE_INLINE17 constexpr auto memory_order_seq_cst
顺序一致性内存顺序常量
memory_order
内存顺序
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
强比较交换操作
T value_type
值类型
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
支持透明比较
智能指针的所有权比较器