3045 |
09 Jun 13 |
peter |
1 |
#ifndef theplu_yat_utility_boost_exception_ptr_h |
3045 |
09 Jun 13 |
peter |
2 |
#define theplu_yat_utility_boost_exception_ptr_h |
3047 |
09 Jun 13 |
peter |
// $Id$ |
3045 |
09 Jun 13 |
peter |
4 |
|
3045 |
09 Jun 13 |
peter |
5 |
/* |
3045 |
09 Jun 13 |
peter |
Copyright (C) 2013 Peter Johansson |
3045 |
09 Jun 13 |
peter |
7 |
|
3045 |
09 Jun 13 |
peter |
This file is part of the yat library, http://dev.thep.lu.se/yat |
3045 |
09 Jun 13 |
peter |
9 |
|
3045 |
09 Jun 13 |
peter |
The yat library is free software; you can redistribute it and/or |
3045 |
09 Jun 13 |
peter |
modify it under the terms of the GNU General Public License as |
3045 |
09 Jun 13 |
peter |
published by the Free Software Foundation; either version 3 of the |
3045 |
09 Jun 13 |
peter |
License, or (at your option) any later version. |
3045 |
09 Jun 13 |
peter |
14 |
|
3045 |
09 Jun 13 |
peter |
The yat library is distributed in the hope that it will be useful, |
3045 |
09 Jun 13 |
peter |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
3045 |
09 Jun 13 |
peter |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
3045 |
09 Jun 13 |
peter |
General Public License for more details. |
3045 |
09 Jun 13 |
peter |
19 |
|
3045 |
09 Jun 13 |
peter |
You should have received a copy of the GNU General Public License |
3045 |
09 Jun 13 |
peter |
along with yat. If not, see <http://www.gnu.org/licenses/>. |
3045 |
09 Jun 13 |
peter |
22 |
*/ |
3045 |
09 Jun 13 |
peter |
23 |
|
3044 |
09 Jun 13 |
peter |
//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. |
3044 |
09 Jun 13 |
peter |
25 |
|
3044 |
09 Jun 13 |
peter |
//Distributed under the Boost Software License, Version 1.0. (See accompanying |
3044 |
09 Jun 13 |
peter |
//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
3044 |
09 Jun 13 |
peter |
28 |
|
3045 |
09 Jun 13 |
peter |
// This file is patched version of the one distributed in Boost 1.41 |
3045 |
09 Jun 13 |
peter |
// See ticket #762 http://dev.thep.lu.se/yat/ticket/762 for motivation. |
3045 |
09 Jun 13 |
peter |
// If compiler works with <boost/exception_ptr.hpp> that file is |
3045 |
09 Jun 13 |
peter |
// included; otherwise this patched version is included |
3045 |
09 Jun 13 |
peter |
33 |
// |
3045 |
09 Jun 13 |
peter |
// Users can include this file before any boost header to avoid the |
3045 |
09 Jun 13 |
peter |
// problem reported in: http://dev.thep.lu.se/yat/ticket/762 |
3045 |
09 Jun 13 |
peter |
36 |
|
3045 |
09 Jun 13 |
peter |
/// \cond IGNORE_DOXYGEN |
3045 |
09 Jun 13 |
peter |
38 |
|
3045 |
09 Jun 13 |
peter |
39 |
#include "config_public.h" |
3045 |
09 Jun 13 |
peter |
40 |
#ifdef YAT_HAVE_WORKING_BOOST_EXCEPTION_PTR |
3045 |
09 Jun 13 |
peter |
41 |
#include <boost/exception_ptr.hpp> |
3045 |
09 Jun 13 |
peter |
42 |
#else |
3045 |
09 Jun 13 |
peter |
43 |
|
3044 |
09 Jun 13 |
peter |
44 |
#ifndef UUID_FA5836A2CADA11DC8CD47C8555D89593 |
3044 |
09 Jun 13 |
peter |
45 |
#define UUID_FA5836A2CADA11DC8CD47C8555D89593 |
3044 |
09 Jun 13 |
peter |
46 |
|
3044 |
09 Jun 13 |
peter |
47 |
#include <boost/config.hpp> |
3044 |
09 Jun 13 |
peter |
48 |
#ifdef BOOST_NO_EXCEPTIONS |
3044 |
09 Jun 13 |
peter |
49 |
#error This header requires exception handling to be enabled. |
3044 |
09 Jun 13 |
peter |
50 |
#endif |
3044 |
09 Jun 13 |
peter |
51 |
#include <boost/exception/exception.hpp> |
3044 |
09 Jun 13 |
peter |
52 |
#include <boost/exception/info.hpp> |
3044 |
09 Jun 13 |
peter |
53 |
#include <boost/exception/diagnostic_information.hpp> |
3044 |
09 Jun 13 |
peter |
54 |
#include <boost/exception/detail/type_info.hpp> |
3044 |
09 Jun 13 |
peter |
55 |
#include <boost/shared_ptr.hpp> |
3044 |
09 Jun 13 |
peter |
56 |
#include <stdexcept> |
3044 |
09 Jun 13 |
peter |
57 |
#include <new> |
3044 |
09 Jun 13 |
peter |
58 |
#include <ios> |
3044 |
09 Jun 13 |
peter |
59 |
|
3044 |
09 Jun 13 |
peter |
60 |
namespace |
3044 |
09 Jun 13 |
peter |
61 |
boost |
3044 |
09 Jun 13 |
peter |
62 |
{ |
3044 |
09 Jun 13 |
peter |
63 |
#ifndef BOOST_NO_RTTI |
3044 |
09 Jun 13 |
peter |
64 |
typedef error_info<struct tag_original_exception_type,std::type_info const *> original_exception_type; |
3044 |
09 Jun 13 |
peter |
65 |
|
3044 |
09 Jun 13 |
peter |
66 |
inline |
3044 |
09 Jun 13 |
peter |
67 |
std::string |
3044 |
09 Jun 13 |
peter |
68 |
to_string( original_exception_type const & x ) |
3044 |
09 Jun 13 |
peter |
69 |
{ |
3044 |
09 Jun 13 |
peter |
70 |
return x.value()->name(); |
3044 |
09 Jun 13 |
peter |
71 |
} |
3044 |
09 Jun 13 |
peter |
72 |
#endif |
3044 |
09 Jun 13 |
peter |
73 |
|
3044 |
09 Jun 13 |
peter |
74 |
class exception_ptr; |
3044 |
09 Jun 13 |
peter |
75 |
exception_ptr current_exception(); |
3044 |
09 Jun 13 |
peter |
76 |
void rethrow_exception( exception_ptr const & ); |
3044 |
09 Jun 13 |
peter |
77 |
|
3044 |
09 Jun 13 |
peter |
78 |
class |
3044 |
09 Jun 13 |
peter |
79 |
exception_ptr: |
3044 |
09 Jun 13 |
peter |
80 |
public exception_detail::exception_ptr_base |
3044 |
09 Jun 13 |
peter |
81 |
{ |
3044 |
09 Jun 13 |
peter |
82 |
typedef bool exception_ptr::*unspecified_bool_type; |
3044 |
09 Jun 13 |
peter |
83 |
friend exception_ptr current_exception(); |
3044 |
09 Jun 13 |
peter |
84 |
friend void rethrow_exception( exception_ptr const & ); |
3044 |
09 Jun 13 |
peter |
85 |
|
3044 |
09 Jun 13 |
peter |
86 |
shared_ptr<exception_detail::clone_base const> c_; |
3044 |
09 Jun 13 |
peter |
87 |
bool bad_alloc_; |
3044 |
09 Jun 13 |
peter |
88 |
|
3044 |
09 Jun 13 |
peter |
89 |
struct |
3044 |
09 Jun 13 |
peter |
90 |
bad_alloc_tag |
3044 |
09 Jun 13 |
peter |
91 |
{ |
3044 |
09 Jun 13 |
peter |
92 |
}; |
3044 |
09 Jun 13 |
peter |
93 |
|
3044 |
09 Jun 13 |
peter |
94 |
explicit |
3044 |
09 Jun 13 |
peter |
95 |
exception_ptr( bad_alloc_tag ): |
3044 |
09 Jun 13 |
peter |
96 |
bad_alloc_(true) |
3044 |
09 Jun 13 |
peter |
97 |
{ |
3044 |
09 Jun 13 |
peter |
98 |
} |
3044 |
09 Jun 13 |
peter |
99 |
|
3044 |
09 Jun 13 |
peter |
100 |
explicit |
3044 |
09 Jun 13 |
peter |
101 |
exception_ptr( shared_ptr<exception_detail::clone_base const> const & c ): |
3044 |
09 Jun 13 |
peter |
102 |
c_(c), |
3044 |
09 Jun 13 |
peter |
103 |
bad_alloc_(false) |
3044 |
09 Jun 13 |
peter |
104 |
{ |
3044 |
09 Jun 13 |
peter |
105 |
BOOST_ASSERT(c); |
3044 |
09 Jun 13 |
peter |
106 |
} |
3044 |
09 Jun 13 |
peter |
107 |
|
3044 |
09 Jun 13 |
peter |
108 |
void |
3044 |
09 Jun 13 |
peter |
109 |
_rethrow() const |
3044 |
09 Jun 13 |
peter |
110 |
{ |
3044 |
09 Jun 13 |
peter |
111 |
BOOST_ASSERT(*this); |
3044 |
09 Jun 13 |
peter |
112 |
if( bad_alloc_ ) |
3044 |
09 Jun 13 |
peter |
113 |
throw enable_current_exception(std::bad_alloc()); |
3044 |
09 Jun 13 |
peter |
114 |
else |
3044 |
09 Jun 13 |
peter |
115 |
c_->rethrow(); |
3044 |
09 Jun 13 |
peter |
116 |
} |
3044 |
09 Jun 13 |
peter |
117 |
|
3044 |
09 Jun 13 |
peter |
118 |
bool |
3044 |
09 Jun 13 |
peter |
119 |
_empty() const |
3044 |
09 Jun 13 |
peter |
120 |
{ |
3044 |
09 Jun 13 |
peter |
121 |
return !bad_alloc_ && !c_; |
3044 |
09 Jun 13 |
peter |
122 |
} |
3044 |
09 Jun 13 |
peter |
123 |
|
3044 |
09 Jun 13 |
peter |
124 |
public: |
3044 |
09 Jun 13 |
peter |
125 |
|
3044 |
09 Jun 13 |
peter |
126 |
exception_ptr(): |
3044 |
09 Jun 13 |
peter |
127 |
bad_alloc_(false) |
3044 |
09 Jun 13 |
peter |
128 |
{ |
3044 |
09 Jun 13 |
peter |
129 |
} |
3044 |
09 Jun 13 |
peter |
130 |
|
3045 |
09 Jun 13 |
peter |
131 |
~exception_ptr() throw() { } |
3045 |
09 Jun 13 |
peter |
132 |
|
3044 |
09 Jun 13 |
peter |
133 |
operator unspecified_bool_type() const |
3044 |
09 Jun 13 |
peter |
134 |
{ |
3044 |
09 Jun 13 |
peter |
135 |
return _empty() ? 0 : &exception_ptr::bad_alloc_; |
3044 |
09 Jun 13 |
peter |
136 |
} |
3044 |
09 Jun 13 |
peter |
137 |
|
3044 |
09 Jun 13 |
peter |
138 |
friend |
3044 |
09 Jun 13 |
peter |
139 |
bool |
3044 |
09 Jun 13 |
peter |
140 |
operator==( exception_ptr const & a, exception_ptr const & b ) |
3044 |
09 Jun 13 |
peter |
141 |
{ |
3044 |
09 Jun 13 |
peter |
142 |
return a.c_==b.c_ && a.bad_alloc_==b.bad_alloc_; |
3044 |
09 Jun 13 |
peter |
143 |
} |
3044 |
09 Jun 13 |
peter |
144 |
|
3044 |
09 Jun 13 |
peter |
145 |
friend |
3044 |
09 Jun 13 |
peter |
146 |
bool |
3044 |
09 Jun 13 |
peter |
147 |
operator!=( exception_ptr const & a, exception_ptr const & b ) |
3044 |
09 Jun 13 |
peter |
148 |
{ |
3044 |
09 Jun 13 |
peter |
149 |
return !(a==b); |
3044 |
09 Jun 13 |
peter |
150 |
} |
3044 |
09 Jun 13 |
peter |
151 |
}; |
3044 |
09 Jun 13 |
peter |
152 |
|
3044 |
09 Jun 13 |
peter |
153 |
class |
3044 |
09 Jun 13 |
peter |
154 |
unknown_exception: |
3044 |
09 Jun 13 |
peter |
155 |
public exception, |
3044 |
09 Jun 13 |
peter |
156 |
public std::exception, |
3044 |
09 Jun 13 |
peter |
157 |
public exception_detail::clone_base |
3044 |
09 Jun 13 |
peter |
158 |
{ |
3044 |
09 Jun 13 |
peter |
159 |
public: |
3044 |
09 Jun 13 |
peter |
160 |
|
3044 |
09 Jun 13 |
peter |
161 |
unknown_exception() |
3044 |
09 Jun 13 |
peter |
162 |
{ |
3044 |
09 Jun 13 |
peter |
163 |
} |
3044 |
09 Jun 13 |
peter |
164 |
|
3044 |
09 Jun 13 |
peter |
165 |
explicit |
3044 |
09 Jun 13 |
peter |
166 |
unknown_exception( std::exception const & e ) |
3044 |
09 Jun 13 |
peter |
167 |
{ |
3044 |
09 Jun 13 |
peter |
168 |
add_original_type(e); |
3044 |
09 Jun 13 |
peter |
169 |
} |
3044 |
09 Jun 13 |
peter |
170 |
|
3044 |
09 Jun 13 |
peter |
171 |
explicit |
3044 |
09 Jun 13 |
peter |
172 |
unknown_exception( boost::exception const & e ): |
3044 |
09 Jun 13 |
peter |
173 |
boost::exception(e) |
3044 |
09 Jun 13 |
peter |
174 |
{ |
3044 |
09 Jun 13 |
peter |
175 |
add_original_type(e); |
3044 |
09 Jun 13 |
peter |
176 |
} |
3044 |
09 Jun 13 |
peter |
177 |
|
3044 |
09 Jun 13 |
peter |
178 |
~unknown_exception() throw() |
3044 |
09 Jun 13 |
peter |
179 |
{ |
3044 |
09 Jun 13 |
peter |
180 |
} |
3044 |
09 Jun 13 |
peter |
181 |
|
3044 |
09 Jun 13 |
peter |
182 |
private: |
3044 |
09 Jun 13 |
peter |
183 |
|
3044 |
09 Jun 13 |
peter |
184 |
exception_detail::clone_base const * |
3044 |
09 Jun 13 |
peter |
185 |
clone() const |
3044 |
09 Jun 13 |
peter |
186 |
{ |
3044 |
09 Jun 13 |
peter |
187 |
return new unknown_exception(*this); |
3044 |
09 Jun 13 |
peter |
188 |
} |
3044 |
09 Jun 13 |
peter |
189 |
|
3044 |
09 Jun 13 |
peter |
190 |
void |
3044 |
09 Jun 13 |
peter |
191 |
rethrow() const |
3044 |
09 Jun 13 |
peter |
192 |
{ |
3044 |
09 Jun 13 |
peter |
193 |
throw*this; |
3044 |
09 Jun 13 |
peter |
194 |
} |
3044 |
09 Jun 13 |
peter |
195 |
|
3044 |
09 Jun 13 |
peter |
196 |
template <class E> |
3044 |
09 Jun 13 |
peter |
197 |
void |
3044 |
09 Jun 13 |
peter |
198 |
add_original_type( E const & e ) |
3044 |
09 Jun 13 |
peter |
199 |
{ |
3044 |
09 Jun 13 |
peter |
200 |
#ifndef BOOST_NO_RTTI |
3044 |
09 Jun 13 |
peter |
201 |
(*this) << original_exception_type(&typeid(e)); |
3044 |
09 Jun 13 |
peter |
202 |
#endif |
3044 |
09 Jun 13 |
peter |
203 |
} |
3044 |
09 Jun 13 |
peter |
204 |
}; |
3044 |
09 Jun 13 |
peter |
205 |
|
3044 |
09 Jun 13 |
peter |
206 |
namespace |
3044 |
09 Jun 13 |
peter |
207 |
exception_detail |
3044 |
09 Jun 13 |
peter |
208 |
{ |
3044 |
09 Jun 13 |
peter |
209 |
template <class T> |
3044 |
09 Jun 13 |
peter |
210 |
class |
3044 |
09 Jun 13 |
peter |
211 |
current_exception_std_exception_wrapper: |
3044 |
09 Jun 13 |
peter |
212 |
public T, |
3044 |
09 Jun 13 |
peter |
213 |
public boost::exception, |
3044 |
09 Jun 13 |
peter |
214 |
public clone_base |
3044 |
09 Jun 13 |
peter |
215 |
{ |
3044 |
09 Jun 13 |
peter |
216 |
public: |
3044 |
09 Jun 13 |
peter |
217 |
|
3044 |
09 Jun 13 |
peter |
218 |
explicit |
3044 |
09 Jun 13 |
peter |
219 |
current_exception_std_exception_wrapper( T const & e1 ): |
3044 |
09 Jun 13 |
peter |
220 |
T(e1) |
3044 |
09 Jun 13 |
peter |
221 |
{ |
3044 |
09 Jun 13 |
peter |
222 |
add_original_type(e1); |
3044 |
09 Jun 13 |
peter |
223 |
} |
3044 |
09 Jun 13 |
peter |
224 |
|
3044 |
09 Jun 13 |
peter |
225 |
current_exception_std_exception_wrapper( T const & e1, boost::exception const & e2 ): |
3044 |
09 Jun 13 |
peter |
226 |
T(e1), |
3044 |
09 Jun 13 |
peter |
227 |
boost::exception(e2) |
3044 |
09 Jun 13 |
peter |
228 |
{ |
3044 |
09 Jun 13 |
peter |
229 |
add_original_type(e1); |
3044 |
09 Jun 13 |
peter |
230 |
} |
3044 |
09 Jun 13 |
peter |
231 |
|
3044 |
09 Jun 13 |
peter |
232 |
~current_exception_std_exception_wrapper() throw() |
3044 |
09 Jun 13 |
peter |
233 |
{ |
3044 |
09 Jun 13 |
peter |
234 |
} |
3044 |
09 Jun 13 |
peter |
235 |
|
3044 |
09 Jun 13 |
peter |
236 |
private: |
3044 |
09 Jun 13 |
peter |
237 |
|
3044 |
09 Jun 13 |
peter |
238 |
clone_base const * |
3044 |
09 Jun 13 |
peter |
239 |
clone() const |
3044 |
09 Jun 13 |
peter |
240 |
{ |
3044 |
09 Jun 13 |
peter |
241 |
return new current_exception_std_exception_wrapper(*this); |
3044 |
09 Jun 13 |
peter |
242 |
} |
3044 |
09 Jun 13 |
peter |
243 |
|
3044 |
09 Jun 13 |
peter |
244 |
void |
3044 |
09 Jun 13 |
peter |
245 |
rethrow() const |
3044 |
09 Jun 13 |
peter |
246 |
{ |
3044 |
09 Jun 13 |
peter |
247 |
throw *this; |
3044 |
09 Jun 13 |
peter |
248 |
} |
3044 |
09 Jun 13 |
peter |
249 |
|
3044 |
09 Jun 13 |
peter |
250 |
template <class E> |
3044 |
09 Jun 13 |
peter |
251 |
void |
3044 |
09 Jun 13 |
peter |
252 |
add_original_type( E const & e ) |
3044 |
09 Jun 13 |
peter |
253 |
{ |
3044 |
09 Jun 13 |
peter |
254 |
#ifndef BOOST_NO_RTTI |
3044 |
09 Jun 13 |
peter |
255 |
(*this) << original_exception_type(&typeid(e)); |
3044 |
09 Jun 13 |
peter |
256 |
#endif |
3044 |
09 Jun 13 |
peter |
257 |
} |
3044 |
09 Jun 13 |
peter |
258 |
}; |
3044 |
09 Jun 13 |
peter |
259 |
|
3044 |
09 Jun 13 |
peter |
260 |
#ifdef BOOST_NO_RTTI |
3044 |
09 Jun 13 |
peter |
261 |
template <class T> |
3044 |
09 Jun 13 |
peter |
262 |
exception const * |
3044 |
09 Jun 13 |
peter |
263 |
get_boost_exception( T const * ) |
3044 |
09 Jun 13 |
peter |
264 |
{ |
3044 |
09 Jun 13 |
peter |
265 |
try |
3044 |
09 Jun 13 |
peter |
266 |
{ |
3044 |
09 Jun 13 |
peter |
267 |
throw; |
3044 |
09 Jun 13 |
peter |
268 |
} |
3044 |
09 Jun 13 |
peter |
269 |
catch( |
3044 |
09 Jun 13 |
peter |
270 |
exception & x ) |
3044 |
09 Jun 13 |
peter |
271 |
{ |
3044 |
09 Jun 13 |
peter |
272 |
return &x; |
3044 |
09 Jun 13 |
peter |
273 |
} |
3044 |
09 Jun 13 |
peter |
274 |
catch(...) |
3044 |
09 Jun 13 |
peter |
275 |
{ |
3044 |
09 Jun 13 |
peter |
276 |
return 0; |
3044 |
09 Jun 13 |
peter |
277 |
} |
3044 |
09 Jun 13 |
peter |
278 |
} |
3044 |
09 Jun 13 |
peter |
279 |
#else |
3044 |
09 Jun 13 |
peter |
280 |
template <class T> |
3044 |
09 Jun 13 |
peter |
281 |
exception const * |
3044 |
09 Jun 13 |
peter |
282 |
get_boost_exception( T const * x ) |
3044 |
09 Jun 13 |
peter |
283 |
{ |
3044 |
09 Jun 13 |
peter |
284 |
return dynamic_cast<exception const *>(x); |
3044 |
09 Jun 13 |
peter |
285 |
} |
3044 |
09 Jun 13 |
peter |
286 |
#endif |
3044 |
09 Jun 13 |
peter |
287 |
|
3044 |
09 Jun 13 |
peter |
288 |
template <class T> |
3044 |
09 Jun 13 |
peter |
289 |
inline |
3044 |
09 Jun 13 |
peter |
290 |
shared_ptr<clone_base const> |
3044 |
09 Jun 13 |
peter |
291 |
current_exception_std_exception( T const & e1 ) |
3044 |
09 Jun 13 |
peter |
292 |
{ |
3044 |
09 Jun 13 |
peter |
293 |
if( boost::exception const * e2 = get_boost_exception(&e1) ) |
3044 |
09 Jun 13 |
peter |
294 |
return shared_ptr<current_exception_std_exception_wrapper<T> const>(new current_exception_std_exception_wrapper<T>(e1,*e2)); |
3044 |
09 Jun 13 |
peter |
295 |
else |
3044 |
09 Jun 13 |
peter |
296 |
return shared_ptr<current_exception_std_exception_wrapper<T> const>(new current_exception_std_exception_wrapper<T>(e1)); |
3044 |
09 Jun 13 |
peter |
297 |
} |
3044 |
09 Jun 13 |
peter |
298 |
|
3044 |
09 Jun 13 |
peter |
299 |
inline |
3044 |
09 Jun 13 |
peter |
300 |
shared_ptr<clone_base const> |
3044 |
09 Jun 13 |
peter |
301 |
current_exception_unknown_exception() |
3044 |
09 Jun 13 |
peter |
302 |
{ |
3044 |
09 Jun 13 |
peter |
303 |
return shared_ptr<unknown_exception const>(new unknown_exception()); |
3044 |
09 Jun 13 |
peter |
304 |
} |
3044 |
09 Jun 13 |
peter |
305 |
|
3044 |
09 Jun 13 |
peter |
306 |
inline |
3044 |
09 Jun 13 |
peter |
307 |
shared_ptr<clone_base const> |
3044 |
09 Jun 13 |
peter |
308 |
current_exception_unknown_boost_exception( boost::exception const & e ) |
3044 |
09 Jun 13 |
peter |
309 |
{ |
3044 |
09 Jun 13 |
peter |
310 |
return shared_ptr<unknown_exception const>(new unknown_exception(e)); |
3044 |
09 Jun 13 |
peter |
311 |
} |
3044 |
09 Jun 13 |
peter |
312 |
|
3044 |
09 Jun 13 |
peter |
313 |
inline |
3044 |
09 Jun 13 |
peter |
314 |
shared_ptr<clone_base const> |
3044 |
09 Jun 13 |
peter |
315 |
current_exception_unknown_std_exception( std::exception const & e ) |
3044 |
09 Jun 13 |
peter |
316 |
{ |
3044 |
09 Jun 13 |
peter |
317 |
if( boost::exception const * be = get_boost_exception(&e) ) |
3044 |
09 Jun 13 |
peter |
318 |
return current_exception_unknown_boost_exception(*be); |
3044 |
09 Jun 13 |
peter |
319 |
else |
3044 |
09 Jun 13 |
peter |
320 |
return shared_ptr<unknown_exception const>(new unknown_exception(e)); |
3044 |
09 Jun 13 |
peter |
321 |
} |
3044 |
09 Jun 13 |
peter |
322 |
|
3044 |
09 Jun 13 |
peter |
323 |
inline |
3044 |
09 Jun 13 |
peter |
324 |
shared_ptr<clone_base const> |
3044 |
09 Jun 13 |
peter |
325 |
current_exception_impl() |
3044 |
09 Jun 13 |
peter |
326 |
{ |
3044 |
09 Jun 13 |
peter |
327 |
try |
3044 |
09 Jun 13 |
peter |
328 |
{ |
3044 |
09 Jun 13 |
peter |
329 |
throw; |
3044 |
09 Jun 13 |
peter |
330 |
} |
3044 |
09 Jun 13 |
peter |
331 |
catch( |
3044 |
09 Jun 13 |
peter |
332 |
exception_detail::clone_base & e ) |
3044 |
09 Jun 13 |
peter |
333 |
{ |
3044 |
09 Jun 13 |
peter |
334 |
return shared_ptr<exception_detail::clone_base const>(e.clone()); |
3044 |
09 Jun 13 |
peter |
335 |
} |
3044 |
09 Jun 13 |
peter |
336 |
catch( |
3044 |
09 Jun 13 |
peter |
337 |
std::domain_error & e ) |
3044 |
09 Jun 13 |
peter |
338 |
{ |
3044 |
09 Jun 13 |
peter |
339 |
return exception_detail::current_exception_std_exception(e); |
3044 |
09 Jun 13 |
peter |
340 |
} |
3044 |
09 Jun 13 |
peter |
341 |
catch( |
3044 |
09 Jun 13 |
peter |
342 |
std::invalid_argument & e ) |
3044 |
09 Jun 13 |
peter |
343 |
{ |
3044 |
09 Jun 13 |
peter |
344 |
return exception_detail::current_exception_std_exception(e); |
3044 |
09 Jun 13 |
peter |
345 |
} |
3044 |
09 Jun 13 |
peter |
346 |
catch( |
3044 |
09 Jun 13 |
peter |
347 |
std::length_error & e ) |
3044 |
09 Jun 13 |
peter |
348 |
{ |
3044 |
09 Jun 13 |
peter |
349 |
return exception_detail::current_exception_std_exception(e); |
3044 |
09 Jun 13 |
peter |
350 |
} |
3044 |
09 Jun 13 |
peter |
351 |
catch( |
3044 |
09 Jun 13 |
peter |
352 |
std::out_of_range & e ) |
3044 |
09 Jun 13 |
peter |
353 |
{ |
3044 |
09 Jun 13 |
peter |
354 |
return exception_detail::current_exception_std_exception(e); |
3044 |
09 Jun 13 |
peter |
355 |
} |
3044 |
09 Jun 13 |
peter |
356 |
catch( |
3044 |
09 Jun 13 |
peter |
357 |
std::logic_error & e ) |
3044 |
09 Jun 13 |
peter |
358 |
{ |
3044 |
09 Jun 13 |
peter |
359 |
return exception_detail::current_exception_std_exception(e); |
3044 |
09 Jun 13 |
peter |
360 |
} |
3044 |
09 Jun 13 |
peter |
361 |
catch( |
3044 |
09 Jun 13 |
peter |
362 |
std::range_error & e ) |
3044 |
09 Jun 13 |
peter |
363 |
{ |
3044 |
09 Jun 13 |
peter |
364 |
return exception_detail::current_exception_std_exception(e); |
3044 |
09 Jun 13 |
peter |
365 |
} |
3044 |
09 Jun 13 |
peter |
366 |
catch( |
3044 |
09 Jun 13 |
peter |
367 |
std::overflow_error & e ) |
3044 |
09 Jun 13 |
peter |
368 |
{ |
3044 |
09 Jun 13 |
peter |
369 |
return exception_detail::current_exception_std_exception(e); |
3044 |
09 Jun 13 |
peter |
370 |
} |
3044 |
09 Jun 13 |
peter |
371 |
catch( |
3044 |
09 Jun 13 |
peter |
372 |
std::underflow_error & e ) |
3044 |
09 Jun 13 |
peter |
373 |
{ |
3044 |
09 Jun 13 |
peter |
374 |
return exception_detail::current_exception_std_exception(e); |
3044 |
09 Jun 13 |
peter |
375 |
} |
3044 |
09 Jun 13 |
peter |
376 |
catch( |
3044 |
09 Jun 13 |
peter |
377 |
std::ios_base::failure & e ) |
3044 |
09 Jun 13 |
peter |
378 |
{ |
3044 |
09 Jun 13 |
peter |
379 |
return exception_detail::current_exception_std_exception(e); |
3044 |
09 Jun 13 |
peter |
380 |
} |
3044 |
09 Jun 13 |
peter |
381 |
catch( |
3044 |
09 Jun 13 |
peter |
382 |
std::runtime_error & e ) |
3044 |
09 Jun 13 |
peter |
383 |
{ |
3044 |
09 Jun 13 |
peter |
384 |
return exception_detail::current_exception_std_exception(e); |
3044 |
09 Jun 13 |
peter |
385 |
} |
3044 |
09 Jun 13 |
peter |
386 |
catch( |
3044 |
09 Jun 13 |
peter |
387 |
std::bad_alloc & e ) |
3044 |
09 Jun 13 |
peter |
388 |
{ |
3044 |
09 Jun 13 |
peter |
389 |
return exception_detail::current_exception_std_exception(e); |
3044 |
09 Jun 13 |
peter |
390 |
} |
3044 |
09 Jun 13 |
peter |
391 |
#ifndef BOOST_NO_TYPEID |
3044 |
09 Jun 13 |
peter |
392 |
catch( |
3044 |
09 Jun 13 |
peter |
393 |
std::bad_cast & e ) |
3044 |
09 Jun 13 |
peter |
394 |
{ |
3044 |
09 Jun 13 |
peter |
395 |
return exception_detail::current_exception_std_exception(e); |
3044 |
09 Jun 13 |
peter |
396 |
} |
3044 |
09 Jun 13 |
peter |
397 |
catch( |
3044 |
09 Jun 13 |
peter |
398 |
std::bad_typeid & e ) |
3044 |
09 Jun 13 |
peter |
399 |
{ |
3044 |
09 Jun 13 |
peter |
400 |
return exception_detail::current_exception_std_exception(e); |
3044 |
09 Jun 13 |
peter |
401 |
} |
3044 |
09 Jun 13 |
peter |
402 |
#endif |
3044 |
09 Jun 13 |
peter |
403 |
catch( |
3044 |
09 Jun 13 |
peter |
404 |
std::bad_exception & e ) |
3044 |
09 Jun 13 |
peter |
405 |
{ |
3044 |
09 Jun 13 |
peter |
406 |
return exception_detail::current_exception_std_exception(e); |
3044 |
09 Jun 13 |
peter |
407 |
} |
3044 |
09 Jun 13 |
peter |
408 |
catch( |
3044 |
09 Jun 13 |
peter |
409 |
std::exception & e ) |
3044 |
09 Jun 13 |
peter |
410 |
{ |
3044 |
09 Jun 13 |
peter |
411 |
return exception_detail::current_exception_unknown_std_exception(e); |
3044 |
09 Jun 13 |
peter |
412 |
} |
3044 |
09 Jun 13 |
peter |
413 |
catch( |
3044 |
09 Jun 13 |
peter |
414 |
boost::exception & e ) |
3044 |
09 Jun 13 |
peter |
415 |
{ |
3044 |
09 Jun 13 |
peter |
416 |
return exception_detail::current_exception_unknown_boost_exception(e); |
3044 |
09 Jun 13 |
peter |
417 |
} |
3044 |
09 Jun 13 |
peter |
418 |
catch( |
3044 |
09 Jun 13 |
peter |
419 |
... ) |
3044 |
09 Jun 13 |
peter |
420 |
{ |
3044 |
09 Jun 13 |
peter |
421 |
return exception_detail::current_exception_unknown_exception(); |
3044 |
09 Jun 13 |
peter |
422 |
} |
3044 |
09 Jun 13 |
peter |
423 |
} |
3044 |
09 Jun 13 |
peter |
424 |
} |
3044 |
09 Jun 13 |
peter |
425 |
|
3044 |
09 Jun 13 |
peter |
426 |
inline |
3044 |
09 Jun 13 |
peter |
427 |
exception_ptr |
3044 |
09 Jun 13 |
peter |
428 |
current_exception() |
3044 |
09 Jun 13 |
peter |
429 |
{ |
3044 |
09 Jun 13 |
peter |
430 |
try |
3044 |
09 Jun 13 |
peter |
431 |
{ |
3044 |
09 Jun 13 |
peter |
432 |
return exception_ptr(exception_detail::current_exception_impl()); |
3044 |
09 Jun 13 |
peter |
433 |
} |
3044 |
09 Jun 13 |
peter |
434 |
catch( |
3044 |
09 Jun 13 |
peter |
435 |
std::bad_alloc & ) |
3044 |
09 Jun 13 |
peter |
436 |
{ |
3044 |
09 Jun 13 |
peter |
437 |
} |
3044 |
09 Jun 13 |
peter |
438 |
catch( |
3044 |
09 Jun 13 |
peter |
439 |
... ) |
3044 |
09 Jun 13 |
peter |
440 |
{ |
3044 |
09 Jun 13 |
peter |
441 |
try |
3044 |
09 Jun 13 |
peter |
442 |
{ |
3044 |
09 Jun 13 |
peter |
443 |
return exception_ptr(exception_detail::current_exception_std_exception(std::bad_exception())); |
3044 |
09 Jun 13 |
peter |
444 |
} |
3044 |
09 Jun 13 |
peter |
445 |
catch( |
3044 |
09 Jun 13 |
peter |
446 |
std::bad_alloc & ) |
3044 |
09 Jun 13 |
peter |
447 |
{ |
3044 |
09 Jun 13 |
peter |
448 |
} |
3044 |
09 Jun 13 |
peter |
449 |
catch( |
3044 |
09 Jun 13 |
peter |
450 |
... ) |
3044 |
09 Jun 13 |
peter |
451 |
{ |
3044 |
09 Jun 13 |
peter |
452 |
BOOST_ASSERT(0); |
3044 |
09 Jun 13 |
peter |
453 |
} |
3044 |
09 Jun 13 |
peter |
454 |
} |
3044 |
09 Jun 13 |
peter |
455 |
return exception_ptr(exception_ptr::bad_alloc_tag()); |
3044 |
09 Jun 13 |
peter |
456 |
} |
3044 |
09 Jun 13 |
peter |
457 |
|
3044 |
09 Jun 13 |
peter |
458 |
template <class T> |
3044 |
09 Jun 13 |
peter |
459 |
inline |
3044 |
09 Jun 13 |
peter |
460 |
exception_ptr |
3044 |
09 Jun 13 |
peter |
461 |
copy_exception( T const & e ) |
3044 |
09 Jun 13 |
peter |
462 |
{ |
3044 |
09 Jun 13 |
peter |
463 |
try |
3044 |
09 Jun 13 |
peter |
464 |
{ |
3044 |
09 Jun 13 |
peter |
465 |
throw enable_current_exception(e); |
3044 |
09 Jun 13 |
peter |
466 |
} |
3044 |
09 Jun 13 |
peter |
467 |
catch( |
3044 |
09 Jun 13 |
peter |
468 |
... ) |
3044 |
09 Jun 13 |
peter |
469 |
{ |
3044 |
09 Jun 13 |
peter |
470 |
return current_exception(); |
3044 |
09 Jun 13 |
peter |
471 |
} |
3044 |
09 Jun 13 |
peter |
472 |
} |
3044 |
09 Jun 13 |
peter |
473 |
|
3044 |
09 Jun 13 |
peter |
474 |
inline |
3044 |
09 Jun 13 |
peter |
475 |
void |
3044 |
09 Jun 13 |
peter |
476 |
rethrow_exception( exception_ptr const & p ) |
3044 |
09 Jun 13 |
peter |
477 |
{ |
3044 |
09 Jun 13 |
peter |
478 |
p._rethrow(); |
3044 |
09 Jun 13 |
peter |
479 |
} |
3044 |
09 Jun 13 |
peter |
480 |
|
3044 |
09 Jun 13 |
peter |
481 |
inline |
3044 |
09 Jun 13 |
peter |
482 |
std::string |
3044 |
09 Jun 13 |
peter |
483 |
to_string( exception_ptr const & p ) |
3044 |
09 Jun 13 |
peter |
484 |
{ |
3044 |
09 Jun 13 |
peter |
485 |
std::string s='\n'+diagnostic_information(p); |
3044 |
09 Jun 13 |
peter |
486 |
std::string padding(" "); |
3044 |
09 Jun 13 |
peter |
487 |
std::string r; |
3044 |
09 Jun 13 |
peter |
488 |
bool f=false; |
3044 |
09 Jun 13 |
peter |
489 |
for( std::string::const_iterator i=s.begin(),e=s.end(); i!=e; ++i ) |
3044 |
09 Jun 13 |
peter |
490 |
{ |
3044 |
09 Jun 13 |
peter |
491 |
if( f ) |
3044 |
09 Jun 13 |
peter |
492 |
r+=padding; |
3044 |
09 Jun 13 |
peter |
493 |
char c=*i; |
3044 |
09 Jun 13 |
peter |
494 |
r+=c; |
3044 |
09 Jun 13 |
peter |
495 |
f=(c=='\n'); |
3044 |
09 Jun 13 |
peter |
496 |
} |
3044 |
09 Jun 13 |
peter |
497 |
return r; |
3044 |
09 Jun 13 |
peter |
498 |
} |
3044 |
09 Jun 13 |
peter |
499 |
} |
3044 |
09 Jun 13 |
peter |
500 |
|
3044 |
09 Jun 13 |
peter |
501 |
#endif |
3045 |
09 Jun 13 |
peter |
502 |
#endif |
3045 |
09 Jun 13 |
peter |
/// \endcond IGNORE_DOXYGEN |
3045 |
09 Jun 13 |
peter |
504 |
#endif |