1 //Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. 2 3 //Distributed under the Boost Software License, Version 1.0. (See accompanying 4 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5 6 #ifndef UUID_1A590226753311DD9E4CCF6156D89593 7 #define UUID_1A590226753311DD9E4CCF6156D89593 8 #if defined(__GNUC__) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) 9 #pragma GCC system_header 10 #endif 11 #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) 12 #pragma warning(push,1) 13 #endif 14 15 #include <boost/exception/exception.hpp> 16 #include <boost/exception/detail/error_info_impl.hpp> 17 #include <boost/exception/detail/type_info.hpp> 18 #include <boost/shared_ptr.hpp> 19 20 namespace 21 boost 22 { 23 namespace 24 exception_detail 25 { 26 template <class ErrorInfo> 27 struct 28 get_info 29 { 30 static 31 typename ErrorInfo::value_type * getboost::exception_detail::get_info32 get( exception const & x ) 33 { 34 if( exception_detail::error_info_container * c=x.data_.get() ) 35 if( shared_ptr<exception_detail::error_info_base> eib = c->get(BOOST_EXCEPTION_STATIC_TYPEID(ErrorInfo)) ) 36 { 37 #ifndef BOOST_NO_RTTI 38 BOOST_ASSERT( 0!=dynamic_cast<ErrorInfo *>(eib.get()) ); 39 #endif 40 ErrorInfo * w = static_cast<ErrorInfo *>(eib.get()); 41 return &w->value(); 42 } 43 return 0; 44 } 45 }; 46 47 template <> 48 struct 49 get_info<throw_function> 50 { 51 static 52 char const * * getboost::exception_detail::get_info53 get( exception const & x ) 54 { 55 return x.throw_function_ ? &x.throw_function_ : 0; 56 } 57 }; 58 59 template <> 60 struct 61 get_info<throw_file> 62 { 63 static 64 char const * * getboost::exception_detail::get_info65 get( exception const & x ) 66 { 67 return x.throw_file_ ? &x.throw_file_ : 0; 68 } 69 }; 70 71 template <> 72 struct 73 get_info<throw_line> 74 { 75 static 76 int * getboost::exception_detail::get_info77 get( exception const & x ) 78 { 79 return x.throw_line_!=-1 ? &x.throw_line_ : 0; 80 } 81 }; 82 83 template <class T,class R> 84 struct 85 get_error_info_return_type 86 { 87 typedef R * type; 88 }; 89 90 template <class T,class R> 91 struct 92 get_error_info_return_type<T const,R> 93 { 94 typedef R const * type; 95 }; 96 } 97 98 #ifdef BOOST_NO_RTTI 99 template <class ErrorInfo> 100 inline 101 typename ErrorInfo::value_type const * get_error_info(boost::exception const & x)102 get_error_info( boost::exception const & x ) 103 { 104 return exception_detail::get_info<ErrorInfo>::get(x); 105 } 106 template <class ErrorInfo> 107 inline 108 typename ErrorInfo::value_type * get_error_info(boost::exception & x)109 get_error_info( boost::exception & x ) 110 { 111 return exception_detail::get_info<ErrorInfo>::get(x); 112 } 113 #else 114 template <class ErrorInfo,class E> 115 inline 116 typename exception_detail::get_error_info_return_type<E,typename ErrorInfo::value_type>::type get_error_info(E & some_exception)117 get_error_info( E & some_exception ) 118 { 119 if( exception const * x = dynamic_cast<exception const *>(&some_exception) ) 120 return exception_detail::get_info<ErrorInfo>::get(*x); 121 else 122 return 0; 123 } 124 #endif 125 } 126 127 #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) 128 #pragma warning(pop) 129 #endif 130 #endif 131