1 //Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
\r
3 //Distributed under the Boost Software License, Version 1.0. (See accompanying
\r
4 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
\r
6 #ifndef UUID_618474C2DE1511DEB74A388C56D89593
\r
7 #define UUID_618474C2DE1511DEB74A388C56D89593
\r
8 #if defined(__GNUC__) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
\r
9 #pragma GCC system_header
\r
11 #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
\r
12 #pragma warning(push,1)
\r
15 #include <boost/config.hpp>
\r
16 #ifdef BOOST_NO_EXCEPTIONS
\r
17 #error This header requires exception handling to be enabled.
\r
19 #include <boost/exception/exception.hpp>
\r
20 #include <boost/exception/info.hpp>
\r
21 #include <boost/exception/diagnostic_information.hpp>
\r
22 #include <boost/exception/detail/type_info.hpp>
\r
23 #include <boost/shared_ptr.hpp>
\r
24 #include <stdexcept>
\r
31 #ifndef BOOST_NO_RTTI
\r
32 typedef error_info<struct tag_original_exception_type,std::type_info const *> original_exception_type;
\r
36 to_string( original_exception_type const & x )
\r
38 return x.value()->name();
\r
42 class exception_ptr;
\r
43 exception_ptr current_exception();
\r
44 void rethrow_exception( exception_ptr const & );
\r
49 typedef bool exception_ptr::*unspecified_bool_type;
\r
50 friend exception_ptr current_exception();
\r
51 friend void rethrow_exception( exception_ptr const & );
\r
53 shared_ptr<exception_detail::clone_base const> c_;
\r
62 exception_ptr( bad_alloc_tag ):
\r
68 exception_ptr( shared_ptr<exception_detail::clone_base const> const & c ):
\r
78 BOOST_ASSERT(*this);
\r
80 throw enable_current_exception(std::bad_alloc());
\r
88 return !bad_alloc_ && !c_;
\r
98 ~exception_ptr() throw()
\r
102 operator unspecified_bool_type() const
\r
104 return empty() ? 0 : &exception_ptr::bad_alloc_;
\r
109 operator==( exception_ptr const & a, exception_ptr const & b )
\r
111 return a.c_==b.c_ && a.bad_alloc_==b.bad_alloc_;
\r
116 operator!=( exception_ptr const & a, exception_ptr const & b )
\r
125 public std::exception,
\r
126 public exception_detail::clone_base
\r
130 unknown_exception()
\r
135 unknown_exception( std::exception const & e )
\r
137 add_original_type(e);
\r
141 unknown_exception( boost::exception const & e ):
\r
142 boost::exception(e)
\r
144 add_original_type(e);
\r
147 ~unknown_exception() throw()
\r
153 exception_detail::clone_base const *
\r
156 return new unknown_exception(*this);
\r
167 add_original_type( E const & e )
\r
169 #ifndef BOOST_NO_RTTI
\r
170 (*this) << original_exception_type(&typeid(e));
\r
180 current_exception_std_exception_wrapper:
\r
182 public boost::exception,
\r
188 current_exception_std_exception_wrapper( T const & e1 ):
\r
191 add_original_type(e1);
\r
194 current_exception_std_exception_wrapper( T const & e1, boost::exception const & e2 ):
\r
196 boost::exception(e2)
\r
198 add_original_type(e1);
\r
201 ~current_exception_std_exception_wrapper() throw()
\r
210 return new current_exception_std_exception_wrapper(*this);
\r
221 add_original_type( E const & e )
\r
223 #ifndef BOOST_NO_RTTI
\r
224 (*this) << original_exception_type(&typeid(e));
\r
229 #ifdef BOOST_NO_RTTI
\r
232 get_boost_exception( T const * )
\r
251 get_boost_exception( T const * x )
\r
253 return dynamic_cast<exception const *>(x);
\r
259 shared_ptr<clone_base const>
\r
260 current_exception_std_exception( T const & e1 )
\r
262 if( boost::exception const * e2 = get_boost_exception(&e1) )
\r
263 return shared_ptr<current_exception_std_exception_wrapper<T> const>(new current_exception_std_exception_wrapper<T>(e1,*e2));
\r
265 return shared_ptr<current_exception_std_exception_wrapper<T> const>(new current_exception_std_exception_wrapper<T>(e1));
\r
269 shared_ptr<clone_base const>
\r
270 current_exception_unknown_exception()
\r
272 return shared_ptr<unknown_exception const>(new unknown_exception());
\r
276 shared_ptr<clone_base const>
\r
277 current_exception_unknown_boost_exception( boost::exception const & e )
\r
279 return shared_ptr<unknown_exception const>(new unknown_exception(e));
\r
283 shared_ptr<clone_base const>
\r
284 current_exception_unknown_std_exception( std::exception const & e )
\r
286 if( boost::exception const * be = get_boost_exception(&e) )
\r
287 return current_exception_unknown_boost_exception(*be);
\r
289 return shared_ptr<unknown_exception const>(new unknown_exception(e));
\r
293 shared_ptr<clone_base const>
\r
294 current_exception_impl()
\r
301 exception_detail::clone_base & e )
\r
303 return shared_ptr<exception_detail::clone_base const>(e.clone());
\r
306 std::domain_error & e )
\r
308 return exception_detail::current_exception_std_exception(e);
\r
311 std::invalid_argument & e )
\r
313 return exception_detail::current_exception_std_exception(e);
\r
316 std::length_error & e )
\r
318 return exception_detail::current_exception_std_exception(e);
\r
321 std::out_of_range & e )
\r
323 return exception_detail::current_exception_std_exception(e);
\r
326 std::logic_error & e )
\r
328 return exception_detail::current_exception_std_exception(e);
\r
331 std::range_error & e )
\r
333 return exception_detail::current_exception_std_exception(e);
\r
336 std::overflow_error & e )
\r
338 return exception_detail::current_exception_std_exception(e);
\r
341 std::underflow_error & e )
\r
343 return exception_detail::current_exception_std_exception(e);
\r
346 std::ios_base::failure & e )
\r
348 return exception_detail::current_exception_std_exception(e);
\r
351 std::runtime_error & e )
\r
353 return exception_detail::current_exception_std_exception(e);
\r
356 std::bad_alloc & e )
\r
358 return exception_detail::current_exception_std_exception(e);
\r
360 #ifndef BOOST_NO_TYPEID
\r
362 std::bad_cast & e )
\r
364 return exception_detail::current_exception_std_exception(e);
\r
367 std::bad_typeid & e )
\r
369 return exception_detail::current_exception_std_exception(e);
\r
373 std::bad_exception & e )
\r
375 return exception_detail::current_exception_std_exception(e);
\r
378 std::exception & e )
\r
380 return exception_detail::current_exception_unknown_std_exception(e);
\r
383 boost::exception & e )
\r
385 return exception_detail::current_exception_unknown_boost_exception(e);
\r
390 return exception_detail::current_exception_unknown_exception();
\r
397 current_exception()
\r
401 return exception_ptr(exception_detail::current_exception_impl());
\r
412 return exception_ptr(exception_detail::current_exception_std_exception(std::bad_exception()));
\r
424 return exception_ptr(exception_ptr::bad_alloc_tag());
\r
430 copy_exception( T const & e )
\r
434 throw enable_current_exception(e);
\r
439 return current_exception();
\r
445 rethrow_exception( exception_ptr const & p )
\r
452 diagnostic_information( exception_ptr const & p )
\r
457 rethrow_exception(p);
\r
462 return current_exception_diagnostic_information();
\r
469 to_string( exception_ptr const & p )
\r
471 std::string s='\n'+diagnostic_information(p);
\r
472 std::string padding(" ");
\r
475 for( std::string::const_iterator i=s.begin(),e=s.end(); i!=e; ++i )
\r
487 #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
\r
488 #pragma warning(pop)
\r