yat/utility/boost_exception_ptr.h

Code
Comments
Other
Rev Date Author Line
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 3 // $Id$
3045 09 Jun 13 peter 4
3045 09 Jun 13 peter 5 /*
3045 09 Jun 13 peter 6   Copyright (C) 2013 Peter Johansson
3045 09 Jun 13 peter 7
3045 09 Jun 13 peter 8   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 10   The yat library is free software; you can redistribute it and/or
3045 09 Jun 13 peter 11   modify it under the terms of the GNU General Public License as
3045 09 Jun 13 peter 12   published by the Free Software Foundation; either version 3 of the
3045 09 Jun 13 peter 13   License, or (at your option) any later version.
3045 09 Jun 13 peter 14
3045 09 Jun 13 peter 15   The yat library is distributed in the hope that it will be useful,
3045 09 Jun 13 peter 16   but WITHOUT ANY WARRANTY; without even the implied warranty of
3045 09 Jun 13 peter 17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3045 09 Jun 13 peter 18   General Public License for more details.
3045 09 Jun 13 peter 19
3045 09 Jun 13 peter 20   You should have received a copy of the GNU General Public License
3045 09 Jun 13 peter 21   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 24 //Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
3044 09 Jun 13 peter 25
3044 09 Jun 13 peter 26 //Distributed under the Boost Software License, Version 1.0. (See accompanying
3044 09 Jun 13 peter 27 //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 29 // This file is patched version of the one distributed in Boost 1.41
3045 09 Jun 13 peter 30 // See ticket #762 http://dev.thep.lu.se/yat/ticket/762 for motivation.
3045 09 Jun 13 peter 31 // If compiler works with <boost/exception_ptr.hpp> that file is
3045 09 Jun 13 peter 32 // included; otherwise this patched version is included
3045 09 Jun 13 peter 33 //
3045 09 Jun 13 peter 34 // Users can include this file before any boost header to avoid the
3045 09 Jun 13 peter 35 // problem reported in: http://dev.thep.lu.se/yat/ticket/762
3045 09 Jun 13 peter 36
3045 09 Jun 13 peter 37 /// \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 503 /// \endcond IGNORE_DOXYGEN
3045 09 Jun 13 peter 504 #endif