[multiple changes]
[gcc.git] / libstdc++-v3 / libsupc++ / exception_ptr.h
1 // Exception Handling support header (exception_ptr class) for -*- C++ -*-
2
3 // Copyright (C) 2008 Free Software Foundation
4 //
5 // This file is part of GCC.
6 //
7 // GCC is free software; you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by
9 // the Free Software Foundation; either version 2, or (at your option)
10 // any later version.
11 //
12 // GCC is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with GCC; see the file COPYING. If not, write to
19 // the Free Software Foundation, 51 Franklin Street, Fifth Floor,
20 // Boston, MA 02110-1301, USA.
21
22 // As a special exception, you may use this file as part of a free software
23 // library without restriction. Specifically, if other files instantiate
24 // templates or use macros or inline functions from this file, or you compile
25 // this file and link it with other files to produce an executable, this
26 // file does not by itself cause the resulting executable to be covered by
27 // the GNU General Public License. This exception does not however
28 // invalidate any other reasons why the executable file might be covered by
29 // the GNU General Public License.
30
31 /** @file exception_ptr.h
32 * This is an internal header file, included by other headers and the
33 * implementation. You should not attempt to use it directly.
34 */
35
36 #ifndef _EXCEPTION_PTR_H
37 #define _EXCEPTION_PTR_H
38
39 #pragma GCC visibility push(default)
40
41 #include <bits/c++config.h>
42
43 #if !defined(_GLIBCXX_ATOMIC_BUILTINS_4)
44 # error This platform does not support exception propagation.
45 #endif
46
47 extern "C++" {
48
49 namespace std
50 {
51 // Hide the free operators from other types
52 namespace __exception_ptr
53 {
54 /**
55 * @brief An opaque pointer to an arbitrary exception.
56 */
57 class exception_ptr;
58 }
59
60 using __exception_ptr::exception_ptr;
61
62 /** Obtain an %exception_ptr to the currently handled exception. If there
63 * is none, or the currently handled exception is foreign, return the null
64 * value.
65 */
66 exception_ptr current_exception() throw();
67
68 /// Throw the object pointed to by the %exception_ptr.
69 void rethrow_exception(exception_ptr) __attribute__ ((__noreturn__));
70
71 /// Obtain an %exception_ptr pointing to a copy of the supplied object.
72 template <class _Ex>
73 exception_ptr copy_exception(_Ex __ex) throw();
74
75
76 namespace __exception_ptr
77 {
78 bool operator==(const exception_ptr&,
79 const exception_ptr&) throw();
80 bool operator!=(const exception_ptr&,
81 const exception_ptr&) throw();
82
83 class exception_ptr
84 {
85 void* _M_exception_object;
86
87 explicit exception_ptr(void* __e) throw();
88
89 void _M_addref() throw();
90 void _M_release() throw();
91
92 void *_M_get() const throw();
93
94 void _M_safe_bool_dummy();
95
96 friend exception_ptr std::current_exception() throw();
97 friend void std::rethrow_exception(exception_ptr);
98
99 public:
100 exception_ptr() throw();
101
102 typedef void (exception_ptr::*__safe_bool)();
103
104 // For construction from nullptr or 0.
105 exception_ptr(__safe_bool) throw();
106
107 exception_ptr(const exception_ptr&) throw();
108
109 #ifdef __GXX_EXPERIMENTAL_CXX0X__
110 exception_ptr(exception_ptr&& __o) throw()
111 : _M_exception_object(__o._M_exception_object)
112 {
113 __o._M_exception_object = 0;
114 }
115 #endif
116
117 exception_ptr& operator=(const exception_ptr&) throw();
118
119 #ifdef __GXX_EXPERIMENTAL_CXX0X__
120 exception_ptr& operator=(exception_ptr&& __o) throw()
121 {
122 exception_ptr(__o).swap(*this);
123 return *this;
124 }
125 #endif
126
127 ~exception_ptr() throw();
128
129 void swap(exception_ptr&) throw();
130
131 #ifdef __GXX_EXPERIMENTAL_CXX0X__
132 void swap(exception_ptr &&__o) throw()
133 {
134 void *__tmp = _M_exception_object;
135 _M_exception_object = __o._M_exception_object;
136 __o._M_exception_object = __tmp;
137 }
138 #endif
139
140 bool operator!() const throw();
141 operator __safe_bool() const throw();
142
143 friend bool operator==(const exception_ptr&,
144 const exception_ptr&) throw();
145
146 const type_info *__cxa_exception_type() const throw();
147 };
148
149 } // namespace __exception_ptr
150
151
152 template <class _Ex>
153 exception_ptr copy_exception(_Ex __ex) throw()
154 {
155 try
156 {
157 throw __ex;
158 }
159 catch(...)
160 {
161 return current_exception ();
162 }
163 }
164
165 } // namespace std
166
167 } // extern "C++"
168
169 #pragma GCC visibility pop
170
171 #endif