From 8f57d59bfbc978673a2493a90b4f3e7e54ddbf18 Mon Sep 17 00:00:00 2001 From: Antony Polukhin Date: Thu, 20 Feb 2014 18:30:11 +0400 Subject: [PATCH] Boost.Exception now uses TypeIndex to reduce duplicate code and simplify name demanglings --- include/boost/exception/detail/type_info.hpp | 43 +++------------------- include/boost/exception/diagnostic_information.hpp | 2 +- include/boost/exception/exception.hpp | 3 +- include/boost/exception/info.hpp | 2 +- test/Jamfile.v2 | 2 + 5 files changed, 12 insertions(+), 40 deletions(-) diff --git a/include/boost/exception/detail/type_info.hpp b/include/boost/exception/detail/type_info.hpp index 6e5942d..a247b71 100644 --- a/include/boost/exception/detail/type_info.hpp +++ b/include/boost/exception/detail/type_info.hpp @@ -12,13 +12,7 @@ #pragma warning(push,1) #endif -#include -#include -#include -//#ifndef BOOST_NO_TYPEID -//#include -//#endif -#include +#include namespace boost @@ -28,11 +22,7 @@ boost std::string tag_type_name() { -#ifdef BOOST_NO_TYPEID - return BOOST_CURRENT_FUNCTION; -#else - return /*units::detail::demangle*/(typeid(T*).name()); -#endif + return boost::typeind::type_id().pretty_name(); } template @@ -40,41 +30,20 @@ boost std::string type_name() { -#ifdef BOOST_NO_TYPEID - return BOOST_CURRENT_FUNCTION; -#else - return /*units::detail::demangle*/(typeid(T).name()); -#endif + return boost::typeind::type_id().pretty_name(); } namespace exception_detail { - struct - type_info_ - { - detail::sp_typeinfo const * type_; - - explicit - type_info_( detail::sp_typeinfo const & type ): - type_(&type) - { - } - - friend - bool - operator<( type_info_ const & a, type_info_ const & b ) - { - return 0!=(a.type_->before(*b.type_)); - } - }; + typedef boost::typeind::type_index type_info_; } } -#define BOOST_EXCEPTION_STATIC_TYPEID(T) ::boost::exception_detail::type_info_(BOOST_SP_TYPEID(T)) +#define BOOST_EXCEPTION_STATIC_TYPEID(T) ::boost::typeind::type_id() #ifndef BOOST_NO_RTTI -#define BOOST_EXCEPTION_DYNAMIC_TYPEID(x) ::boost::exception_detail::type_info_(typeid(x)) +#define BOOST_EXCEPTION_DYNAMIC_TYPEID(x) ::boost::typeind::type_id_runtime(x) #endif #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) diff --git a/include/boost/exception/diagnostic_information.hpp b/include/boost/exception/diagnostic_information.hpp index 2f5cb88..0f8b5e8 100644 --- a/include/boost/exception/diagnostic_information.hpp +++ b/include/boost/exception/diagnostic_information.hpp @@ -151,7 +151,7 @@ boost #ifndef BOOST_NO_RTTI if ( verbose ) tmp << std::string("Dynamic exception type: ") << - /*units::detail::demangle*/((be?(BOOST_EXCEPTION_DYNAMIC_TYPEID(*be)):(BOOST_EXCEPTION_DYNAMIC_TYPEID(*se))).type_->name()) << '\n'; + /*units::detail::demangle*/((be?(BOOST_EXCEPTION_DYNAMIC_TYPEID(*be)):(BOOST_EXCEPTION_DYNAMIC_TYPEID(*se)))) << '\n'; #endif if( with_what && se && verbose ) tmp << "std::exception::what: " << wh << '\n'; diff --git a/include/boost/exception/exception.hpp b/include/boost/exception/exception.hpp index 9f20a04..53c341f 100644 --- a/include/boost/exception/exception.hpp +++ b/include/boost/exception/exception.hpp @@ -12,6 +12,8 @@ #pragma warning(push,1) #endif +#include + namespace boost { @@ -151,7 +153,6 @@ boost exception_detail { class error_info_base; - struct type_info_; struct error_info_container diff --git a/include/boost/exception/info.hpp b/include/boost/exception/info.hpp index edbf058..e0f4950 100644 --- a/include/boost/exception/info.hpp +++ b/include/boost/exception/info.hpp @@ -96,7 +96,7 @@ boost { shared_ptr const & p = i->second; #ifndef BOOST_NO_RTTI - BOOST_ASSERT( *BOOST_EXCEPTION_DYNAMIC_TYPEID(*p).type_==*ti.type_ ); + BOOST_ASSERT(BOOST_EXCEPTION_DYNAMIC_TYPEID(*p)==ti ); #endif return p; } diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index d2dfcd6..5bd076d 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -35,7 +35,9 @@ run enable_error_info_test.cpp helper1.cpp ; run throw_exception_test.cpp helper2.cpp ; run errno_test.cpp ; run error_info_test.cpp ; +run error_info_test.cpp : : : off : error_info_test_rtti ; run diagnostic_information_test.cpp ; +run diagnostic_information_test.cpp : : : off : diagnostic_information_test_rtti ; run refcount_ptr_test.cpp ; run current_exception_cast_test.cpp ; run no_exceptions_test.cpp : : : off ; -- 1.8.5.3