|
17 | 17 |
|
18 | 18 | #include <boost/leaf/config.hpp>
|
19 | 19 |
|
| 20 | +#include <iosfwd> |
20 | 21 | #include <cstring>
|
21 | 22 |
|
22 | 23 | namespace boost { namespace leaf {
|
23 | 24 |
|
24 | 25 | namespace leaf_detail
|
25 | 26 | {
|
26 | 27 | template <int N>
|
27 |
| - BOOST_LEAF_CONSTEXPR inline char const * check_prefix( char const * t, char const (&prefix)[N] ) |
| 28 | + BOOST_LEAF_CONSTEXPR inline int check_prefix(char const * t, char const (&prefix)[N]) noexcept |
28 | 29 | {
|
29 |
| - return std::strncmp(t,prefix,sizeof(prefix)-1)==0 ? t+sizeof(prefix)-1 : t; |
| 30 | + return std::strncmp(t, prefix, sizeof(prefix)-1) == 0 ? sizeof(prefix) - 1 : 0; |
30 | 31 | }
|
31 | 32 | }
|
32 | 33 |
|
33 | 34 | template <class Name>
|
34 |
| -inline char const * type() |
| 35 | +inline char const * type_str() |
35 | 36 | {
|
36 |
| - using leaf_detail::check_prefix; |
37 |
| - char const * t = |
38 |
| -#ifdef __FUNCSIG__ |
39 |
| - __FUNCSIG__; |
| 37 | +#if defined(_MSC_VER) |
| 38 | + if( char const * p = std::strstr(__FUNCSIG__, "boost::leaf::type_str<") ) |
| 39 | + return p + 22; |
| 40 | + else |
| 41 | + return __FUNCSIG__; |
40 | 42 | #else
|
41 |
| - __PRETTY_FUNCTION__; |
| 43 | +# if defined(__clang__) |
| 44 | + BOOST_LEAF_ASSERT(leaf_detail::check_prefix(__PRETTY_FUNCTION__, "const char *boost::leaf::type_str() [Name = ") == 44); |
| 45 | + return __PRETTY_FUNCTION__ + 44; |
| 46 | +# elif defined(__GNUC__) |
| 47 | + BOOST_LEAF_ASSERT(leaf_detail::check_prefix(__PRETTY_FUNCTION__, "const char* boost::leaf::type_str() [with Name = ") == 49); |
| 48 | + return __PRETTY_FUNCTION__ + 49; |
| 49 | +# else |
| 50 | + if( int clang_style = leaf_detail::check_prefix(__PRETTY_FUNCTION__, "const char *boost::leaf::type_str() [Name = ") ) |
| 51 | + return __PRETTY_FUNCTION__ + clang_style; |
| 52 | + else if( int gcc_style = leaf_detail::check_prefix(__PRETTY_FUNCTION__, "const char* boost::leaf::type_str() [with Name = ") ) |
| 53 | + return __PRETTY_FUNCTION__ + gcc_style; |
| 54 | + else |
| 55 | + return __PRETTY_FUNCTION__; |
| 56 | + return nullptr; |
| 57 | +# endif |
42 | 58 | #endif
|
43 |
| -#if defined(__clang__) |
44 |
| - BOOST_LEAF_ASSERT(check_prefix(t,"const char *boost::leaf::type() ")==t+32); |
45 |
| - return t+32; |
46 |
| -#elif defined(__GNUC__) |
47 |
| - BOOST_LEAF_ASSERT(check_prefix(t,"const char* boost::leaf::type() ")==t+32); |
48 |
| - return t+32; |
| 59 | +} |
| 60 | + |
| 61 | +template <class Name, class CharT, class Traits> |
| 62 | +inline std::ostream & print_type_str(std::basic_ostream<CharT, Traits> & os) |
| 63 | +{ |
| 64 | + if( char const * t = type_str<Name>() ) |
| 65 | + { |
| 66 | + char const * end = std::strchr(t, 0); |
| 67 | +#ifdef _MSC_VER |
| 68 | + BOOST_LEAF_ASSERT(end - t > 7); |
| 69 | + BOOST_LEAF_ASSERT(std::memcmp(end - 7, ">(void)", 7) == 0); |
| 70 | + if( *t == 's' ) |
| 71 | + { |
| 72 | + BOOST_LEAF_ASSERT(std::memcmp(t + 1, "truct ", 6) == 0); |
| 73 | + t += 7; |
| 74 | + } |
| 75 | + else if( *t == 'c' ) |
| 76 | + { |
| 77 | + BOOST_LEAF_ASSERT(std::memcmp(t + 1, "lass ", 5) == 0); |
| 78 | + t += 6; |
| 79 | + } |
| 80 | + else if( *t == 'e' ) |
| 81 | + { |
| 82 | + BOOST_LEAF_ASSERT(std::memcmp(t + 1, "num ", 4) == 0); |
| 83 | + t += 5; |
| 84 | + } |
| 85 | + return os.write(t, end - t - 7) << ": "; |
| 86 | +#elif defined(__clang__) || defined(__GNUC__) |
| 87 | + BOOST_LEAF_ASSERT(end != t); |
| 88 | + BOOST_LEAF_ASSERT(end[-1] == ']'); |
| 89 | + return os.write(t, end - t - 1) << ": "; |
49 | 90 | #else
|
50 |
| - char const * clang_style = check_prefix(t,"const char *boost::leaf::type() "); |
51 |
| - if( clang_style!=t ) |
52 |
| - return clang_style; |
53 |
| - char const * gcc_style = check_prefix(t,"const char* boost::leaf::type() "); |
54 |
| - if( gcc_style!=t ) |
55 |
| - return gcc_style; |
| 91 | + if( end != t && end[-1] == ']') |
| 92 | + return os.write(t, end - t - 1) << ": "; |
| 93 | + else |
| 94 | + return os << t << ": "; |
56 | 95 | #endif
|
57 |
| - return t; |
| 96 | + } |
| 97 | + else |
| 98 | + return os << "no name: "; |
58 | 99 | }
|
59 | 100 |
|
60 | 101 | } }
|
|
0 commit comments