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_ != nullptr) {
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_ != nullptr) {
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_ != nullptr) {
149 owner_->decref_weak();
150 }
151 ptr_ = other.ptr_;
152 owner_ = other.owner_;
153 if (owner_ != nullptr) {
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_ != nullptr) {
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_ != nullptr) {
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 {
264 return owner_ != nullptr ? static_cast<long>(owner_->use_count()) : 0;
265 }
266
271 NEFORCE_NODISCARD bool expired() const noexcept { return use_count() == 0; }
272
279 NEFORCE_NODISCARD shared_ptr<T> lock() const noexcept {
280 if (owner_ != nullptr && owner_->try_incref_strong()) {
281 return shared_ptr<T>(ptr_, owner_);
282 }
283 return shared_ptr<T>();
284 }
285
292 template <typename U>
293 NEFORCE_NODISCARD bool owner_equal(const weak_ptr<U>& rhs) const noexcept {
294 return owner_ == rhs.owner_;
295 }
296
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_);
306 }
307
314 template <typename U>
315 NEFORCE_NODISCARD bool owner_before(const weak_ptr<U>& rhs) const noexcept {
316 return owner_ < rhs.owner_;
317 }
318
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_);
328 }
329};
330
331
337template <typename T>
339
346template <typename T>
348 using is_transparent = void;
349
353 NEFORCE_NODISCARD bool operator()(const shared_ptr<T>& lhs, const shared_ptr<T>& rhs) const noexcept {
354 return lhs.owner_before(rhs);
355 }
356
360 NEFORCE_NODISCARD bool operator()(const shared_ptr<T>& lhs, const weak_ptr<T>& rhs) const noexcept {
361 return lhs.owner_before(rhs);
362 }
363
367 NEFORCE_NODISCARD bool operator()(const weak_ptr<T>& lhs, const shared_ptr<T>& rhs) const noexcept {
368 return lhs.owner_before(rhs);
369 }
370};
371
376template <typename T>
378 using is_transparent = void;
379
383 NEFORCE_NODISCARD bool operator()(const weak_ptr<T>& lhs, const weak_ptr<T>& rhs) const noexcept {
384 return lhs.owner_before(rhs);
385 }
386
390 NEFORCE_NODISCARD bool operator()(const weak_ptr<T>& lhs, const shared_ptr<T>& rhs) const noexcept {
391 return lhs.owner_before(rhs);
392 }
393
397 NEFORCE_NODISCARD bool operator()(const shared_ptr<T>& lhs, const weak_ptr<T>& rhs) const noexcept {
398 return lhs.owner_before(rhs);
399 }
400};
401
407template <>
408struct owner_less<void> {
409 using is_transparent = void;
410
414 template <typename T, typename U>
415 NEFORCE_NODISCARD bool operator()(const shared_ptr<T>& lhs, const shared_ptr<U>& rhs) const noexcept {
416 return lhs.owner_before(rhs);
417 }
418
422 template <typename T, typename U>
423 NEFORCE_NODISCARD bool operator()(const shared_ptr<T>& lhs, const weak_ptr<U>& rhs) const noexcept {
424 return lhs.owner_before(rhs);
425 }
426
430 template <typename T, typename U>
431 NEFORCE_NODISCARD bool operator()(const weak_ptr<T>& lhs, const shared_ptr<U>& rhs) const noexcept {
432 return lhs.owner_before(rhs);
433 }
434
438 template <typename T, typename U>
439 NEFORCE_NODISCARD bool operator()(const weak_ptr<T>& lhs, const weak_ptr<U>& rhs) const noexcept {
440 return lhs.owner_before(rhs);
441 }
442};
443 // WeakPointer
445
451
458template <typename T>
459struct atomic<weak_ptr<T>> {
460public:
461 using value_type = weak_ptr<T>;
462
463 static constexpr bool is_always_lock_free = false;
464
465private:
466 inner::smart_pointer_atomic<value_type> atomic_;
467
468public:
473 NEFORCE_NODISCARD bool is_lock_free() const noexcept { return false; }
474
475 constexpr atomic() noexcept = default;
476
481 atomic(value_type value) noexcept :
482 atomic_(move(value)) {}
483
484 atomic(const atomic&) = delete;
485 void operator=(const atomic&) = delete;
486
492 value_type load(memory_order mo = memory_order_seq_cst) const noexcept { return atomic_.load(mo); }
493
497 operator value_type() const noexcept { return atomic_.load(memory_order_seq_cst); }
498
504 void store(value_type desired, memory_order mo = memory_order_seq_cst) noexcept { atomic_.swap(desired, mo); }
505
509 void operator=(value_type desired) noexcept { atomic_.swap(desired, memory_order_seq_cst); }
510
517 value_type exchange(value_type desired, memory_order mo = memory_order_seq_cst) noexcept {
518 atomic_.swap(desired, mo);
519 return desired;
520 }
521
525 bool compare_exchange_strong(value_type& expected, value_type desired, memory_order mo, memory_order mo2) noexcept {
526 return atomic_.compare_exchange_strong(expected, desired, mo, mo2);
527 }
528
532 bool compare_exchange_strong(value_type& expected, value_type desired,
533 memory_order mo = memory_order_seq_cst) noexcept {
534 return compare_exchange_strong(expected, move(desired), mo, cmpexch_failure_order(mo));
535 }
536
540 bool compare_exchange_weak(value_type& expected, value_type desired, memory_order mo, memory_order mo2) noexcept {
541 return compare_exchange_strong(expected, move(desired), mo, mo2);
542 }
543
547 bool compare_exchange_weak(value_type& expected, value_type desired,
548 memory_order mo = memory_order_seq_cst) noexcept {
549 return compare_exchange_strong(expected, move(desired), mo);
550 }
551
555 void wait(value_type mold, memory_order mo = memory_order_seq_cst) const noexcept { atomic_.wait(move(mold), mo); }
556
560 void notify_one() noexcept { atomic_.notify_one(); }
561
565 void notify_all() noexcept { atomic_.notify_all(); }
566};
567 // AtomicOperations
569
570NEFORCE_END_NAMESPACE__
571#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
移动构造函数
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()
析构函数
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
共享智能指针构造函数
T element_type
元素类型
constexpr T * addressof(T &x) noexcept
获取对象的地址
decltype(nullptr) nullptr_t
空指针类型
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
值类型
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
支持透明比较
智能指针的所有权比较器