31 #ifndef _EXCEPTION_PTR_H 32 #define _EXCEPTION_PTR_H 40 #if __cplusplus >= 201103L 44 #ifdef _GLIBCXX_EH_PTR_RELOPS_COMPAT 45 # define _GLIBCXX_EH_PTR_USED __attribute__((__used__)) 47 # define _GLIBCXX_EH_PTR_USED 52 namespace std _GLIBCXX_VISIBILITY(default)
61 namespace __exception_ptr
66 using __exception_ptr::exception_ptr;
77 template<typename _Ex>
83 namespace __exception_ptr
99 void* _M_exception_object;
103 void _M_addref() _GLIBCXX_USE_NOEXCEPT;
104 void _M_release() _GLIBCXX_USE_NOEXCEPT;
106 void *_M_get()
const _GLIBCXX_NOEXCEPT __attribute__ ((__pure__));
110 template<
typename _Ex>
118 #if __cplusplus >= 201103L 120 : _M_exception_object(
nullptr)
124 : _M_exception_object(__o._M_exception_object)
125 { __o._M_exception_object =
nullptr; }
128 #if (__cplusplus < 201103L) || defined (_GLIBCXX_EH_PTR_COMPAT) 138 #if __cplusplus >= 201103L 142 exception_ptr(static_cast<exception_ptr&&>(__o)).swap(*
this);
152 #ifdef _GLIBCXX_EH_PTR_COMPAT 154 void _M_safe_bool_dummy() _GLIBCXX_USE_NOEXCEPT
155 __attribute__ ((__const__));
156 bool operator!()
const _GLIBCXX_USE_NOEXCEPT
157 __attribute__ ((__pure__));
158 operator __safe_bool()
const _GLIBCXX_USE_NOEXCEPT;
161 #if __cplusplus >= 201103L 162 explicit operator bool()
const noexcept
163 {
return _M_exception_object; }
166 #if __cpp_impl_three_way_comparison >= 201907L \ 167 && ! defined _GLIBCXX_EH_PTR_RELOPS_COMPAT 171 friend _GLIBCXX_EH_PTR_USED
bool 173 _GLIBCXX_USE_NOEXCEPT
174 {
return __x._M_exception_object == __y._M_exception_object; }
176 friend _GLIBCXX_EH_PTR_USED
bool 178 _GLIBCXX_USE_NOEXCEPT
179 {
return __x._M_exception_object != __y._M_exception_object; }
183 __cxa_exception_type()
const _GLIBCXX_USE_NOEXCEPT
184 __attribute__ ((__pure__));
189 exception_ptr::exception_ptr() _GLIBCXX_USE_NOEXCEPT
190 : _M_exception_object(0)
196 _GLIBCXX_USE_NOEXCEPT
197 : _M_exception_object(__other._M_exception_object)
199 if (_M_exception_object)
205 exception_ptr::~exception_ptr() _GLIBCXX_USE_NOEXCEPT
207 if (_M_exception_object)
212 inline exception_ptr&
213 exception_ptr::operator=(
const exception_ptr& __other) _GLIBCXX_USE_NOEXCEPT
215 exception_ptr(__other).swap(*
this);
221 exception_ptr::swap(exception_ptr &__other) _GLIBCXX_USE_NOEXCEPT
223 void *__tmp = _M_exception_object;
224 _M_exception_object = __other._M_exception_object;
225 __other._M_exception_object = __tmp;
231 { __lhs.swap(__rhs); }
234 template<
typename _Ex>
235 _GLIBCXX_CDTOR_CALLABI
237 __dest_thunk(
void* __x)
238 {
static_cast<_Ex*
>(__x)->~_Ex(); }
243 using __exception_ptr::swap;
246 #if (__cplusplus >= 201103L && __cpp_rtti) || __cpp_exceptions 247 template<
typename _Ex>
251 #if __cplusplus >= 201103L && __cpp_rtti 252 using _Ex2 =
typename decay<_Ex>::type;
253 void* __e = __cxxabiv1::__cxa_allocate_exception(
sizeof(_Ex));
254 (void) __cxxabiv1::__cxa_init_primary_exception(
255 __e, const_cast<std::type_info*>(&
typeid(_Ex)),
256 __exception_ptr::__dest_thunk<_Ex2>);
259 ::new (__e) _Ex2(__ex);
264 __cxxabiv1::__cxa_free_exception(__e);
278 #else // no RTTI and no exceptions 281 template<
typename _Ex>
282 __attribute__ ((__always_inline__))
285 {
return exception_ptr(); }
288 #undef _GLIBCXX_EH_PTR_USED exception_ptr current_exception() noexcept
void rethrow_exception(exception_ptr)
Throw the object pointed to by the exception_ptr.
ISO C++ entities toplevel namespace is std.
exception_ptr make_exception_ptr(_Ex) noexcept
Obtain an exception_ptr pointing to a copy of the supplied object.
void swap(exception_ptr &__lhs, exception_ptr &__rhs)
An opaque pointer to an arbitrary exception.