mirror of
https://github.com/mat007/turtle.git
synced 2026-06-22 12:13:43 +00:00
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
This commit is contained in:
parent
618206f410
commit
87335f7ab0
3 changed files with 26 additions and 24 deletions
|
|
@ -137,7 +137,7 @@ namespace detail
|
||||||
{
|
{
|
||||||
set_parent( e, t );
|
set_parent( e, t );
|
||||||
if( parent != "?" || e.tag() == "?" )
|
if( parent != "?" || e.tag() == "?" )
|
||||||
e.tag( parent + op + type_name< T >() + "::" + name );
|
e.tag( parent + op + type_name( typeid( T ) ) + "::" + name );
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,13 @@ namespace mock
|
||||||
{
|
{
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
inline std::string type_full_name( const std::type_info& info )
|
||||||
|
{
|
||||||
|
const char* name = info.name();
|
||||||
|
#ifdef __GNUC__
|
||||||
|
size_t size = 0;
|
||||||
|
int status = 0;
|
||||||
|
char* result = abi::__cxa_demangle( name, NULL, &size, &status );
|
||||||
struct guard
|
struct guard
|
||||||
{
|
{
|
||||||
explicit guard( char* p )
|
explicit guard( char* p )
|
||||||
|
|
@ -31,26 +38,15 @@ namespace detail
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
char* p_;
|
char* p_;
|
||||||
};
|
} g( result );
|
||||||
|
|
||||||
inline std::string type_full_name( const std::type_info& info )
|
|
||||||
{
|
|
||||||
const char* name = info.name();
|
|
||||||
#ifdef __GNUC__
|
|
||||||
size_t size = 0;
|
|
||||||
int status = 0;
|
|
||||||
char* result = abi::__cxa_demangle( name, NULL, &size, &status );
|
|
||||||
guard g( result );
|
|
||||||
if( result )
|
if( result )
|
||||||
return result;
|
return result;
|
||||||
#endif
|
#endif
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
inline std::string type_name( const std::type_info& info )
|
||||||
template< typename T >
|
|
||||||
std::string type_name()
|
|
||||||
{
|
{
|
||||||
const std::string name = type_full_name( typeid( T ) );
|
const std::string name = type_full_name( info );
|
||||||
std::size_t p = name.rfind( "::" );
|
std::size_t p = name.rfind( "::" );
|
||||||
if( p != std::string::npos )
|
if( p != std::string::npos )
|
||||||
return name.substr( p + 2 );
|
return name.substr( p + 2 );
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ struct my_type_from_default_namespace {};
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE( name_of_type_from_default_namespace_is_extracted )
|
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
|
namespace
|
||||||
|
|
@ -26,7 +26,7 @@ namespace
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE( name_of_type_from_anonymous_namespace_is_extracted )
|
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
|
namespace nm
|
||||||
|
|
@ -36,7 +36,7 @@ namespace nm
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE( name_of_type_from_named_namespace_is_extracted )
|
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
|
namespace nm
|
||||||
|
|
@ -49,7 +49,7 @@ namespace inner
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE( name_of_type_from_named_inner_namespace_is_extracted )
|
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
|
namespace
|
||||||
|
|
@ -62,5 +62,11 @@ namespace inner
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE( name_of_type_from_unnamed_inner_namespace_is_extracted )
|
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 ) ) );
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue