From eb78cf942ef2e285c810fe4e67def8108dd040a1 Mon Sep 17 00:00:00 2001 From: mat007 Date: Wed, 9 Dec 2009 23:08:54 +0000 Subject: [PATCH] Fixed type name extraction git-svn-id: https://svn.code.sf.net/p/turtle/code/trunk@70 860be788-9bd5-4423-9f1e-828f051e677b --- build/vc80/turtle_test.vcproj | 4 ++ src/libraries/turtle/type_name.hpp | 18 +++---- src/tests/turtle_test/type_name_test.cpp | 66 ++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 12 deletions(-) create mode 100644 src/tests/turtle_test/type_name_test.cpp diff --git a/build/vc80/turtle_test.vcproj b/build/vc80/turtle_test.vcproj index aa647a5..7d7e41c 100644 --- a/build/vc80/turtle_test.vcproj +++ b/build/vc80/turtle_test.vcproj @@ -236,6 +236,10 @@ RelativePath="..\..\src\tests\turtle_test\silent_error.hpp" > + + diff --git a/src/libraries/turtle/type_name.hpp b/src/libraries/turtle/type_name.hpp index 856afdb..10acfd3 100644 --- a/src/libraries/turtle/type_name.hpp +++ b/src/libraries/turtle/type_name.hpp @@ -43,27 +43,21 @@ namespace detail guard g( result ); if( result ) return result; - else - return name; -#else - return name; #endif - } - - template< typename T > - std::string type_full_name() - { - return type_full_name( typeid( T ) ); + return name; } template< typename T > std::string type_name() { - const std::string name = type_full_name< T >(); + const std::string name = type_full_name( typeid( T ) ); std::size_t p = name.rfind( "::" ); if( p != std::string::npos ) return name.substr( p + 2 ); - return ""; + p = name.rfind( " " ); + if( p != std::string::npos ) + return name.substr( p + 1 ); + return name; } } } diff --git a/src/tests/turtle_test/type_name_test.cpp b/src/tests/turtle_test/type_name_test.cpp new file mode 100644 index 0000000..f302313 --- /dev/null +++ b/src/tests/turtle_test/type_name_test.cpp @@ -0,0 +1,66 @@ +// +// Copyright Mathieu Champlon 2008 +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#include + +#include +#define BOOST_LIB_NAME boost_unit_test_framework +#include + +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 >() ); +} + +namespace +{ + struct my_type_from_anonymous_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 >() ); +} + +namespace nm +{ + struct my_type_from_named_namespace {}; +} + +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 >() ); +} + +namespace nm +{ +namespace inner +{ + struct my_type_from_named_inner_namespace {}; +} +} + +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 >() ); +} + +namespace +{ +namespace inner +{ + struct my_type_from_unnamed_inner_namespace {}; +} +} + +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 >() ); +}