1#ifndef NEFORCE_CORE_EXCEPTION_EXCEPTION_PTR_HPP__
2#define NEFORCE_CORE_EXCEPTION_EXCEPTION_PTR_HPP__
14NEFORCE_BEGIN_NAMESPACE__
44 virtual const std::type_info&
type() const noexcept = 0;
79 exception_(_NEFORCE
move(ex)) {}
85 NEFORCE_ALWAYS_INLINE
void rethrow()
const override {
throw exception_; }
91 NEFORCE_ALWAYS_INLINE
const std::type_info&
type() const noexcept
override {
return typeid(Ex); }
137 NEFORCE_ALWAYS_INLINE
void release() noexcept {
152 explicit exception_ptr(ecb* cb) noexcept :
155 template <
typename Ex>
162 template <typename Ex>
195 other.ecb_ =
nullptr;
214 exception_ptr&
operator=(
const exception_ptr& other)
noexcept {
218 exception_ptr temp(other);
228 exception_ptr&
operator=(exception_ptr&& other)
noexcept {
232 exception_ptr temp(_NEFORCE
move(other));
241 void swap(exception_ptr& other)
noexcept { _NEFORCE
swap(ecb_, other.ecb_); }
249 explicit operator bool() const noexcept {
return ecb_ !=
nullptr; }
258 bool operator==(
const exception_ptr& rhs)
const noexcept {
return ecb_ == rhs.ecb_; }
265 bool operator!=(
const exception_ptr& rhs)
const noexcept {
return !(*
this == rhs); }
296 if (!ecb_ || !ecb_->wrapper) {
299 return ecb_->wrapper->type();
313template <
typename Ex>
318 exception_ptr result;
319 result.ecb_ = control_block.
release();
322 return exception_ptr();
347NEFORCE_END_NAMESPACE__
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)
构造函数