mirror of
https://github.com/boostorg/container_hash.git
synced 2025-08-04 23:14:33 +02:00
Specialize boost::unordered::hash_is_avalanching for hash<string> and hash<string_view>
This commit is contained in:
@@ -63,6 +63,10 @@
|
|||||||
#include <variant>
|
#include <variant>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW)
|
||||||
|
# include <string_view>
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace boost
|
namespace boost
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -629,6 +633,30 @@ namespace boost
|
|||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
|
// boost::unordered::hash_is_avalanching
|
||||||
|
|
||||||
|
namespace unordered
|
||||||
|
{
|
||||||
|
template<class T> struct hash_is_avalanching;
|
||||||
|
template<class Ch> struct hash_is_avalanching< boost::hash< std::basic_string<Ch> > >: boost::is_integral<Ch> {};
|
||||||
|
|
||||||
|
// boost::is_integral<char8_t> is false, but should be true (https://github.com/boostorg/type_traits/issues/175)
|
||||||
|
#if defined(__cpp_char8_t) && __cpp_char8_t >= 201811L
|
||||||
|
template<> struct hash_is_avalanching< boost::hash< std::u8string > >: boost::true_type {};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW)
|
||||||
|
|
||||||
|
template<class Ch> struct hash_is_avalanching< boost::hash< std::basic_string_view<Ch> > >: boost::is_integral<Ch> {};
|
||||||
|
|
||||||
|
#if defined(__cpp_char8_t) && __cpp_char8_t >= 201811L
|
||||||
|
template<> struct hash_is_avalanching< boost::hash< std::u8string_view > >: boost::true_type {};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
} // namespace unordered
|
||||||
|
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
#endif // #ifndef BOOST_FUNCTIONAL_HASH_HASH_HPP
|
#endif // #ifndef BOOST_FUNCTIONAL_HASH_HASH_HPP
|
||||||
|
@@ -112,3 +112,6 @@ run is_described_class_test3.cpp
|
|||||||
|
|
||||||
run described_class_test.cpp
|
run described_class_test.cpp
|
||||||
: : : <warnings>extra ;
|
: : : <warnings>extra ;
|
||||||
|
|
||||||
|
run hash_is_avalanching_test.cpp ;
|
||||||
|
run hash_is_avalanching_test2.cpp ;
|
||||||
|
52
test/hash_is_avalanching_test.cpp
Normal file
52
test/hash_is_avalanching_test.cpp
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
// Copyright 2022 Peter Dimov.
|
||||||
|
// Distributed under the Boost Software License, Version 1.0.
|
||||||
|
// https://www.boost.org/LICENSE_1_0.txt
|
||||||
|
|
||||||
|
#include <boost/container_hash/hash.hpp>
|
||||||
|
#include <boost/core/lightweight_test_trait.hpp>
|
||||||
|
#include <boost/config.hpp>
|
||||||
|
#include <boost/config/pragma_message.hpp>
|
||||||
|
|
||||||
|
#if defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
|
||||||
|
|
||||||
|
BOOST_PRAGMA_MESSAGE( "Test skipped, BOOST_NO_CXX11_HDR_TYPE_TRAITS is defined" )
|
||||||
|
int main() {}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <boost/unordered/hash_traits.hpp>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
enum my_char { min = 0, max = 255 };
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
using boost::unordered::hash_is_avalanching;
|
||||||
|
|
||||||
|
BOOST_TEST_TRAIT_TRUE(( hash_is_avalanching< boost::hash<std::string> > ));
|
||||||
|
BOOST_TEST_TRAIT_TRUE(( hash_is_avalanching< boost::hash<std::wstring> > ));
|
||||||
|
|
||||||
|
#if !defined(BOOST_NO_CXX11_CHAR16_T)
|
||||||
|
|
||||||
|
BOOST_TEST_TRAIT_TRUE(( hash_is_avalanching< boost::hash<std::u16string> > ));
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(BOOST_NO_CXX11_CHAR32_T)
|
||||||
|
|
||||||
|
BOOST_TEST_TRAIT_TRUE(( hash_is_avalanching< boost::hash<std::u32string> > ));
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__cpp_char8_t) && __cpp_char8_t >= 201811L
|
||||||
|
|
||||||
|
BOOST_TEST_TRAIT_TRUE(( hash_is_avalanching< boost::hash<std::u8string> > ));
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
BOOST_TEST_TRAIT_FALSE(( hash_is_avalanching< boost::hash<std::basic_string<my_char> > > ));
|
||||||
|
|
||||||
|
return boost::report_errors();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
57
test/hash_is_avalanching_test2.cpp
Normal file
57
test/hash_is_avalanching_test2.cpp
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
// Copyright 2022 Peter Dimov.
|
||||||
|
// Distributed under the Boost Software License, Version 1.0.
|
||||||
|
// https://www.boost.org/LICENSE_1_0.txt
|
||||||
|
|
||||||
|
#include <boost/container_hash/hash.hpp>
|
||||||
|
#include <boost/core/lightweight_test_trait.hpp>
|
||||||
|
#include <boost/config.hpp>
|
||||||
|
#include <boost/config/pragma_message.hpp>
|
||||||
|
|
||||||
|
#if defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
|
||||||
|
|
||||||
|
BOOST_PRAGMA_MESSAGE( "Test skipped, BOOST_NO_CXX11_HDR_TYPE_TRAITS is defined" )
|
||||||
|
int main() {}
|
||||||
|
|
||||||
|
#elif defined(BOOST_NO_CXX17_HDR_STRING_VIEW)
|
||||||
|
|
||||||
|
BOOST_PRAGMA_MESSAGE( "Test skipped, BOOST_NO_CXX17_HDR_STRING_VIEW is defined" )
|
||||||
|
int main() {}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <boost/unordered/hash_traits.hpp>
|
||||||
|
#include <string_view>
|
||||||
|
|
||||||
|
enum my_char { min = 0, max = 255 };
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
using boost::unordered::hash_is_avalanching;
|
||||||
|
|
||||||
|
BOOST_TEST_TRAIT_TRUE(( hash_is_avalanching< boost::hash<std::string_view> > ));
|
||||||
|
BOOST_TEST_TRAIT_TRUE(( hash_is_avalanching< boost::hash<std::wstring_view> > ));
|
||||||
|
|
||||||
|
#if !defined(BOOST_NO_CXX11_CHAR16_T)
|
||||||
|
|
||||||
|
BOOST_TEST_TRAIT_TRUE(( hash_is_avalanching< boost::hash<std::u16string_view> > ));
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(BOOST_NO_CXX11_CHAR32_T)
|
||||||
|
|
||||||
|
BOOST_TEST_TRAIT_TRUE(( hash_is_avalanching< boost::hash<std::u32string_view> > ));
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__cpp_char8_t) && __cpp_char8_t >= 201811L
|
||||||
|
|
||||||
|
BOOST_TEST_TRAIT_TRUE(( hash_is_avalanching< boost::hash<std::u8string_view> > ));
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
BOOST_TEST_TRAIT_FALSE(( hash_is_avalanching< boost::hash<std::basic_string_view<my_char> > > ));
|
||||||
|
|
||||||
|
return boost::report_errors();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Reference in New Issue
Block a user