From 87335f7ab02d6364caeeda2af9d59b89506dd13d Mon Sep 17 00:00:00 2001 From: mat007 Date: Thu, 10 Dec 2009 23:46:12 +0000 Subject: [PATCH] Fixed type name extraction for local types git-svn-id: https://svn.code.sf.net/p/turtle/code/trunk@72 860be788-9bd5-4423-9f1e-828f051e677b --- src/libraries/turtle/mock.hpp | 2 +- src/libraries/turtle/type_name.hpp | 32 +++++++++++------------- src/tests/turtle_test/type_name_test.cpp | 16 ++++++++---- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/src/libraries/turtle/mock.hpp b/src/libraries/turtle/mock.hpp index 646c4b6..01f2743 100644 --- a/src/libraries/turtle/mock.hpp +++ b/src/libraries/turtle/mock.hpp @@ -137,7 +137,7 @@ namespace detail { set_parent( e, t ); if( parent != "?" || e.tag() == "?" ) - e.tag( parent + op + type_name< T >() + "::" + name ); + e.tag( parent + op + type_name( typeid( T ) ) + "::" + name ); return e; } diff --git a/src/libraries/turtle/type_name.hpp b/src/libraries/turtle/type_name.hpp index 10acfd3..e5fedec 100644 --- a/src/libraries/turtle/type_name.hpp +++ b/src/libraries/turtle/type_name.hpp @@ -20,19 +20,6 @@ namespace mock { namespace detail { - struct guard - { - explicit guard( char* p ) - : p_( p ) - {} - ~guard() - { - free( p_ ); - } - private: - char* p_; - }; - inline std::string type_full_name( const std::type_info& info ) { const char* name = info.name(); @@ -40,17 +27,26 @@ namespace detail size_t size = 0; int status = 0; char* result = abi::__cxa_demangle( name, NULL, &size, &status ); - guard g( result ); + struct guard + { + explicit guard( char* p ) + : p_( p ) + {} + ~guard() + { + free( p_ ); + } + private: + char* p_; + } g( result ); if( result ) return result; #endif return name; } - - template< typename T > - std::string type_name() + inline std::string type_name( const std::type_info& info ) { - const std::string name = type_full_name( typeid( T ) ); + const std::string name = type_full_name( info ); std::size_t p = name.rfind( "::" ); if( p != std::string::npos ) return name.substr( p + 2 ); diff --git a/src/tests/turtle_test/type_name_test.cpp b/src/tests/turtle_test/type_name_test.cpp index f302313..2b2cc6f 100644 --- a/src/tests/turtle_test/type_name_test.cpp +++ b/src/tests/turtle_test/type_name_test.cpp @@ -16,7 +16,7 @@ struct my_type_from_default_namespace {}; BOOST_AUTO_TEST_CASE( name_of_type_from_default_namespace_is_extracted ) { - BOOST_CHECK_EQUAL( "my_type_from_default_namespace", mock::detail::type_name< my_type_from_default_namespace >() ); + BOOST_CHECK_EQUAL( "my_type_from_default_namespace", mock::detail::type_name( typeid( my_type_from_default_namespace ) ) ); } namespace @@ -26,7 +26,7 @@ namespace BOOST_AUTO_TEST_CASE( name_of_type_from_anonymous_namespace_is_extracted ) { - BOOST_CHECK_EQUAL( "my_type_from_anonymous_namespace", mock::detail::type_name< my_type_from_anonymous_namespace >() ); + BOOST_CHECK_EQUAL( "my_type_from_anonymous_namespace", mock::detail::type_name( typeid( my_type_from_anonymous_namespace ) ) ); } namespace nm @@ -36,7 +36,7 @@ namespace nm BOOST_AUTO_TEST_CASE( name_of_type_from_named_namespace_is_extracted ) { - BOOST_CHECK_EQUAL( "my_type_from_named_namespace", mock::detail::type_name< nm::my_type_from_named_namespace >() ); + BOOST_CHECK_EQUAL( "my_type_from_named_namespace", mock::detail::type_name( typeid( nm::my_type_from_named_namespace ) ) ); } namespace nm @@ -49,7 +49,7 @@ namespace inner BOOST_AUTO_TEST_CASE( name_of_type_from_named_inner_namespace_is_extracted ) { - BOOST_CHECK_EQUAL( "my_type_from_named_inner_namespace", mock::detail::type_name< nm::inner::my_type_from_named_inner_namespace >() ); + BOOST_CHECK_EQUAL( "my_type_from_named_inner_namespace", mock::detail::type_name( typeid( nm::inner::my_type_from_named_inner_namespace ) ) ); } namespace @@ -62,5 +62,11 @@ namespace inner BOOST_AUTO_TEST_CASE( name_of_type_from_unnamed_inner_namespace_is_extracted ) { - BOOST_CHECK_EQUAL( "my_type_from_unnamed_inner_namespace", mock::detail::type_name< inner::my_type_from_unnamed_inner_namespace >() ); + BOOST_CHECK_EQUAL( "my_type_from_unnamed_inner_namespace", mock::detail::type_name( typeid( inner::my_type_from_unnamed_inner_namespace ) ) ); +} + +BOOST_AUTO_TEST_CASE( name_of_local_type_is_extracted ) +{ + struct my_local_type {}; + BOOST_CHECK_EQUAL( "my_local_type", mock::detail::type_name( typeid( my_local_type ) ) ); }