From b201ff97a8bb9f2b6bd6bb95f3a42c0a47a12f03 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sat, 16 Oct 2021 16:43:11 +0300 Subject: [PATCH] Use Config macros for detecting C++17 headers --- include/boost/container_hash/hash.hpp | 82 +++++++-------------------- test/hash_info.cpp | 45 ++++++++------- test/hash_optional_test.cpp | 4 +- test/hash_string_test.cpp | 2 +- test/hash_variant_test.cpp | 4 +- 5 files changed, 50 insertions(+), 87 deletions(-) diff --git a/include/boost/container_hash/hash.hpp b/include/boost/container_hash/hash.hpp index 98887ae..5fa8e2e 100644 --- a/include/boost/container_hash/hash.hpp +++ b/include/boost/container_hash/hash.hpp @@ -36,6 +36,18 @@ #include #endif +#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW) +#include +#endif + +#if !defined(BOOST_NO_CXX17_HDR_OPTIONAL) +#include +#endif + +#if !defined(BOOST_NO_CXX17_HDR_VARIANT) +#include +#endif + #if defined(BOOST_MSVC) #pragma warning(push) @@ -53,58 +65,6 @@ # define BOOST_FUNCTIONAL_HASH_ROTL32(x, r) (x << r) | (x >> (32 - r)) #endif -// Detect whether standard library has C++17 headers - -#if !defined(BOOST_HASH_CXX17) -# if defined(BOOST_MSVC) -# if defined(_HAS_CXX17) && _HAS_CXX17 -# define BOOST_HASH_CXX17 1 -# endif -# elif defined(__cplusplus) && __cplusplus >= 201703 -# define BOOST_HASH_CXX17 1 -# endif -#endif - -#if !defined(BOOST_HASH_CXX17) -# define BOOST_HASH_CXX17 0 -#endif - -#if BOOST_HASH_CXX17 && defined(__has_include) -# if !defined(BOOST_HASH_HAS_STRING_VIEW) && __has_include() -# define BOOST_HASH_HAS_STRING_VIEW 1 -# endif -# if !defined(BOOST_HASH_HAS_OPTIONAL) && __has_include() -# define BOOST_HASH_HAS_OPTIONAL 1 -# endif -# if !defined(BOOST_HASH_HAS_VARIANT) && __has_include() -# define BOOST_HASH_HAS_VARIANT 1 -# endif -#endif - -#if !defined(BOOST_HASH_HAS_STRING_VIEW) -# define BOOST_HASH_HAS_STRING_VIEW 0 -#endif - -#if !defined(BOOST_HASH_HAS_OPTIONAL) -# define BOOST_HASH_HAS_OPTIONAL 0 -#endif - -#if !defined(BOOST_HASH_HAS_VARIANT) -# define BOOST_HASH_HAS_VARIANT 0 -#endif - -#if BOOST_HASH_HAS_STRING_VIEW -# include -#endif - -#if BOOST_HASH_HAS_OPTIONAL -# include -#endif - -#if BOOST_HASH_HAS_VARIANT -# include -#endif - namespace boost { namespace hash_detail @@ -217,7 +177,7 @@ namespace boost std::size_t hash_value( std::basic_string, A> const&); -#if BOOST_HASH_HAS_STRING_VIEW +#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW) template std::size_t hash_value( std::basic_string_view > const&); @@ -226,12 +186,12 @@ namespace boost template typename boost::hash_detail::float_numbers::type hash_value(T); -#if BOOST_HASH_HAS_OPTIONAL +#if !defined(BOOST_NO_CXX17_HDR_OPTIONAL) template std::size_t hash_value(std::optional const&); #endif -#if BOOST_HASH_HAS_VARIANT +#if !defined(BOOST_NO_CXX17_HDR_VARIANT) std::size_t hash_value(std::monostate); template std::size_t hash_value(std::variant const&); @@ -471,7 +431,7 @@ namespace boost return hash_range(v.begin(), v.end()); } -#if BOOST_HASH_HAS_STRING_VIEW +#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW) template inline std::size_t hash_value( std::basic_string_view > const& v) @@ -486,7 +446,7 @@ namespace boost return boost::hash_detail::float_hash_value(v); } -#if BOOST_HASH_HAS_OPTIONAL +#if !defined(BOOST_NO_CXX17_HDR_OPTIONAL) template inline std::size_t hash_value(std::optional const& v) { if (!v) { @@ -499,7 +459,7 @@ namespace boost } #endif -#if BOOST_HASH_HAS_VARIANT +#if !defined(BOOST_NO_CXX17_HDR_VARIANT) inline std::size_t hash_value(std::monostate) { return 0x87654321; } @@ -618,7 +578,7 @@ namespace boost BOOST_HASH_SPECIALIZE_REF(std::basic_string) #endif -#if BOOST_HASH_HAS_STRING_VIEW +#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW) BOOST_HASH_SPECIALIZE_REF(std::string_view) # if !defined(BOOST_NO_STD_WSTRING) && !defined(BOOST_NO_INTRINSIC_WCHAR_T) BOOST_HASH_SPECIALIZE_REF(std::wstring_view) @@ -641,12 +601,12 @@ namespace boost BOOST_HASH_SPECIALIZE(boost::uint128_type) #endif -#if BOOST_HASH_HAS_OPTIONAL +#if !defined(BOOST_NO_CXX17_HDR_OPTIONAL) template BOOST_HASH_SPECIALIZE_TEMPLATE_REF(std::optional) #endif -#if !defined(BOOST_HASH_HAS_VARIANT) +#if !defined(BOOST_NO_CXX17_HDR_VARIANT) template BOOST_HASH_SPECIALIZE_TEMPLATE_REF(std::variant) BOOST_HASH_SPECIALIZE(std::monostate) diff --git a/test/hash_info.cpp b/test/hash_info.cpp index b683746..2a6c2c1 100644 --- a/test/hash_info.cpp +++ b/test/hash_info.cpp @@ -37,10 +37,9 @@ void write_compiler_info() { {1700, "Visual C++ 11.0, VS2012"}, {1800, "Visual C++ 12.0, VS2013"}, {1900, "Visual C++ 14.00, VS2015"}, - {1910, "Visual C++ 14.10, VS2017 15.1/2"}, - {1911, "Visual C++ 14.11, VS2017 15.3/4"}, - {1912, "Visual C++ 14.12, VS2017 15.5"}, - {1913, "Visual C++ 14.13, VS2017 15.6"} + {1910, "Visual C++ 14.1x, VS2017"}, + {1920, "Visual C++ 14.2x, VS2019"}, + {1930, "Visual C++ 14.3x, VS2022"}, }; msvc_version msvc = { BOOST_MSVC, "" }; @@ -65,38 +64,42 @@ void write_compiler_info() { int main() { write_compiler_info(); -#if defined(__cplusplus) std::cout << "__cplusplus: " << __cplusplus << std::endl; + + std::cout << "BOOST_CXX_VERSION: " + << BOOST_CXX_VERSION + << std::endl; + +#if defined(BOOST_NO_CXX17_HDR_STRING_VIEW) + std::cout << "No " << std::endl; +#else + std::cout << "Has " << std::endl; #endif - std::cout << "BOOST_HASH_CXX17: " - << BOOST_HASH_CXX17 - << std::endl; +#if defined(BOOST_NO_CXX17_HDR_OPTIONAL) + std::cout << "No " << std::endl; +#else + std::cout << "Has " << std::endl; +#endif - std::cout << "BOOST_HASH_HAS_STRING_VIEW: " - << BOOST_HASH_HAS_STRING_VIEW - << std::endl; - - std::cout << "BOOST_HASH_HAS_OPTIONAL: " - << BOOST_HASH_HAS_OPTIONAL - << std::endl; - - std::cout << "BOOST_HASH_HAS_VARIANT: " - << BOOST_HASH_HAS_VARIANT - << std::endl; +#if defined(BOOST_NO_CXX17_HDR_VARIANT) + std::cout << "No " << std::endl; +#else + std::cout << "Has " << std::endl; +#endif #if defined(BOOST_NO_CXX11_HDR_TYPEINDEX) std::cout << "No " << std::endl; #else - std::cout << "" << std::endl; + std::cout << "Has " << std::endl; #endif #if defined(BOOST_NO_CXX11_HDR_SYSTEM_ERROR) std::cout << "No " << std::endl; #else - std::cout << "" << std::endl; + std::cout << "Has " << std::endl; #endif } diff --git a/test/hash_optional_test.cpp b/test/hash_optional_test.cpp index 4469395..5ad2a18 100644 --- a/test/hash_optional_test.cpp +++ b/test/hash_optional_test.cpp @@ -11,7 +11,7 @@ #include #include -#if BOOST_HASH_HAS_OPTIONAL +#if !defined(BOOST_NO_CXX17_HDR_OPTIONAL) #include #include @@ -60,7 +60,7 @@ void test_optional_string() int main() { -#if BOOST_HASH_HAS_OPTIONAL +#if !defined(BOOST_NO_CXX17_HDR_OPTIONAL) test_optional_int(); test_optional_string(); #else diff --git a/test/hash_string_test.cpp b/test/hash_string_test.cpp index 712c639..10f9847 100644 --- a/test/hash_string_test.cpp +++ b/test/hash_string_test.cpp @@ -176,7 +176,7 @@ int main() #endif generic_string_tests((std::string*) 0); -#if BOOST_HASH_HAS_STRING_VIEW +#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW) generic_string_tests((std::string_view*) 0); #endif diff --git a/test/hash_variant_test.cpp b/test/hash_variant_test.cpp index 31520f4..2cf6426 100644 --- a/test/hash_variant_test.cpp +++ b/test/hash_variant_test.cpp @@ -11,7 +11,7 @@ #include #include -#if BOOST_HASH_HAS_VARIANT +#if !defined(BOOST_NO_CXX17_HDR_VARIANT) #include #include @@ -90,7 +90,7 @@ void test_variant_unique_types() int main() { -#if BOOST_HASH_HAS_VARIANT +#if !defined(BOOST_NO_CXX17_HDR_VARIANT) test_variant_int(); test_variant_unique_types(); #else