1 // (C) Copyright 2009 Andrew Sutton 2 // 3 // Use, modification and distribution are subject to the 4 // Boost Software License, Version 1.0 (See accompanying file 5 // LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) 6 7 #ifndef ORIGIN_TYPESTR_HPP 8 #define ORIGIN_TYPESTR_HPP 9 10 #include <string> 11 #include <cstring> 12 #include <typeinfo> 13 14 #if defined(__GNUC__) 15 #include <cxxabi.h> 16 #endif 17 18 template < typename T > struct type_name 19 { 20 }; 21 22 /** 23 * Return a string that describes the type of the given template parameter. 24 * The type name depends on the results of the typeid operator. 25 * 26 * @todo Rewrite this so that demangle will dynamically allocate the memory. 27 */ typestr()28template < typename T > std::string typestr() 29 { 30 #if defined(__GNUC__) 31 std::size_t const BUFSIZE = 8192; 32 std::size_t n = BUFSIZE; 33 char buf[BUFSIZE]; 34 abi::__cxa_demangle(typeid(type_name< T >).name(), buf, &n, 0); 35 return std::string(buf, ::strlen(buf)); 36 #else 37 return typeid(type_name< T >).name(); 38 #endif 39 } 40 41 /** 42 * Return a string that describes the type of the given parameter. The type 43 * name depends on the results of the typeid operator. 44 */ typestr(T const &)45template < typename T > inline std::string typestr(T const&) 46 { 47 return typestr< T >(); 48 } 49 50 #endif 51