]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/boost/throw_exception.hpp
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / boost / throw_exception.hpp
index 37b79b62010f4c75b4370cb7afa7befcd29e8b52..77d806e9bab21848556a2e42f5df04354062b046 100644 (file)
@@ -7,10 +7,9 @@
 # pragma once
 #endif
 
-//
 //  boost/throw_exception.hpp
 //
-//  Copyright (c) 2002, 2018, 2019 Peter Dimov
+//  Copyright (c) 2002, 2018-2022 Peter Dimov
 //  Copyright (c) 2008-2009 Emil Dotchevski and Reverge Studios, Inc.
 //
 //  Distributed under the Boost Software License, Version 1.0. (See
 //  http://www.boost.org/LICENSE_1_0.txt)
 //
 //  http://www.boost.org/libs/throw_exception
-//
 
+#include <boost/exception/exception.hpp>
 #include <boost/assert/source_location.hpp>
 #include <boost/config.hpp>
 #include <boost/config/workaround.hpp>
 #include <exception>
+#include <utility>
+#include <cstddef>
+#if !defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
+#include <type_traits>
+#endif
 
 #if !defined( BOOST_EXCEPTION_DISABLE ) && defined( BOOST_BORLANDC ) && BOOST_WORKAROUND( BOOST_BORLANDC, BOOST_TESTED_AT(0x593) )
 # define BOOST_EXCEPTION_DISABLE
 namespace boost
 {
 
-// All boost exceptions are required to derive from std::exception,
-// to ensure compatibility with BOOST_NO_EXCEPTIONS.
-
-inline void throw_exception_assert_compatibility( std::exception const & ) {}
-
-} // namespace boost
-
 #if defined( BOOST_NO_EXCEPTIONS )
 
-namespace boost
-{
-
 BOOST_NORETURN void throw_exception( std::exception const & e ); // user defined
 BOOST_NORETURN void throw_exception( std::exception const & e, boost::source_location const & loc ); // user defined
 
-} // namespace boost
-
-#elif defined( BOOST_EXCEPTION_DISABLE )
-
-namespace boost
-{
-
-template<class E> BOOST_NORETURN void throw_exception( E const & e )
-{
-    throw_exception_assert_compatibility( e );
-    throw e;
-}
-
-template<class E> BOOST_NORETURN void throw_exception( E const & e, boost::source_location const & )
-{
-    throw_exception_assert_compatibility( e );
-    throw e;
-}
-
-} // namespace boost
-
-#else // !defined( BOOST_NO_EXCEPTIONS ) && !defined( BOOST_EXCEPTION_DISABLE )
-
-#include <boost/exception/exception.hpp>
-
-namespace boost
-{
+#endif
 
 // boost::wrapexcept<E>
 
@@ -86,7 +54,7 @@ typedef char (&wrapexcept_s2)[ 2 ];
 template<class T> wrapexcept_s1 wrapexcept_is_convertible( T* );
 template<class T> wrapexcept_s2 wrapexcept_is_convertible( void* );
 
-template<class E, class B, int I = sizeof( wrapexcept_is_convertible<B>( static_cast< E* >( 0 ) ) ) > struct wrapexcept_add_base;
+template<class E, class B, std::size_t I = sizeof( wrapexcept_is_convertible<B>( static_cast< E* >( 0 ) ) ) > struct wrapexcept_add_base;
 
 template<class E, class B> struct wrapexcept_add_base<E, B, 1>
 {
@@ -138,6 +106,7 @@ public:
         set_info( *this, throw_file( loc.file_name() ) );
         set_info( *this, throw_line( loc.line() ) );
         set_info( *this, throw_function( loc.function_name() ) );
+        set_info( *this, throw_column( loc.column() ) );
     }
 
     virtual boost::exception_detail::clone_base const * clone() const BOOST_OVERRIDE
@@ -153,12 +122,43 @@ public:
 
     virtual void rethrow() const BOOST_OVERRIDE
     {
+#if defined( BOOST_NO_EXCEPTIONS )
+
+        boost::throw_exception( *this );
+
+#else
+
         throw *this;
+
+#endif
     }
 };
 
+// All boost exceptions are required to derive from std::exception,
+// to ensure compatibility with BOOST_NO_EXCEPTIONS.
+
+inline void throw_exception_assert_compatibility( std::exception const & ) {}
+
 // boost::throw_exception
 
+#if !defined( BOOST_NO_EXCEPTIONS )
+
+#if defined( BOOST_EXCEPTION_DISABLE )
+
+template<class E> BOOST_NORETURN void throw_exception( E const & e )
+{
+    throw_exception_assert_compatibility( e );
+    throw e;
+}
+
+template<class E> BOOST_NORETURN void throw_exception( E const & e, boost::source_location const & )
+{
+    throw_exception_assert_compatibility( e );
+    throw e;
+}
+
+#else // defined( BOOST_EXCEPTION_DISABLE )
+
 template<class E> BOOST_NORETURN void throw_exception( E const & e )
 {
     throw_exception_assert_compatibility( e );
@@ -171,12 +171,108 @@ template<class E> BOOST_NORETURN void throw_exception( E const & e, boost::sourc
     throw wrapexcept<E>( e, loc );
 }
 
-} // namespace boost
+#endif // defined( BOOST_EXCEPTION_DISABLE )
 
-#endif
+#endif // !defined( BOOST_NO_EXCEPTIONS )
+
+} // namespace boost
 
 // BOOST_THROW_EXCEPTION
 
 #define BOOST_THROW_EXCEPTION(x) ::boost::throw_exception(x, BOOST_CURRENT_LOCATION)
 
+namespace boost
+{
+
+// throw_with_location
+
+namespace detail
+{
+
+struct BOOST_SYMBOL_VISIBLE throw_location
+{
+    boost::source_location location_;
+
+    explicit throw_location( boost::source_location const & loc ): location_( loc )
+    {
+    }
+};
+
+template<class E> class BOOST_SYMBOL_VISIBLE with_throw_location: public E, public throw_location
+{
+public:
+
+    with_throw_location( E const & e, boost::source_location const & loc ): E( e ), throw_location( loc )
+    {
+    }
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+
+    with_throw_location( E && e, boost::source_location const & loc ): E( std::move( e ) ), throw_location( loc )
+    {
+    }
+
+#endif
+};
+
+} // namespace detail
+
+#if !defined(BOOST_NO_EXCEPTIONS)
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
+
+template<class E> BOOST_NORETURN void throw_with_location( E && e, boost::source_location const & loc = BOOST_CURRENT_LOCATION )
+{
+    throw_exception_assert_compatibility( e );
+    throw detail::with_throw_location<typename std::decay<E>::type>( std::forward<E>( e ), loc );
+}
+
+#else
+
+template<class E> BOOST_NORETURN void throw_with_location( E const & e, boost::source_location const & loc = BOOST_CURRENT_LOCATION )
+{
+    throw_exception_assert_compatibility( e );
+    throw detail::with_throw_location<E>( e, loc );
+}
+
+#endif
+
+#else
+
+template<class E> BOOST_NORETURN void throw_with_location( E const & e, boost::source_location const & loc = BOOST_CURRENT_LOCATION )
+{
+    boost::throw_exception( e, loc );
+}
+
+#endif
+
+// get_throw_location
+
+template<class E> boost::source_location get_throw_location( E const & e )
+{
+#if defined(BOOST_NO_RTTI)
+
+    (void)e;
+    return boost::source_location();
+
+#else
+
+    if( detail::throw_location const* pl = dynamic_cast< detail::throw_location const* >( &e ) )
+    {
+        return pl->location_;
+    }
+    else if( boost::exception const* px = dynamic_cast< boost::exception const* >( &e ) )
+    {
+        return exception_detail::get_exception_throw_location( *px );
+    }
+    else
+    {
+        return boost::source_location();
+    }
+
+#endif
+}
+
+} // namespace boost
+
 #endif // #ifndef BOOST_THROW_EXCEPTION_HPP_INCLUDED