diff --git a/CMakeLists.txt b/CMakeLists.txt index 5075e73..beb1d06 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,10 +17,7 @@ target_link_libraries(boost_type_index Boost::config Boost::container_hash Boost::core - Boost::preprocessor - Boost::static_assert Boost::throw_exception - Boost::type_traits ) if(BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt") diff --git a/examples/inheritance.cpp b/examples/inheritance.cpp index 16f333b..268c5ab 100644 --- a/examples/inheritance.cpp +++ b/examples/inheritance.cpp @@ -22,7 +22,7 @@ struct A { }; struct B: public A { BOOST_TYPE_INDEX_REGISTER_CLASS }; struct C: public B { BOOST_TYPE_INDEX_REGISTER_CLASS }; -struct D: public C { BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(BOOST_TYPE_INDEX_NO_BASE_CLASS) }; +struct D: public C { BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS() }; void print_real_type(const A& a) { std::cout << boost::typeindex::type_id_runtime(a).pretty_name() << '\n'; diff --git a/examples/runtime_cast.cpp b/examples/runtime_cast.cpp index 43e7aa7..c082b5d 100644 --- a/examples/runtime_cast.cpp +++ b/examples/runtime_cast.cpp @@ -18,27 +18,27 @@ #include struct A { - BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(BOOST_TYPE_INDEX_NO_BASE_CLASS) + BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS() virtual ~A() {} }; struct B { - BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(BOOST_TYPE_INDEX_NO_BASE_CLASS) + BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS() virtual ~B() {} }; struct C : A { - BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS((A)) + BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(A) }; struct D : B { - BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS((B)) + BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(B) }; struct E : C, D { - BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS((C)(D)) + BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(C, D) }; int main() { diff --git a/include/boost/type_index.hpp b/include/boost/type_index.hpp index 07ea515..be15153 100644 --- a/include/boost/type_index.hpp +++ b/include/boost/type_index.hpp @@ -20,9 +20,6 @@ # pragma once #endif - - -#include #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || \ defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) || \ defined(BOOST_NO_CXX11_CONSTEXPR) || \ @@ -36,7 +33,7 @@ defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) || \ defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS) -BOOST_PRAGMA_MESSAGE("C++03 support is deprecated in Boost.TypeIndex 1.82 and will be removed in Boost.TypeIndex 1.84.") +#error C++03 support is dropped in Boost.TypeIndex 1.84 #endif @@ -228,7 +225,7 @@ typedef type_index::type_info_t type_info; /// \throw Nothing. /// \return boost::typeindex::type_index with information about the specified type T. template -inline type_index type_id() BOOST_NOEXCEPT { +inline type_index type_id() noexcept { return type_index::type_id(); } @@ -248,7 +245,7 @@ inline type_index type_id() BOOST_NOEXCEPT { /// \throw Nothing. /// \return boost::typeindex::type_index with information about the specified type T. template -inline type_index type_id_with_cvr() BOOST_NOEXCEPT { +inline type_index type_id_with_cvr() noexcept { return type_index::type_id_with_cvr(); } @@ -273,7 +270,7 @@ inline type_index type_id_with_cvr() BOOST_NOEXCEPT { /// \throw Nothing. /// \return boost::typeindex::type_index with information about the specified variable. template -inline type_index type_id_runtime(const T& runtime_val) BOOST_NOEXCEPT { +inline type_index type_id_runtime(const T& runtime_val) noexcept { return type_index::type_id_runtime(runtime_val); } diff --git a/include/boost/type_index/ctti_type_index.hpp b/include/boost/type_index/ctti_type_index.hpp index 818545b..d6717f3 100644 --- a/include/boost/type_index/ctti_type_index.hpp +++ b/include/boost/type_index/ctti_type_index.hpp @@ -22,10 +22,8 @@ #include #include +#include #include -#include -#include -#include #ifdef BOOST_HAS_PRAGMA_ONCE # pragma once @@ -58,24 +56,17 @@ namespace detail { /// std::cout << ti.pretty_name(); /// \endcode class ctti_data { -#ifndef BOOST_NO_CXX11_DELETED_FUNCTIONS public: ctti_data() = delete; ctti_data(const ctti_data&) = delete; ctti_data& operator=(const ctti_data&) = delete; -#else -private: - ctti_data(); - ctti_data(const ctti_data&); - ctti_data& operator=(const ctti_data&); -#endif }; } // namespace detail /// Helper method for getting detail::ctti_data of a template parameter T. template -inline const detail::ctti_data& ctti_construct() BOOST_NOEXCEPT { +inline const detail::ctti_data& ctti_construct() noexcept { // Standard C++11, 5.2.10 Reinterpret cast: // An object pointer can be explicitly converted to an object pointer of a different type. When a prvalue // v of type "pointer to T1" is converted to the type "pointer to cv T2", the result is static_cast { const char* data_; - inline std::size_t get_raw_name_length() const BOOST_NOEXCEPT; + inline std::size_t get_raw_name_length() const noexcept; - BOOST_CXX14_CONSTEXPR inline explicit ctti_type_index(const char* data) BOOST_NOEXCEPT + BOOST_CXX14_CONSTEXPR inline explicit ctti_type_index(const char* data) noexcept : data_(data) {} public: typedef detail::ctti_data type_info_t; - BOOST_CXX14_CONSTEXPR inline ctti_type_index() BOOST_NOEXCEPT + BOOST_CXX14_CONSTEXPR inline ctti_type_index() noexcept : data_(boost::detail::ctti::n()) {} - inline ctti_type_index(const type_info_t& data) BOOST_NOEXCEPT + inline ctti_type_index(const type_info_t& data) noexcept : data_(reinterpret_cast(&data)) {} - inline const type_info_t& type_info() const BOOST_NOEXCEPT; - BOOST_CXX14_CONSTEXPR inline const char* raw_name() const BOOST_NOEXCEPT; - BOOST_CXX14_CONSTEXPR inline const char* name() const BOOST_NOEXCEPT; + inline const type_info_t& type_info() const noexcept; + BOOST_CXX14_CONSTEXPR inline const char* raw_name() const noexcept; + BOOST_CXX14_CONSTEXPR inline const char* name() const noexcept; inline std::string pretty_name() const; - inline std::size_t hash_code() const BOOST_NOEXCEPT; + inline std::size_t hash_code() const noexcept; - BOOST_CXX14_CONSTEXPR inline bool equal(const ctti_type_index& rhs) const BOOST_NOEXCEPT; - BOOST_CXX14_CONSTEXPR inline bool before(const ctti_type_index& rhs) const BOOST_NOEXCEPT; + BOOST_CXX14_CONSTEXPR inline bool equal(const ctti_type_index& rhs) const noexcept; + BOOST_CXX14_CONSTEXPR inline bool before(const ctti_type_index& rhs) const noexcept; template - BOOST_CXX14_CONSTEXPR inline static ctti_type_index type_id() BOOST_NOEXCEPT; + BOOST_CXX14_CONSTEXPR inline static ctti_type_index type_id() noexcept; template - BOOST_CXX14_CONSTEXPR inline static ctti_type_index type_id_with_cvr() BOOST_NOEXCEPT; + BOOST_CXX14_CONSTEXPR inline static ctti_type_index type_id_with_cvr() noexcept; template - inline static ctti_type_index type_id_runtime(const T& variable) BOOST_NOEXCEPT; + inline static ctti_type_index type_id_runtime(const T& variable) noexcept; }; -inline const ctti_type_index::type_info_t& ctti_type_index::type_info() const BOOST_NOEXCEPT { +inline const ctti_type_index::type_info_t& ctti_type_index::type_info() const noexcept { return *reinterpret_cast(data_); } -BOOST_CXX14_CONSTEXPR inline bool ctti_type_index::equal(const ctti_type_index& rhs) const BOOST_NOEXCEPT { +BOOST_CXX14_CONSTEXPR inline bool ctti_type_index::equal(const ctti_type_index& rhs) const noexcept { const char* const left = raw_name(); const char* const right = rhs.raw_name(); return /*left == right ||*/ !boost::typeindex::detail::constexpr_strcmp(left, right); } -BOOST_CXX14_CONSTEXPR inline bool ctti_type_index::before(const ctti_type_index& rhs) const BOOST_NOEXCEPT { +BOOST_CXX14_CONSTEXPR inline bool ctti_type_index::before(const ctti_type_index& rhs) const noexcept { const char* const left = raw_name(); const char* const right = rhs.raw_name(); return /*left != right &&*/ boost::typeindex::detail::constexpr_strcmp(left, right) < 0; @@ -161,37 +152,37 @@ BOOST_CXX14_CONSTEXPR inline bool ctti_type_index::before(const ctti_type_index& template -BOOST_CXX14_CONSTEXPR inline ctti_type_index ctti_type_index::type_id() BOOST_NOEXCEPT { - typedef BOOST_DEDUCED_TYPENAME boost::remove_reference::type no_ref_t; - typedef BOOST_DEDUCED_TYPENAME boost::remove_cv::type no_cvr_t; +BOOST_CXX14_CONSTEXPR inline ctti_type_index ctti_type_index::type_id() noexcept { + typedef typename std::remove_reference::type no_ref_t; + typedef typename std::remove_cv::type no_cvr_t; return ctti_type_index(boost::detail::ctti::n()); } template -BOOST_CXX14_CONSTEXPR inline ctti_type_index ctti_type_index::type_id_with_cvr() BOOST_NOEXCEPT { +BOOST_CXX14_CONSTEXPR inline ctti_type_index ctti_type_index::type_id_with_cvr() noexcept { return ctti_type_index(boost::detail::ctti::n()); } template -inline ctti_type_index ctti_type_index::type_id_runtime(const T& variable) BOOST_NOEXCEPT { +inline ctti_type_index ctti_type_index::type_id_runtime(const T& variable) noexcept { return variable.boost_type_index_type_id_runtime_(); } -BOOST_CXX14_CONSTEXPR inline const char* ctti_type_index::raw_name() const BOOST_NOEXCEPT { +BOOST_CXX14_CONSTEXPR inline const char* ctti_type_index::raw_name() const noexcept { return data_; } -BOOST_CXX14_CONSTEXPR inline const char* ctti_type_index::name() const BOOST_NOEXCEPT { +BOOST_CXX14_CONSTEXPR inline const char* ctti_type_index::name() const noexcept { return data_; } -inline std::size_t ctti_type_index::get_raw_name_length() const BOOST_NOEXCEPT { - return std::strlen(raw_name() + detail::ctti_skip_size_at_end); +inline std::size_t ctti_type_index::get_raw_name_length() const noexcept { + return std::strlen(raw_name() + detail::skip().size_at_end); } @@ -202,7 +193,7 @@ inline std::string ctti_type_index::pretty_name() const { } -inline std::size_t ctti_type_index::hash_code() const BOOST_NOEXCEPT { +inline std::size_t ctti_type_index::hash_code() const noexcept { return boost::hash_range(raw_name(), raw_name() + get_raw_name_length()); } 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 c808084..9d6129a 100644 --- a/include/boost/type_index/detail/compile_time_type_info.hpp +++ b/include/boost/type_index/detail/compile_time_type_info.hpp @@ -13,10 +13,10 @@ /// \brief Contains helper macros and implementation details of boost::typeindex::ctti_type_index. /// Not intended for inclusion from user's code. -#include #include -#include -#include + +#include +#include #ifdef BOOST_HAS_PRAGMA_ONCE # pragma once @@ -35,74 +35,87 @@ #define BOOST_TYPE_INDEX_DETAIL_BUILTIN_STRCMP(str1, str2) __builtin_strcmp(str1, str2) #endif -#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; \ - }}} /* namespace boost::typeindex::detail */ \ - /**/ /// @endcond +namespace boost { namespace typeindex { namespace detail { + struct ctti_skip { + std::size_t size_at_begin; + std::size_t size_at_end; + const char* until_runtime; + std::size_t until_runtime_length; + }; + + template + constexpr ctti_skip make_ctti_skip(std::size_t size_at_begin, + std::size_t size_at_end, + bool more_at_runtime, + const char (&until_runtime)[N]) + { + return ctti_skip{size_at_begin, size_at_end, until_runtime, more_at_runtime ? N - 1 : 0}; + } + + template + constexpr ctti_skip make_ctti_skip(std::size_t size_at_begin, + std::size_t size_at_end, + const char (&until_runtime)[N]) + { + return ctti_skip{size_at_begin, size_at_end, until_runtime, N - 1}; + } + #if defined(BOOST_TYPE_INDEX_DOXYGEN_INVOKED) /* Nothing to document. All the macro docs are moved to */ #elif defined(BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING) -# include - BOOST_PP_EXPAND( BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING ) +constexpr ctti_skip skip() noexcept { return detail::make_ctti_skip BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING; } #elif defined(_MSC_VER) && !defined(__clang__) && 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, "") +constexpr ctti_skip skip() noexcept { return detail::make_ctti_skip(40, 10, ""); } #elif defined(_MSC_VER) && !defined(__clang__) && !defined (BOOST_NO_CXX11_NOEXCEPT) // sizeof("const char *__cdecl boost::detail::ctti<") - 1, sizeof(">::n(void) noexcept") - 1 - BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(40, 19, false, "") +constexpr ctti_skip skip() noexcept { return detail::make_ctti_skip(40, 19, ""); } #elif defined(__clang__) && defined(__APPLE__) // Someone made __clang_major__ equal to LLVM version rather than compiler version // on APPLE platform. // // 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 = ") +constexpr ctti_skip skip() noexcept { return detail::make_ctti_skip(39, 1, "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, "") +constexpr ctti_skip skip() noexcept { return detail::make_ctti_skip(39, 6, ""); } #elif defined(__clang__) && (__clang_major__ >= 4 || (__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 = ") +constexpr ctti_skip skip() noexcept { return detail::make_ctti_skip(39, 1, "T = "); } #elif defined(__EDG__) && !defined(BOOST_NO_CXX14_CONSTEXPR) // sizeof("static cha boost::detail::ctti::s() [with I = 40U, T = ") - 1, sizeof("]") - 1 // note: checked on 4.14 - BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(58, 1, false, "") +constexpr ctti_skip skip() noexcept { return detail::make_ctti_skip(58, 1, ""); } #elif defined(__EDG__) && defined(BOOST_NO_CXX14_CONSTEXPR) // sizeof("static const char *boost::detail::ctti::n() [with T = ") - 1, sizeof("]") - 1 // note: checked on 4.14 - BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(57, 1, false, "") +constexpr ctti_skip skip() noexcept { return detail::make_ctti_skip(57, 1, ""); } #elif defined(__GNUC__) && (__GNUC__ < 7) && !defined(BOOST_NO_CXX14_CONSTEXPR) - // sizeof("static constexpr char boost::detail::ctti::s() [with unsigned int I = 0u; T = ") - 1, sizeof("]") - 1 - BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(81, 1, false, "") + // sizeof("static constexpr char boost::detail::ctti::s() [with unsigned int I = 0u; } T = ") - 1, sizeof("]") - 1 +constexpr ctti_skip skip() noexcept { return detail::make_ctti_skip(81, 1, ""); } #elif defined(__GNUC__) && (__GNUC__ >= 7) && !defined(BOOST_NO_CXX14_CONSTEXPR) - // sizeof("static constexpr char boost::detail::ctti::s() [with unsigned int I = 0; T = ") - 1, sizeof("]") - 1 - BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(80, 1, false, "") + // sizeof("static constexpr char boost::detail::ctti::s() [with unsigned int I = 0; } T = ") - 1, sizeof("]") - 1 +constexpr ctti_skip skip() noexcept { return detail::make_ctti_skip(80, 1, ""); } #elif defined(__GNUC__) && defined(BOOST_NO_CXX14_CONSTEXPR) // sizeof("static const char* boost::detail::ctti::n() [with T = ") - 1, sizeof("]") - 1 - BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(57, 1, false, "") +constexpr ctti_skip skip() noexcept { return detail::make_ctti_skip(57, 1, ""); } #elif defined(__ghs__) // sizeof("static const char *boost::detail::ctti::n() [with T = ") - 1, sizeof("]") - 1 - BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(57, 1, false, "") +constexpr ctti_skip skip() noexcept { return detail::make_ctti_skip(57, 1, ""); } #else // Deafult code for other platforms... Just skip nothing! - BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(0, 0, false, "") +constexpr ctti_skip skip() noexcept { return detail::make_ctti_skip(0, 0, ""); } #endif -#undef BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS - -namespace boost { namespace typeindex { namespace detail { template - BOOST_CXX14_CONSTEXPR inline void assert_compile_time_legths() BOOST_NOEXCEPT { - BOOST_STATIC_ASSERT_MSG( + BOOST_CXX14_CONSTEXPR inline void assert_compile_time_legths() noexcept { + static_assert( Condition, "TypeIndex library is misconfigured for your compiler. " "Please define BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING to correct values. See section " @@ -111,8 +124,8 @@ namespace boost { namespace typeindex { namespace detail { } template - BOOST_CXX14_CONSTEXPR inline void failed_to_get_function_name() BOOST_NOEXCEPT { - BOOST_STATIC_ASSERT_MSG( + BOOST_CXX14_CONSTEXPR inline void failed_to_get_function_name() noexcept { + static_assert( sizeof(T) && false, "TypeIndex library could not detect your compiler. " "Please make the BOOST_TYPE_INDEX_FUNCTION_SIGNATURE macro use " @@ -122,7 +135,7 @@ namespace boost { namespace typeindex { namespace detail { } #if defined(BOOST_TYPE_INDEX_DETAIL_IS_CONSTANT) - BOOST_CXX14_CONSTEXPR BOOST_FORCEINLINE bool is_constant_string(const char* str) BOOST_NOEXCEPT { + BOOST_CXX14_CONSTEXPR BOOST_FORCEINLINE bool is_constant_string(const char* str) noexcept { while (BOOST_TYPE_INDEX_DETAIL_IS_CONSTANT(*str)) { if (*str == '\0') return true; @@ -132,17 +145,12 @@ namespace boost { namespace typeindex { namespace detail { } #endif // defined(BOOST_TYPE_INDEX_DETAIL_IS_CONSTANT) - template - BOOST_CXX14_CONSTEXPR inline const char* skip_begining_runtime(const char* begin, boost::false_type) BOOST_NOEXCEPT { - return begin; - } - template BOOST_CXX14_CONSTEXPR inline ForwardIterator1 constexpr_search( ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, - ForwardIterator2 last2) BOOST_NOEXCEPT + ForwardIterator2 last2) noexcept { if (first2 == last2) { return first1; // specified in C++11 @@ -165,7 +173,7 @@ namespace boost { namespace typeindex { namespace detail { return last1; } - BOOST_CXX14_CONSTEXPR inline int constexpr_strcmp_loop(const char *v1, const char *v2) BOOST_NOEXCEPT { + BOOST_CXX14_CONSTEXPR inline int constexpr_strcmp_loop(const char *v1, const char *v2) noexcept { while (*v1 != '\0' && *v1 == *v2) { ++v1; ++v2; @@ -174,7 +182,7 @@ namespace boost { namespace typeindex { namespace detail { return static_cast(*v1) - *v2; } - BOOST_CXX14_CONSTEXPR inline int constexpr_strcmp(const char *v1, const char *v2) BOOST_NOEXCEPT { + BOOST_CXX14_CONSTEXPR inline int constexpr_strcmp(const char *v1, const char *v2) noexcept { #if !defined(BOOST_NO_CXX14_CONSTEXPR) && defined(BOOST_TYPE_INDEX_DETAIL_IS_CONSTANT) && defined(BOOST_TYPE_INDEX_DETAIL_BUILTIN_STRCMP) if (boost::typeindex::detail::is_constant_string(v1) && boost::typeindex::detail::is_constant_string(v2)) return boost::typeindex::detail::constexpr_strcmp_loop(v1, v2); @@ -187,21 +195,21 @@ namespace boost { namespace typeindex { namespace detail { } template - BOOST_CXX14_CONSTEXPR inline const char* skip_begining_runtime(const char* begin, boost::true_type) BOOST_NOEXCEPT { - const char* const it = constexpr_search( + BOOST_CXX14_CONSTEXPR inline const char* skip_begining_runtime(const char* begin) noexcept { + const char* const it = detail::constexpr_search( begin, begin + ArrayLength, - ctti_skip_until_runtime, ctti_skip_until_runtime + sizeof(ctti_skip_until_runtime) - 1 + skip().until_runtime, skip().until_runtime + skip().until_runtime_length ); - return (it == begin + ArrayLength ? begin : it + sizeof(ctti_skip_until_runtime) - 1); + return (it == begin + ArrayLength ? begin : it + skip().until_runtime_length); } template - BOOST_CXX14_CONSTEXPR inline const char* skip_begining(const char* begin) BOOST_NOEXCEPT { - assert_compile_time_legths<(ArrayLength > ctti_skip_size_at_begin + ctti_skip_size_at_end)>(); - return skip_begining_runtime( - begin + ctti_skip_size_at_begin, - boost::integral_constant() - ); + BOOST_CXX14_CONSTEXPR inline const char* skip_begining(const char* begin) noexcept { + detail::assert_compile_time_legths<(ArrayLength > skip().size_at_begin + skip().size_at_end)>(); + return skip().until_runtime_length + ? detail::skip_begining_runtime(begin + skip().size_at_begin) + : begin + skip().size_at_begin + ; } #if !defined(__clang__) && defined(__GNUC__) && !defined(BOOST_NO_CXX14_CONSTEXPR) @@ -257,7 +265,7 @@ struct ctti { #if !defined(__clang__) && defined(__GNUC__) && !defined(BOOST_NO_CXX14_CONSTEXPR) //helper functions template - constexpr static char s() BOOST_NOEXCEPT { // step + constexpr static char s() noexcept { // step constexpr unsigned int offset = (I >= 10u ? 1u : 0u) + (I >= 100u ? 1u : 0u) @@ -277,12 +285,12 @@ struct ctti { } template - constexpr static const char* impl(::boost::typeindex::detail::index_seq ) BOOST_NOEXCEPT { + constexpr static const char* impl(::boost::typeindex::detail::index_seq ) noexcept { return ::boost::typeindex::detail::cstring()...>::data_; } template // `D` means `Dummy` - constexpr static const char* n() BOOST_NOEXCEPT { + constexpr static const char* n() noexcept { #if defined(BOOST_TYPE_INDEX_FUNCTION_SIGNATURE) constexpr unsigned int size = sizeof(BOOST_TYPE_INDEX_FUNCTION_SIGNATURE); #elif defined(__FUNCSIG__) @@ -300,19 +308,19 @@ struct ctti { #endif boost::typeindex::detail::assert_compile_time_legths< - (size > boost::typeindex::detail::ctti_skip_size_at_begin + boost::typeindex::detail::ctti_skip_size_at_end + sizeof("const *") - 1) + (size > boost::typeindex::detail::skip().size_at_begin + boost::typeindex::detail::skip().size_at_end + sizeof("const *") - 1) >(); - static_assert(!boost::typeindex::detail::ctti_skip_more_at_runtime, "Skipping for GCC in C++14 mode is unsupported"); + static_assert(!boost::typeindex::detail::skip().until_runtime_length, "Skipping for GCC in C++14 mode is unsupported"); typedef typename boost::typeindex::detail::make_index_seq_impl< - boost::typeindex::detail::ctti_skip_size_at_begin, - size - sizeof("const *") + 1 - boost::typeindex::detail::ctti_skip_size_at_begin + boost::typeindex::detail::skip().size_at_begin, + size - sizeof("const *") + 1 - boost::typeindex::detail::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 - BOOST_CXX14_CONSTEXPR static const char* n() BOOST_NOEXCEPT { + BOOST_CXX14_CONSTEXPR static const char* n() 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__) @@ -336,4 +344,6 @@ struct ctti { }} // namespace boost::detail + + #endif // BOOST_TYPE_INDEX_DETAIL_COMPILE_TIME_TYPE_INFO_HPP diff --git a/include/boost/type_index/detail/ctti_register_class.hpp b/include/boost/type_index/detail/ctti_register_class.hpp index ba1f068..9c69d49 100644 --- a/include/boost/type_index/detail/ctti_register_class.hpp +++ b/include/boost/type_index/detail/ctti_register_class.hpp @@ -22,17 +22,17 @@ namespace boost { namespace typeindex { namespace detail { template -inline const ctti_data& ctti_construct_typeid_ref(const T*) BOOST_NOEXCEPT { - return ctti_construct(); +inline const ctti_data& ctti_construct_typeid_ref(const T*) noexcept { + return boost::typeindex::ctti_construct(); } }}} // namespace boost::typeindex::detail /// @cond -#define BOOST_TYPE_INDEX_REGISTER_CLASS \ - virtual const boost::typeindex::detail::ctti_data& boost_type_index_type_id_runtime_() const BOOST_NOEXCEPT { \ - return boost::typeindex::detail::ctti_construct_typeid_ref(this); \ - } \ +#define BOOST_TYPE_INDEX_REGISTER_CLASS \ + virtual const boost::typeindex::detail::ctti_data& boost_type_index_type_id_runtime_() const noexcept { \ + return boost::typeindex::detail::ctti_construct_typeid_ref(this); \ + } \ /**/ /// @endcond diff --git a/include/boost/type_index/detail/stl_register_class.hpp b/include/boost/type_index/detail/stl_register_class.hpp index 590fc96..20eb818 100644 --- a/include/boost/type_index/detail/stl_register_class.hpp +++ b/include/boost/type_index/detail/stl_register_class.hpp @@ -22,17 +22,17 @@ namespace boost { namespace typeindex { namespace detail { template -inline const stl_type_index::type_info_t& stl_construct_typeid_ref(const T*) BOOST_NOEXCEPT { +inline const stl_type_index::type_info_t& stl_construct_typeid_ref(const T*) noexcept { return typeid(T); } }}} // namespace boost::typeindex::detail /// @cond -#define BOOST_TYPE_INDEX_REGISTER_CLASS \ - virtual const boost::typeindex::stl_type_index::type_info_t& boost_type_index_type_id_runtime_() const BOOST_NOEXCEPT { \ - return boost::typeindex::detail::stl_construct_typeid_ref(this); \ - } \ +#define BOOST_TYPE_INDEX_REGISTER_CLASS \ + virtual const boost::typeindex::stl_type_index::type_info_t& boost_type_index_type_id_runtime_() const noexcept { \ + return boost::typeindex::detail::stl_construct_typeid_ref(this); \ + } \ /**/ /// @endcond diff --git a/include/boost/type_index/runtime_cast/boost_shared_ptr_cast.hpp b/include/boost/type_index/runtime_cast/boost_shared_ptr_cast.hpp index aaf7122..2664c01 100644 --- a/include/boost/type_index/runtime_cast/boost_shared_ptr_cast.hpp +++ b/include/boost/type_index/runtime_cast/boost_shared_ptr_cast.hpp @@ -14,7 +14,8 @@ /// boost::shared_ptr types. #include -#include + +#include #ifdef BOOST_HAS_PRAGMA_ONCE # pragma once @@ -38,7 +39,7 @@ namespace boost { namespace typeindex { /// If no such conversion exists, returns boost::shared_ptr(); template boost::shared_ptr runtime_pointer_cast(boost::shared_ptr const& u) { - T* value = detail::runtime_cast_impl(u.get(), boost::is_base_and_derived()); + T* value = detail::runtime_cast_impl(u.get(), std::is_base_of()); if(value) return boost::shared_ptr(u, value); return boost::shared_ptr(); diff --git a/include/boost/type_index/runtime_cast/detail/runtime_cast_impl.hpp b/include/boost/type_index/runtime_cast/detail/runtime_cast_impl.hpp index 6181df6..12a1b0e 100644 --- a/include/boost/type_index/runtime_cast/detail/runtime_cast_impl.hpp +++ b/include/boost/type_index/runtime_cast/detail/runtime_cast_impl.hpp @@ -18,7 +18,8 @@ /// desire opt in functionality instead of enabling it system wide. #include -#include + +#include #ifdef BOOST_HAS_PRAGMA_ONCE # pragma once @@ -29,24 +30,24 @@ namespace boost { namespace typeindex { namespace detail { template -T* runtime_cast_impl(U* u, boost::true_type) BOOST_NOEXCEPT { +T* runtime_cast_impl(U* u, std::integral_constant) noexcept { return u; } template -T const* runtime_cast_impl(U const* u, boost::true_type) BOOST_NOEXCEPT { +T const* runtime_cast_impl(U const* u, std::integral_constant) noexcept { return u; } template -T* runtime_cast_impl(U* u, boost::false_type) BOOST_NOEXCEPT { +T* runtime_cast_impl(U* u, std::integral_constant) noexcept { return const_cast(static_cast( u->boost_type_index_find_instance_(boost::typeindex::type_id()) )); } template -T const* runtime_cast_impl(U const* u, boost::false_type) BOOST_NOEXCEPT { +T const* runtime_cast_impl(U const* u, std::integral_constant) noexcept { return static_cast(u->boost_type_index_find_instance_(boost::typeindex::type_id())); } diff --git a/include/boost/type_index/runtime_cast/pointer_cast.hpp b/include/boost/type_index/runtime_cast/pointer_cast.hpp index 49a7613..e4f94c1 100644 --- a/include/boost/type_index/runtime_cast/pointer_cast.hpp +++ b/include/boost/type_index/runtime_cast/pointer_cast.hpp @@ -14,8 +14,7 @@ /// pointer types. #include #include -#include -#include + #ifdef BOOST_HAS_PRAGMA_ONCE # pragma once @@ -27,22 +26,22 @@ namespace boost { namespace typeindex { /// \tparam T The desired target type. Like dynamic_cast, must be a pointer to complete class type. /// \tparam U A complete class type of the source instance, u. /// \return If there exists a valid conversion from U* to T, returns a T that points to -/// an address suitably offset from u. If no such conversion exists, returns NULL. +/// an address suitably offset from u. If no such conversion exists, returns nullptr. template -T runtime_cast(U* u) BOOST_NOEXCEPT { - typedef typename boost::remove_pointer::type impl_type; - return detail::runtime_cast_impl(u, boost::is_base_and_derived()); +T runtime_cast(U* u) noexcept { + typedef typename std::remove_pointer::type impl_type; + return detail::runtime_cast_impl(u, std::is_base_of()); } /// \brief Safely converts pointers to classes up, down, and sideways along the inheritance hierarchy. /// \tparam T The desired target type. Like dynamic_cast, must be a pointer to complete class type. /// \tparam U A complete class type of the source instance, u. /// \return If there exists a valid conversion from U* to T, returns a T that points to -/// an address suitably offset from u. If no such conversion exists, returns NULL. +/// an address suitably offset from u. If no such conversion exists, returns nullptr. template -T runtime_cast(U const* u) BOOST_NOEXCEPT { - typedef typename boost::remove_pointer::type impl_type; - return detail::runtime_cast_impl(u, boost::is_base_and_derived()); +T runtime_cast(U const* u) noexcept { + typedef typename std::remove_pointer::type impl_type; + return detail::runtime_cast_impl(u, std::is_base_of()); } /// \brief Safely converts pointers to classes up, down, and sideways along the inheritance @@ -51,10 +50,10 @@ T runtime_cast(U const* u) BOOST_NOEXCEPT { /// \tparam U A complete class type of the source instance, u. /// \return If there exists a valid conversion from U const* to T*, returns a T* /// that points to an address suitably offset from u. -/// If no such conversion exists, returns NULL. +/// If no such conversion exists, returns nullptr. template -T* runtime_pointer_cast(U* u) BOOST_NOEXCEPT { - return detail::runtime_cast_impl(u, boost::is_base_and_derived()); +T* runtime_pointer_cast(U* u) noexcept { + return detail::runtime_cast_impl(u, std::is_base_of()); } /// \brief Safely converts pointers to classes up, down, and sideways along the inheritance @@ -63,10 +62,10 @@ T* runtime_pointer_cast(U* u) BOOST_NOEXCEPT { /// \tparam U A complete class type of the source instance, u. /// \return If there exists a valid conversion from U const* to T const*, returns a T const* /// that points to an address suitably offset from u. -/// If no such conversion exists, returns NULL. +/// If no such conversion exists, returns nullptr. template -T const* runtime_pointer_cast(U const* u) BOOST_NOEXCEPT { - return detail::runtime_cast_impl(u, boost::is_base_and_derived()); +T const* runtime_pointer_cast(U const* u) noexcept { + return detail::runtime_cast_impl(u, std::is_base_of()); } }} // namespace boost::typeindex diff --git a/include/boost/type_index/runtime_cast/reference_cast.hpp b/include/boost/type_index/runtime_cast/reference_cast.hpp index 1511f7d..674a289 100644 --- a/include/boost/type_index/runtime_cast/reference_cast.hpp +++ b/include/boost/type_index/runtime_cast/reference_cast.hpp @@ -13,12 +13,11 @@ /// \brief Contains the overload of boost::typeindex::runtime_cast for /// reference types. -#include #include #include -#include -#include -#include + +#include +#include #ifdef BOOST_HAS_PRAGMA_ONCE # pragma once @@ -28,7 +27,7 @@ namespace boost { namespace typeindex { /// \brief Indicates that runtime_cast was unable to perform the desired cast operation /// because the source instance was not also an instance of the target type. -struct bad_runtime_cast : std::exception +struct BOOST_SYMBOL_VISIBLE bad_runtime_cast : std::exception {}; /// \brief Safely converts references to classes up, down, and sideways along the inheritance hierarchy. @@ -37,10 +36,10 @@ struct bad_runtime_cast : std::exception /// \return If there exists a valid conversion from U& to T, returns a T that references an address /// suitably offset from u. If no such conversion exists, throws boost::typeindex::bad_runtime_cast. template -typename boost::add_reference::type runtime_cast(U& u) { - typedef typename boost::remove_reference::type impl_type; +typename std::add_lvalue_reference::type runtime_cast(U& u) { + typedef typename std::remove_reference::type impl_type; impl_type* value = detail::runtime_cast_impl( - boost::addressof(u), boost::is_base_and_derived()); + std::addressof(u), std::is_base_of()); if(!value) BOOST_THROW_EXCEPTION(bad_runtime_cast()); return *value; @@ -52,10 +51,10 @@ typename boost::add_reference::type runtime_cast(U& u) { /// \return If there exists a valid conversion from U const& to T const, returns a T const that references an address /// suitably offset from u. If no such conversion exists, throws boost::typeindex::bad_runtime_cast. template -typename boost::add_reference::type runtime_cast(U const& u) { - typedef typename boost::remove_reference::type impl_type; +typename std::add_lvalue_reference::type runtime_cast(U const& u) { + typedef typename std::remove_reference::type impl_type; impl_type* value = detail::runtime_cast_impl( - boost::addressof(u), boost::is_base_and_derived()); + std::addressof(u), std::is_base_of()); if(!value) BOOST_THROW_EXCEPTION(bad_runtime_cast()); return *value; diff --git a/include/boost/type_index/runtime_cast/register_runtime_class.hpp b/include/boost/type_index/runtime_cast/register_runtime_class.hpp index ab758a5..957224e 100644 --- a/include/boost/type_index/runtime_cast/register_runtime_class.hpp +++ b/include/boost/type_index/runtime_cast/register_runtime_class.hpp @@ -13,31 +13,34 @@ /// \brief Contains the macros BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST and /// BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS #include -#include #ifdef BOOST_HAS_PRAGMA_ONCE # pragma once #endif -namespace boost { namespace typeindex { - -namespace detail { +namespace boost { namespace typeindex { namespace detail { template inline type_index runtime_class_construct_type_id(T const*) { - return type_id(); + return boost::typeindex::type_id(); } -} // namespace detail +template +constexpr const void* find_instance(boost::typeindex::type_index const&, const Self*) noexcept { + return nullptr; +} -}} // namespace boost::typeindex +template +const void* find_instance(boost::typeindex::type_index const& idx, const Self* self) noexcept { + if (const void* ptr = self->Base::boost_type_index_find_instance_(idx)) { + return ptr; + } -/// @cond + return boost::typeindex::detail::find_instance(idx, self); +} -#define BOOST_TYPE_INDEX_CHECK_BASE_(r, data, Base) \ - if(void const* ret_val = this->Base::boost_type_index_find_instance_(idx)) return ret_val; +}}} // namespace boost::typeindex::detail -/// @endcond /// \def BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS /// \brief Macro used to make a class compatible with boost::typeindex::runtime_cast @@ -55,21 +58,21 @@ inline type_index runtime_class_construct_type_id(T const*) { /// \b Example: /// \code /// struct base1 { -/// BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(BOOST_TYPE_INDEX_NO_BASE_CLASS) +/// BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS() /// virtual ~base1(); /// }; /// /// struct base2 { -/// BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(BOOST_TYPE_INDEX_NO_BASE_CLASS) +/// BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS() /// virtual ~base2(); /// }; /// /// struct derived1 : base1 { -/// BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS((base1)) +/// BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(base1) /// }; /// /// struct derived2 : base1, base2 { -/// BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS((base1)(base2)) +/// BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(base1, base2) /// }; /// /// ... @@ -82,9 +85,9 @@ inline type_index runtime_class_construct_type_id(T const*) { /// /// \param base_class_seq A Boost.Preprocessor sequence of the current class' direct bases, or /// BOOST_TYPE_INDEX_NO_BASE_CLASS if this class has no direct base classes. -#define BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(base_class_seq) \ - BOOST_TYPE_INDEX_REGISTER_CLASS \ - BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(base_class_seq) +#define BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(...) \ + BOOST_TYPE_INDEX_REGISTER_CLASS \ + BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(__VA_ARGS__) /// \def BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST /// \brief Macro used to make a class compatible with boost::typeindex::runtime_cast without including @@ -96,21 +99,21 @@ inline type_index runtime_class_construct_type_id(T const*) { /// \b Example: /// \code /// struct base1 { -/// BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(BOOST_TYPE_INDEX_NO_BASE_CLASS) +/// BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST() /// virtual ~base1(); /// }; /// /// struct base2 { -/// BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(BOOST_TYPE_INDEX_NO_BASE_CLASS) +/// BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST() /// virtual ~base2(); /// }; /// /// struct derived1 : base1 { -/// BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST((base1)) +/// BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(base1) /// }; /// /// struct derived2 : base1, base2 { -/// BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST((base1)(base2)) +/// BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(base1, base2) /// }; /// /// ... @@ -122,17 +125,17 @@ inline type_index runtime_class_construct_type_id(T const*) { /// /// \param base_class_seq A Boost.Preprocessor sequence of the current class' direct bases, or /// BOOST_TYPE_INDEX_NO_BASE_CLASS if this class has no direct base classes. -#define BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(base_class_seq) \ - virtual void const* boost_type_index_find_instance_(boost::typeindex::type_index const& idx) const BOOST_NOEXCEPT { \ - if(idx == boost::typeindex::detail::runtime_class_construct_type_id(this)) \ - return this; \ - BOOST_PP_SEQ_FOR_EACH(BOOST_TYPE_INDEX_CHECK_BASE_, _, base_class_seq) \ - return NULL; \ +#define BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(...) \ + virtual void const* boost_type_index_find_instance_(boost::typeindex::type_index const& idx) const noexcept { \ + if(idx == boost::typeindex::detail::runtime_class_construct_type_id(this)) \ + return this; \ + return boost::typeindex::detail::find_instance<__VA_ARGS__>(idx, this); \ } /// \def BOOST_TYPE_INDEX_NO_BASE_CLASS /// \brief Instructs BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS and BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST /// that this class has no base classes. -#define BOOST_TYPE_INDEX_NO_BASE_CLASS BOOST_PP_SEQ_NIL +/// \deprecated Just remove and use BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS() or BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST() +#define BOOST_TYPE_INDEX_NO_BASE_CLASS /**/ #endif // BOOST_TYPE_INDEX_RUNTIME_CAST_REGISTER_RUNTIME_CLASS_HPP diff --git a/include/boost/type_index/runtime_cast/std_shared_ptr_cast.hpp b/include/boost/type_index/runtime_cast/std_shared_ptr_cast.hpp index 277a524..7b09db5 100644 --- a/include/boost/type_index/runtime_cast/std_shared_ptr_cast.hpp +++ b/include/boost/type_index/runtime_cast/std_shared_ptr_cast.hpp @@ -14,7 +14,6 @@ /// std::shared_ptr types. #include -#include #include #ifdef BOOST_HAS_PRAGMA_ONCE @@ -35,7 +34,7 @@ namespace boost { namespace typeindex { /// If no such conversion exists, returns std::shared_ptr(); template std::shared_ptr runtime_pointer_cast(std::shared_ptr const& u) { - T* value = detail::runtime_cast_impl(u.get(), boost::is_base_and_derived()); + T* value = detail::runtime_cast_impl(u.get(), std::is_base_of()); if(value) return std::shared_ptr(u, value); return std::shared_ptr(); diff --git a/include/boost/type_index/stl_type_index.hpp b/include/boost/type_index/stl_type_index.hpp index 06c3cac..66d66e2 100644 --- a/include/boost/type_index/stl_type_index.hpp +++ b/include/boost/type_index/stl_type_index.hpp @@ -29,30 +29,9 @@ #include #include // std::strcmp, std::strlen, std::strstr #include -#include +#include #include #include -#include -#include -#include -#include -#include -#include - -#if (defined(_MSC_VER) && _MSC_VER > 1600) \ - || (defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ > 5 && defined(__GXX_EXPERIMENTAL_CXX0X__)) \ - || (defined(__GNUC__) && __GNUC__ > 4 && __cplusplus >= 201103) -# define BOOST_TYPE_INDEX_STD_TYPE_INDEX_HAS_HASH_CODE -#else -# include -#endif - -#if (defined(__EDG_VERSION__) && __EDG_VERSION__ < 245) \ - || (defined(__sgi) && defined(_COMPILER_VERSION) && _COMPILER_VERSION <= 744) -# include -# include -# include -#endif #ifdef BOOST_HAS_PRAGMA_ONCE # pragma once @@ -86,40 +65,40 @@ private: const type_info_t* data_; public: - inline stl_type_index() BOOST_NOEXCEPT + inline stl_type_index() noexcept : data_(&typeid(void)) {} - inline stl_type_index(const type_info_t& data) BOOST_NOEXCEPT + inline stl_type_index(const type_info_t& data) noexcept : data_(&data) {} - inline const type_info_t& type_info() const BOOST_NOEXCEPT; + inline const type_info_t& type_info() const noexcept; - inline const char* raw_name() const BOOST_NOEXCEPT; - inline const char* name() const BOOST_NOEXCEPT; + inline const char* raw_name() const noexcept; + inline const char* name() const noexcept; inline std::string pretty_name() const; - inline std::size_t hash_code() const BOOST_NOEXCEPT; - inline bool equal(const stl_type_index& rhs) const BOOST_NOEXCEPT; - inline bool before(const stl_type_index& rhs) const BOOST_NOEXCEPT; + inline std::size_t hash_code() const noexcept; + inline bool equal(const stl_type_index& rhs) const noexcept; + inline bool before(const stl_type_index& rhs) const noexcept; template - inline static stl_type_index type_id() BOOST_NOEXCEPT; + inline static stl_type_index type_id() noexcept; template - inline static stl_type_index type_id_with_cvr() BOOST_NOEXCEPT; + inline static stl_type_index type_id_with_cvr() noexcept; template - inline static stl_type_index type_id_runtime(const T& value) BOOST_NOEXCEPT; + inline static stl_type_index type_id_runtime(const T& value) noexcept; }; -inline const stl_type_index::type_info_t& stl_type_index::type_info() const BOOST_NOEXCEPT { +inline const stl_type_index::type_info_t& stl_type_index::type_info() const noexcept { return *data_; } -inline const char* stl_type_index::raw_name() const BOOST_NOEXCEPT { +inline const char* stl_type_index::raw_name() const noexcept { #ifdef _MSC_VER return data_->raw_name(); #else @@ -127,7 +106,7 @@ inline const char* stl_type_index::raw_name() const BOOST_NOEXCEPT { #endif } -inline const char* stl_type_index::name() const BOOST_NOEXCEPT { +inline const char* stl_type_index::name() const noexcept { return data_->name(); } @@ -180,12 +159,8 @@ inline std::string stl_type_index::pretty_name() const { } -inline std::size_t stl_type_index::hash_code() const BOOST_NOEXCEPT { -#ifdef BOOST_TYPE_INDEX_STD_TYPE_INDEX_HAS_HASH_CODE +inline std::size_t stl_type_index::hash_code() const noexcept { return data_->hash_code(); -#else - return boost::hash_range(raw_name(), raw_name() + std::strlen(raw_name())); -#endif } @@ -203,7 +178,7 @@ inline std::size_t stl_type_index::hash_code() const BOOST_NOEXCEPT { /// @endcond -inline bool stl_type_index::equal(const stl_type_index& rhs) const BOOST_NOEXCEPT { +inline bool stl_type_index::equal(const stl_type_index& rhs) const noexcept { #ifdef BOOST_TYPE_INDEX_CLASSINFO_COMPARE_BY_NAMES return raw_name() == rhs.raw_name() || !std::strcmp(raw_name(), rhs.raw_name()); #else @@ -211,7 +186,7 @@ inline bool stl_type_index::equal(const stl_type_index& rhs) const BOOST_NOEXCEP #endif } -inline bool stl_type_index::before(const stl_type_index& rhs) const BOOST_NOEXCEPT { +inline bool stl_type_index::before(const stl_type_index& rhs) const noexcept { #ifdef BOOST_TYPE_INDEX_CLASSINFO_COMPARE_BY_NAMES return raw_name() != rhs.raw_name() && std::strcmp(raw_name(), rhs.raw_name()) < 0; #else @@ -223,26 +198,9 @@ inline bool stl_type_index::before(const stl_type_index& rhs) const BOOST_NOEXCE template -inline stl_type_index stl_type_index::type_id() BOOST_NOEXCEPT { - typedef BOOST_DEDUCED_TYPENAME boost::remove_reference::type no_ref_t; - typedef BOOST_DEDUCED_TYPENAME boost::remove_cv::type no_cvr_prefinal_t; - - # if (defined(__EDG_VERSION__) && __EDG_VERSION__ < 245) \ - || (defined(__sgi) && defined(_COMPILER_VERSION) && _COMPILER_VERSION <= 744) - - // Old EDG-based compilers seem to mistakenly distinguish 'integral' from 'signed integral' - // in typeid() expressions. Full template specialization for 'integral' fixes that issue: - typedef BOOST_DEDUCED_TYPENAME boost::conditional< - boost::is_signed::value, - boost::make_signed, - boost::type_identity - >::type no_cvr_prefinal_lazy_t; - - typedef BOOST_DEDUCED_TYPENAME no_cvr_prefinal_t::type no_cvr_t; - #else - typedef no_cvr_prefinal_t no_cvr_t; - #endif - +inline stl_type_index stl_type_index::type_id() noexcept { + typedef typename std::remove_reference::type no_ref_t; + typedef typename std::remove_cv::type no_cvr_t; return typeid(no_cvr_t); } @@ -251,9 +209,9 @@ namespace detail { } template -inline stl_type_index stl_type_index::type_id_with_cvr() BOOST_NOEXCEPT { - typedef BOOST_DEDUCED_TYPENAME boost::conditional< - boost::is_reference::value || boost::is_const::value || boost::is_volatile::value, +inline stl_type_index stl_type_index::type_id_with_cvr() noexcept { + typedef typename std::conditional< + std::is_reference::value || std::is_const::value || std::is_volatile::value, detail::cvr_saver, T >::type type; @@ -263,7 +221,7 @@ inline stl_type_index stl_type_index::type_id_with_cvr() BOOST_NOEXCEPT { template -inline stl_type_index stl_type_index::type_id_runtime(const T& value) BOOST_NOEXCEPT { +inline stl_type_index stl_type_index::type_id_runtime(const T& value) noexcept { #ifdef BOOST_NO_RTTI return value.boost_type_index_type_id_runtime_(); #else @@ -273,6 +231,4 @@ inline stl_type_index stl_type_index::type_id_runtime(const T& value) BOOST_NOEX }} // namespace boost::typeindex -#undef BOOST_TYPE_INDEX_STD_TYPE_INDEX_HAS_HASH_CODE - #endif // BOOST_TYPE_INDEX_STL_TYPE_INDEX_HPP diff --git a/include/boost/type_index/type_index_facade.hpp b/include/boost/type_index/type_index_facade.hpp index 4145aa4..e4691af 100644 --- a/include/boost/type_index/type_index_facade.hpp +++ b/include/boost/type_index/type_index_facade.hpp @@ -13,14 +13,8 @@ #include #include #include - -#if !defined(BOOST_NO_IOSTREAM) -#if !defined(BOOST_NO_IOSFWD) +#include #include // for std::basic_ostream -#else -#include -#endif -#endif #ifdef BOOST_HAS_PRAGMA_ONCE # pragma once @@ -62,7 +56,7 @@ template class type_index_facade { private: /// @cond - BOOST_CXX14_CONSTEXPR const Derived & derived() const BOOST_NOEXCEPT { + BOOST_CXX14_CONSTEXPR const Derived & derived() const noexcept { return *static_cast(this); } /// @endcond @@ -71,7 +65,7 @@ public: /// \b Override: This function \b may be redefined in Derived class. Overrides \b must not throw. /// \return Name of a type. By default returns Derived::raw_name(). - inline const char* name() const BOOST_NOEXCEPT { + inline const char* name() const noexcept { return derived().raw_name(); } @@ -83,7 +77,7 @@ public: /// \b Override: This function \b may be redefined in Derived class. Overrides \b must not throw. /// \return True if two types are equal. By default compares types by raw_name(). - inline bool equal(const Derived& rhs) const BOOST_NOEXCEPT { + inline bool equal(const Derived& rhs) const noexcept { const char* const left = derived().raw_name(); const char* const right = rhs.raw_name(); return left == right || !std::strcmp(left, right); @@ -91,7 +85,7 @@ public: /// \b Override: This function \b may be redefined in Derived class. Overrides \b must not throw. /// \return True if rhs is greater than this. By default compares types by raw_name(). - inline bool before(const Derived& rhs) const BOOST_NOEXCEPT { + inline bool before(const Derived& rhs) const noexcept { const char* const left = derived().raw_name(); const char* const right = rhs.raw_name(); return left != right && std::strcmp(left, right) < 0; @@ -101,7 +95,7 @@ public: /// \return Hash code of a type. By default hashes types by raw_name(). /// \note Derived class header \b must include , \b unless this function is redefined in /// Derived class to not use boost::hash_range(). - inline std::size_t hash_code() const BOOST_NOEXCEPT { + inline std::size_t hash_code() const noexcept { const char* const name_raw = derived().raw_name(); return boost::hash_range(name_raw, name_raw + std::strlen(name_raw)); } @@ -110,11 +104,11 @@ public: protected: /// \b Override: This function \b must be redefined in Derived class. Overrides \b must not throw. /// \return Pointer to unredable/raw type name. - inline const char* raw_name() const BOOST_NOEXCEPT; + inline const char* raw_name() const noexcept; /// \b Override: This function \b may be redefined in Derived class. Overrides \b must not throw. /// \return Const reference to underlying low level type_info_t. - inline const type_info_t& type_info() const BOOST_NOEXCEPT; + inline const type_info_t& type_info() const noexcept; /// This is a factory method that is used to create instances of Derived classes. /// boost::typeindex::type_id() will call this method, if Derived has same type as boost::typeindex::type_index. @@ -124,7 +118,7 @@ protected: /// \tparam T Type for which type_index must be created. /// \return type_index for type T. template - static Derived type_id() BOOST_NOEXCEPT; + static Derived type_id() noexcept; /// This is a factory method that is used to create instances of Derived classes. /// boost::typeindex::type_id_with_cvr() will call this method, if Derived has same type as boost::typeindex::type_index. @@ -134,7 +128,7 @@ protected: /// \tparam T Type for which type_index must be created. /// \return type_index for type T. template - static Derived type_id_with_cvr() BOOST_NOEXCEPT; + static Derived type_id_with_cvr() noexcept; /// This is a factory method that is used to create instances of Derived classes. /// boost::typeindex::type_id_runtime(const T&) will call this method, if Derived has same type as boost::typeindex::type_index. @@ -143,7 +137,7 @@ protected: /// \param variable Variable which runtime type will be stored in type_index. /// \return type_index with runtime type of variable. template - static Derived type_id_runtime(const T& variable) BOOST_NOEXCEPT; + static Derived type_id_runtime(const T& variable) noexcept; #endif @@ -151,96 +145,96 @@ protected: /// @cond template -BOOST_CXX14_CONSTEXPR inline bool operator == (const type_index_facade& lhs, const type_index_facade& rhs) BOOST_NOEXCEPT { +BOOST_CXX14_CONSTEXPR inline bool operator == (const type_index_facade& lhs, const type_index_facade& rhs) noexcept { return static_cast(lhs).equal(static_cast(rhs)); } template -BOOST_CXX14_CONSTEXPR inline bool operator < (const type_index_facade& lhs, const type_index_facade& rhs) BOOST_NOEXCEPT { +BOOST_CXX14_CONSTEXPR inline bool operator < (const type_index_facade& lhs, const type_index_facade& rhs) noexcept { return static_cast(lhs).before(static_cast(rhs)); } template -BOOST_CXX14_CONSTEXPR inline bool operator > (const type_index_facade& lhs, const type_index_facade& rhs) BOOST_NOEXCEPT { +BOOST_CXX14_CONSTEXPR inline bool operator > (const type_index_facade& lhs, const type_index_facade& rhs) noexcept { return rhs < lhs; } template -BOOST_CXX14_CONSTEXPR inline bool operator <= (const type_index_facade& lhs, const type_index_facade& rhs) BOOST_NOEXCEPT { +BOOST_CXX14_CONSTEXPR inline bool operator <= (const type_index_facade& lhs, const type_index_facade& rhs) noexcept { return !(lhs > rhs); } template -BOOST_CXX14_CONSTEXPR inline bool operator >= (const type_index_facade& lhs, const type_index_facade& rhs) BOOST_NOEXCEPT { +BOOST_CXX14_CONSTEXPR inline bool operator >= (const type_index_facade& lhs, const type_index_facade& rhs) noexcept { return !(lhs < rhs); } template -BOOST_CXX14_CONSTEXPR inline bool operator != (const type_index_facade& lhs, const type_index_facade& rhs) BOOST_NOEXCEPT { +BOOST_CXX14_CONSTEXPR inline bool operator != (const type_index_facade& lhs, const type_index_facade& rhs) noexcept { return !(lhs == rhs); } // ######################### COMPARISONS with Derived ############################ // template -inline bool operator == (const TypeInfo& lhs, const type_index_facade& rhs) BOOST_NOEXCEPT { +inline bool operator == (const TypeInfo& lhs, const type_index_facade& rhs) noexcept { return Derived(lhs) == rhs; } template -inline bool operator < (const TypeInfo& lhs, const type_index_facade& rhs) BOOST_NOEXCEPT { +inline bool operator < (const TypeInfo& lhs, const type_index_facade& rhs) noexcept { return Derived(lhs) < rhs; } template -inline bool operator > (const TypeInfo& lhs, const type_index_facade& rhs) BOOST_NOEXCEPT { +inline bool operator > (const TypeInfo& lhs, const type_index_facade& rhs) noexcept { return rhs < Derived(lhs); } template -inline bool operator <= (const TypeInfo& lhs, const type_index_facade& rhs) BOOST_NOEXCEPT { +inline bool operator <= (const TypeInfo& lhs, const type_index_facade& rhs) noexcept { return !(Derived(lhs) > rhs); } template -inline bool operator >= (const TypeInfo& lhs, const type_index_facade& rhs) BOOST_NOEXCEPT { +inline bool operator >= (const TypeInfo& lhs, const type_index_facade& rhs) noexcept { return !(Derived(lhs) < rhs); } template -inline bool operator != (const TypeInfo& lhs, const type_index_facade& rhs) BOOST_NOEXCEPT { +inline bool operator != (const TypeInfo& lhs, const type_index_facade& rhs) noexcept { return !(Derived(lhs) == rhs); } template -inline bool operator == (const type_index_facade& lhs, const TypeInfo& rhs) BOOST_NOEXCEPT { +inline bool operator == (const type_index_facade& lhs, const TypeInfo& rhs) noexcept { return lhs == Derived(rhs); } template -inline bool operator < (const type_index_facade& lhs, const TypeInfo& rhs) BOOST_NOEXCEPT { +inline bool operator < (const type_index_facade& lhs, const TypeInfo& rhs) noexcept { return lhs < Derived(rhs); } template -inline bool operator > (const type_index_facade& lhs, const TypeInfo& rhs) BOOST_NOEXCEPT { +inline bool operator > (const type_index_facade& lhs, const TypeInfo& rhs) noexcept { return Derived(rhs) < lhs; } template -inline bool operator <= (const type_index_facade& lhs, const TypeInfo& rhs) BOOST_NOEXCEPT { +inline bool operator <= (const type_index_facade& lhs, const TypeInfo& rhs) noexcept { return !(lhs > Derived(rhs)); } template -inline bool operator >= (const type_index_facade& lhs, const TypeInfo& rhs) BOOST_NOEXCEPT { +inline bool operator >= (const type_index_facade& lhs, const TypeInfo& rhs) noexcept { return !(lhs < Derived(rhs)); } template -inline bool operator != (const type_index_facade& lhs, const TypeInfo& rhs) BOOST_NOEXCEPT { +inline bool operator != (const type_index_facade& lhs, const TypeInfo& rhs) noexcept { return !(lhs == Derived(rhs)); } @@ -262,16 +256,6 @@ bool operator ==, !=, <, ... (const TypeInfo& lhs, const type_index_facade& rhs) #endif #ifndef BOOST_NO_IOSTREAM -#ifdef BOOST_NO_TEMPLATED_IOSTREAMS -/// @cond -/// Ostream operator that will output demangled name -template -inline std::ostream& operator<<(std::ostream& ostr, const type_index_facade& ind) { - ostr << static_cast(ind).pretty_name(); - return ostr; -} -/// @endcond -#else /// Ostream operator that will output demangled name. template inline std::basic_ostream& operator<<( @@ -281,13 +265,12 @@ inline std::basic_ostream& operator<<( ostr << static_cast(ind).pretty_name(); return ostr; } -#endif // BOOST_NO_TEMPLATED_IOSTREAMS #endif // BOOST_NO_IOSTREAM /// This free function is used by Boost's unordered containers. /// \note has to be included if this function is used. template -inline std::size_t hash_value(const type_index_facade& lhs) BOOST_NOEXCEPT { +inline std::size_t hash_value(const type_index_facade& lhs) noexcept { return static_cast(lhs).hash_code(); } diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index d57275b..202abd5 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -8,6 +8,14 @@ import testing ; import feature ; import os ; +import ../../config/checks/config : requires ; + +project + : source-location . + : requirements + [ requires cxx11 ] + ; + # Variable that contains all the stuff required for linking together on and off compat = BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY ; diff --git a/test/type_index_runtime_cast_test.cpp b/test/type_index_runtime_cast_test.cpp index 1f5344e..916eca5 100644 --- a/test/type_index_runtime_cast_test.cpp +++ b/test/type_index_runtime_cast_test.cpp @@ -28,81 +28,81 @@ std::string name; struct base { - BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(BOOST_TYPE_INDEX_NO_BASE_CLASS) + BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST() IMPLEMENT_CLASS(base) }; struct single_derived : base { - BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST((base)) + BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(base) IMPLEMENT_CLASS(single_derived) }; struct base1 { - BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(BOOST_TYPE_INDEX_NO_BASE_CLASS) + BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST() IMPLEMENT_CLASS(base1) }; struct base2 { - BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(BOOST_TYPE_INDEX_NO_BASE_CLASS) + BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST() IMPLEMENT_CLASS(base2) }; struct multiple_derived : base1, base2 { - BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST((base1)(base2)) + BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(base1, base2) IMPLEMENT_CLASS(multiple_derived) }; struct baseV1 : virtual base { - BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST((base)) + BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(base) IMPLEMENT_CLASS(baseV1) }; struct baseV2 : virtual base { - BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST((base)) + BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(base) IMPLEMENT_CLASS(baseV2) }; struct multiple_virtual_derived : baseV1, baseV2 { - BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST((baseV1)(baseV2)) + BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(baseV1, baseV2) IMPLEMENT_CLASS(multiple_virtual_derived) }; struct unrelated { - BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(BOOST_TYPE_INDEX_NO_BASE_CLASS) + BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST() IMPLEMENT_CLASS(unrelated) }; struct unrelated_with_base : base { - BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST((base)) + BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(base) IMPLEMENT_CLASS(unrelated_with_base) }; struct unrelatedV1 : virtual base { - BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST((base)) + BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(base) IMPLEMENT_CLASS(unrelatedV1) }; struct level1_a : base { - BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST((base)) + BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(base) IMPLEMENT_CLASS(level1_a) }; struct level1_b : base { - BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST((base)) + BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(base) IMPLEMENT_CLASS(level1_b) }; struct level2 : level1_a, level1_b { - BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST((level1_a)(level1_b)) + BOOST_TYPE_INDEX_IMPLEMENT_RUNTIME_CAST(level1_a, level1_b) IMPLEMENT_CLASS(level2) }; struct reg_base { - BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(BOOST_TYPE_INDEX_NO_BASE_CLASS) + BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS() }; struct reg_derived : reg_base { - BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS((reg_base)) + BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(reg_base) }; void no_base()