From 36efa3969b5808dc1bc155c511cdef2ea4c3a129 Mon Sep 17 00:00:00 2001 From: Antony Polukhin Date: Sun, 27 Mar 2016 14:46:27 +0300 Subject: [PATCH] Use the cstring workaround only for GCC --- .../detail/compile_time_type_info.hpp | 39 +++++++++++-------- test/ctti_print_name.cpp | 2 +- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/include/boost/type_index/detail/compile_time_type_info.hpp b/include/boost/type_index/detail/compile_time_type_info.hpp index 96d99df..9827394 100644 --- a/include/boost/type_index/detail/compile_time_type_info.hpp +++ b/include/boost/type_index/detail/compile_time_type_info.hpp @@ -22,13 +22,12 @@ #endif /// @cond -#define BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(begin_skip, end_skip, runtime_skip, runtime_skip_until, constexpr_begin_skip) \ +#define BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(begin_skip, end_skip, runtime_skip, runtime_skip_until) \ namespace boost { namespace typeindex { namespace detail { \ BOOST_STATIC_CONSTEXPR std::size_t ctti_skip_size_at_begin = begin_skip; \ BOOST_STATIC_CONSTEXPR std::size_t ctti_skip_size_at_end = end_skip; \ BOOST_STATIC_CONSTEXPR bool ctti_skip_more_at_runtime = runtime_skip; \ BOOST_STATIC_CONSTEXPR char ctti_skip_until_runtime[] = runtime_skip_until; \ - BOOST_STATIC_CONSTEXPR std::size_t ctti_skip_size_at_constexpr_begin = constexpr_begin_skip; \ }}} /* namespace boost::typeindex::detail */ \ /**/ /// @endcond @@ -45,10 +44,10 @@ #if defined (BOOST_NO_CXX11_NOEXCEPT) // sizeof("const char *__cdecl boost::detail::ctti<") - 1, sizeof(">::n(void)") - 1 - BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(40, 10, false, "", 0) + BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(40, 10, false, "") #else // sizeof("const char *__cdecl boost::detail::ctti<") - 1, sizeof(">::n(void) noexcept") - 1 - BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(40, 19, false, "", 0) + BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(40, 19, false, "") #endif #elif defined(__clang__) && defined(__APPLE__) // Someone made __clang_major__ equal to LLVM version rather than compiler version @@ -56,21 +55,28 @@ // // Using less efficient solution because there is no good way to detect real version of Clang. // sizeof("static const char *boost::detail::ctti<") - 1, sizeof("]") - 1, true, "???????????>::n() [T = int" - BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(39, 1, true, "T = ", 0) + BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(39, 1, true, "T = ") #elif defined(__clang__) && (__clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ == 0)) // sizeof("static const char *boost::detail::ctti<") - 1, sizeof(">::n()") - 1 // note: checked on 3.0 - BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(39, 6, false, "", 0) + BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(39, 6, false, "") #elif defined(__clang__) && __clang_major__ == 3 && __clang_minor__ > 0 // sizeof("static const char *boost::detail::ctti<") - 1, sizeof("]") - 1, true, "int>::n() [T = int" // note: checked on 3.1, 3.4 - BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(39, 1, true, "T = ", 0) + BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(39, 1, true, "T = ") #elif defined(__GNUC__) + +#ifndef BOOST_NO_CXX14_CONSTEXPR + // sizeof("static contexpr char boost::detail::ctti::s() [with long unsigned int Index = 82ul; T = ") - 1, sizeof("]") - 1 + BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(91, 1, false, "") +#else // sizeof("static const char* boost::detail::ctti::n() [with T = ") - 1, sizeof("]") - 1 - BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(57, 1, false, "", 91) + BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(57, 1, false, "") +#endif + #else // Deafult code for other platforms... Just skip nothing! - BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(0, 0, false, "", 0) + BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(0, 0, false, "") #endif #undef BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS @@ -146,9 +152,8 @@ namespace boost { namespace typeindex { namespace detail { ); } -#if ! defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && ! defined ( BOOST_NO_CXX11_CONSTEXPR ) - - +#if !defined(__clang__) && defined(__GNUC__) && !defined(BOOST_NO_CXX14_CONSTEXPR) + // GCC template struct switch_{ typedef typename TDefault::type type; @@ -220,7 +225,7 @@ namespace boost { namespace detail { template struct ctti { -#if ! defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && ! defined ( BOOST_NO_CXX11_CONSTEXPR ) +#if !defined(__clang__) && defined(__GNUC__) && !defined(BOOST_NO_CXX14_CONSTEXPR) //helper functions template constexpr static char s() { // step @@ -262,7 +267,7 @@ struct ctti { } template - constexpr static auto n() + constexpr static const char* n() { constexpr std::size_t size = sizeof( #if defined(BOOST_TYPE_INDEX_FUNCTION_SIGNATURE) @@ -283,14 +288,14 @@ struct ctti { ); typedef typename boost::typeindex::detail::make_index_seq< - size - boost::typeindex::detail::ctti_skip_size_at_end, - boost::typeindex::detail::ctti_skip_size_at_constexpr_begin + size - boost::typeindex::detail::ctti_skip_size_at_end - 7, + boost::typeindex::detail::ctti_skip_size_at_begin >::type idx_seq; return impl(idx_seq()); } #else /// Returns raw name. Must be as short, as possible, to avoid code bloat - static const char* n() BOOST_NOEXCEPT { + BOOST_CXX14_CONSTEXPR static const char* n() BOOST_NOEXCEPT { #if defined(BOOST_TYPE_INDEX_FUNCTION_SIGNATURE) return boost::typeindex::detail::skip_begining< sizeof(BOOST_TYPE_INDEX_FUNCTION_SIGNATURE) >(BOOST_TYPE_INDEX_FUNCTION_SIGNATURE); #elif defined(__FUNCSIG__) diff --git a/test/ctti_print_name.cpp b/test/ctti_print_name.cpp index 0319dbe..34f03d0 100644 --- a/test/ctti_print_name.cpp +++ b/test/ctti_print_name.cpp @@ -10,7 +10,7 @@ // This cpp file: // * tests BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING macro // * outputs full ctti name so that TypeIndex library could be adjust to new compiler without requesting regression tester's help -#define BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING (0,0,false,"",0) +#define BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING (0,0,false,"") #include namespace user_defined_namespace {