NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
exception_ptr.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_EXCEPTION_EXCEPTION_PTR_HPP__
2#define NEFORCE_CORE_EXCEPTION_EXCEPTION_PTR_HPP__
3
10
11#include <typeinfo>
14NEFORCE_BEGIN_NAMESPACE__
15
21
30public:
31 virtual ~exception_wrapper() = default;
32
38 virtual void rethrow() const = 0;
39
44 virtual const std::type_info& type() const noexcept = 0;
45
52 virtual unique_ptr<exception_wrapper> clone() const = 0;
53};
54
62template <typename Ex>
64 Ex exception_;
65
66public:
72 exception_(ex) {}
73
78 typed_exception_wrapper(Ex&& ex) noexcept :
79 exception_(_NEFORCE move(ex)) {}
80
85 NEFORCE_ALWAYS_INLINE void rethrow() const override { throw exception_; }
86
91 NEFORCE_ALWAYS_INLINE const std::type_info& type() const noexcept override { return typeid(Ex); }
92
97 NEFORCE_ALWAYS_INLINE unique_ptr<exception_wrapper> clone() const override {
98 return _NEFORCE make_unique<typed_exception_wrapper>(exception_);
99 }
100};
101
102
109class exception_ptr {
110public:
117 struct ecb {
120
127
131 NEFORCE_ALWAYS_INLINE void add_ref() noexcept { ref_count.fetch_add(1, memory_order_relaxed); }
132
137 NEFORCE_ALWAYS_INLINE void release() noexcept {
138 if (ref_count.load(memory_order_acquire) == 1 || ref_count.fetch_sub(1, memory_order_acq_rel) == 1) {
139 delete this;
140 }
141 }
142 };
143
144private:
145 ecb* ecb_{nullptr};
146
152 explicit exception_ptr(ecb* cb) noexcept :
153 ecb_(cb) {}
154
155 template <typename Ex>
156 friend exception_ptr make_exception_ptr(Ex) noexcept;
157
158 friend exception_ptr NEFORCE_API current_exception() noexcept;
159
160 friend void NEFORCE_API rethrow_exception(const exception_ptr&);
161
162 template <typename Ex>
163 friend exception_ptr make_exception_ptr(Ex ex) noexcept;
164
165public:
172 exception_ptr(nullptr_t np = nullptr) noexcept {}
173
180 exception_ptr(const exception_ptr& other) noexcept :
181 ecb_(other.ecb_) {
182 if (ecb_) {
183 ecb_->add_ref();
184 }
185 }
186
193 exception_ptr(exception_ptr&& other) noexcept :
194 ecb_(other.ecb_) {
195 other.ecb_ = nullptr;
196 }
197
203 ~exception_ptr() noexcept {
204 if (ecb_) {
205 ecb_->release();
206 }
207 }
208
214 exception_ptr& operator=(const exception_ptr& other) noexcept {
215 if (addressof(other) == this) {
216 return *this;
217 }
218 exception_ptr temp(other);
219 swap(temp);
220 return *this;
221 }
222
228 exception_ptr& operator=(exception_ptr&& other) noexcept {
229 if (addressof(other) == this) {
230 return *this;
231 }
232 exception_ptr temp(_NEFORCE move(other));
233 swap(temp);
234 return *this;
235 }
236
241 void swap(exception_ptr& other) noexcept { _NEFORCE swap(ecb_, other.ecb_); }
242
249 explicit operator bool() const noexcept { return ecb_ != nullptr; }
250
258 bool operator==(const exception_ptr& rhs) const noexcept { return ecb_ == rhs.ecb_; }
259
265 bool operator!=(const exception_ptr& rhs) const noexcept { return !(*this == rhs); }
266
271 bool operator==(nullptr_t) const noexcept { return !static_cast<bool>(*this); }
272
276 friend bool operator==(nullptr_t, const exception_ptr& ptr) noexcept { return !ptr; }
277
282 bool operator!=(nullptr_t) const noexcept { return static_cast<bool>(*this); }
283
287 friend bool operator!=(nullptr_t, const exception_ptr& ptr) noexcept { return static_cast<bool>(ptr); }
288
295 NEFORCE_NODISCARD const std::type_info& exception_type() const noexcept {
296 if (!ecb_ || !ecb_->wrapper) {
297 return typeid(void);
298 }
299 return ecb_->wrapper->type();
300 }
301};
302
303
313template <typename Ex>
314exception_ptr make_exception_ptr(Ex ex) noexcept {
315 try {
316 auto wrapper = _NEFORCE make_unique<typed_exception_wrapper<decay_t<Ex>>>(_NEFORCE forward<Ex>(ex));
317 unique_ptr<exception_ptr::ecb> control_block(new exception_ptr::ecb(_NEFORCE move(wrapper)));
318 exception_ptr result;
319 result.ecb_ = control_block.release();
320 return result;
321 } catch (...) {
322 return exception_ptr();
323 }
324}
325
333exception_ptr NEFORCE_API current_exception() noexcept;
334
343void NEFORCE_API rethrow_exception(const exception_ptr& p);
344 // ExceptionHandling
346
347NEFORCE_END_NAMESPACE__
348#endif // NEFORCE_CORE_EXCEPTION_EXCEPTION_PTR_HPP__
原子类型完整实现
exception_ptr(exception_ptr &&other) noexcept
移动构造函数
friend void NEFORCE_API rethrow_exception(const exception_ptr &)
重新抛出异常
exception_ptr(const exception_ptr &other) noexcept
拷贝构造函数
~exception_ptr() noexcept
析构函数
bool operator==(nullptr_t) const noexcept
与空指针比较相等
bool operator==(const exception_ptr &rhs) const noexcept
相等比较运算符
exception_ptr & operator=(const exception_ptr &other) noexcept
拷贝赋值运算符
bool operator!=(const exception_ptr &rhs) const noexcept
不等比较运算符
NEFORCE_NODISCARD const std::type_info & exception_type() const noexcept
获取异常类型信息
friend exception_ptr make_exception_ptr(Ex) noexcept
创建异常指针
exception_ptr & operator=(exception_ptr &&other) noexcept
移动赋值运算符
bool operator!=(nullptr_t) const noexcept
与空指针比较不等
friend bool operator==(nullptr_t, const exception_ptr &ptr) noexcept
空指针与异常指针比较相等
friend exception_ptr NEFORCE_API current_exception() noexcept
获取当前异常
friend bool operator!=(nullptr_t, const exception_ptr &ptr) noexcept
空指针与异常指针比较不等
void swap(exception_ptr &other) noexcept
交换两个异常指针
异常包装器基类
virtual void rethrow() const =0
重新抛出异常
virtual unique_ptr< exception_wrapper > clone() const =0
克隆异常包装器
virtual const std::type_info & type() const noexcept=0
获取异常类型信息
typed_exception_wrapper(const Ex &ex)
拷贝构造函数
NEFORCE_ALWAYS_INLINE unique_ptr< exception_wrapper > clone() const override
克隆异常包装器
typed_exception_wrapper(Ex &&ex) noexcept
移动构造函数
NEFORCE_ALWAYS_INLINE void rethrow() const override
重新抛出异常
NEFORCE_ALWAYS_INLINE const std::type_info & type() const noexcept override
获取异常类型信息
独占智能指针
NEFORCE_NODISCARD constexpr T * addressof(T &x) noexcept
获取对象的地址
NEFORCE_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
decltype(nullptr) nullptr_t
空指针类型
void NEFORCE_API rethrow_exception(const exception_ptr &p)
重新抛出异常
exception_ptr make_exception_ptr(Ex ex) noexcept
创建异常指针
exception_ptr NEFORCE_API current_exception() noexcept
获取当前异常
NEFORCE_INLINE17 constexpr auto memory_order_acq_rel
获取-释放内存顺序常量
NEFORCE_INLINE17 constexpr auto memory_order_relaxed
宽松内存顺序常量
NEFORCE_INLINE17 constexpr auto memory_order_acquire
获取内存顺序常量
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
void swap()=delete
删除无参数的swap重载
NEFORCE_CONSTEXPR20 unique_ptr< T > make_unique(Args &&... args)
创建unique_ptr
通用原子类型模板
atomic< int > ref_count
引用计数
NEFORCE_ALWAYS_INLINE void add_ref() noexcept
增加引用计数
unique_ptr< exception_wrapper > wrapper
异常包装器
NEFORCE_ALWAYS_INLINE void release() noexcept
减少引用计数
ecb(unique_ptr< exception_wrapper > wrapper)
构造函数
独占智能指针