From 88d1c5c3959b59a1b76a781709bbcf3406bb98d7 Mon Sep 17 00:00:00 2001 From: Daniel James Date: Wed, 7 Mar 2018 10:11:46 +0000 Subject: [PATCH 1/6] Update hash_info for Visual C++ 14.13 --- test/hash_info.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/hash_info.cpp b/test/hash_info.cpp index 34378f5..b683746 100644 --- a/test/hash_info.cpp +++ b/test/hash_info.cpp @@ -39,7 +39,8 @@ void write_compiler_info() { {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"} + {1912, "Visual C++ 14.12, VS2017 15.5"}, + {1913, "Visual C++ 14.13, VS2017 15.6"} }; msvc_version msvc = { BOOST_MSVC, "" }; From 8c9bd9eccd05eb5c70a2b5af31c85b74f34842dc Mon Sep 17 00:00:00 2001 From: Daniel James Date: Thu, 8 Mar 2018 15:51:01 +0000 Subject: [PATCH 2/6] Test in msvc-14.1 C++17 mode + write out hash_info --- .appveyor.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 76189c2..61c7e7f 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -14,6 +14,7 @@ environment: TOOLSET: msvc-14.0 - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 TOOLSET: msvc-14.1 + CXXSTD: 14,17 install: - cd c:\projects @@ -29,5 +30,7 @@ install: build: off test_script: + - if not "%CXXSTD%" == "" set CXXSTD=cxxstd=%CXXSTD% - cd %APPVEYOR_BUILD_FOLDER%\test - - cmd /c %BOOST_ROOT%\tools\build\b2 -j 3 toolset=%TOOLSET% include=%APPVEYOR_BUILD_FOLDER%\include include=%BOOST_ROOT% + - cmd /c %BOOST_ROOT%\tools\build\b2 -j 3 toolset=%TOOLSET% %CXXSTD% include=%APPVEYOR_BUILD_FOLDER%\include include=%BOOST_ROOT% --verbose-test hash_info + - cmd /c %BOOST_ROOT%\tools\build\b2 -j 3 toolset=%TOOLSET% %CXXSTD% include=%APPVEYOR_BUILD_FOLDER%\include include=%BOOST_ROOT% From e67d20d1c3ebab14aca4224ebcf1019ef5eff9fb Mon Sep 17 00:00:00 2001 From: Daniel James Date: Thu, 29 Mar 2018 19:14:56 +0100 Subject: [PATCH 3/6] Fix std::vector with libc++ Temporary fix for: https://svn.boost.org/trac10/ticket/13501 Will have a more general fix in 1.68.0 --- include/boost/container_hash/extensions.hpp | 50 +++++++++++++++++++++ test/hash_vector_test.cpp | 33 ++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/include/boost/container_hash/extensions.hpp b/include/boost/container_hash/extensions.hpp index 393b702..29d2c32 100644 --- a/include/boost/container_hash/extensions.hpp +++ b/include/boost/container_hash/extensions.hpp @@ -70,6 +70,56 @@ namespace boost return seed; } + inline std::size_t hash_range( + std::vector::iterator first, + std::vector::iterator last) + { + std::size_t seed = 0; + + for(; first != last; ++first) + { + hash_combine(seed, *first); + } + + return seed; + } + + inline std::size_t hash_range( + std::vector::const_iterator first, + std::vector::const_iterator last) + { + std::size_t seed = 0; + + for(; first != last; ++first) + { + hash_combine(seed, *first); + } + + return seed; + } + + inline void hash_range( + std::size_t& seed, + std::vector::iterator first, + std::vector::iterator last) + { + for(; first != last; ++first) + { + hash_combine(seed, *first); + } + } + + inline void hash_range( + std::size_t& seed, + std::vector::const_iterator first, + std::vector::const_iterator last) + { + for(; first != last; ++first) + { + hash_combine(seed, *first); + } + } + template std::size_t hash_value(std::vector const& v) { diff --git a/test/hash_vector_test.cpp b/test/hash_vector_test.cpp index 752438f..9e63f5b 100644 --- a/test/hash_vector_test.cpp +++ b/test/hash_vector_test.cpp @@ -25,11 +25,44 @@ using std::vector; #endif // BOOST_HASH_TEST_EXTENSIONS +namespace vector_bool_tests +{ + void vector_bool_test() { + std::vector x_empty1,x_empty2,x1,x1a,x2,x3; + + x1.push_back(0); + x1a.push_back(0); + x2.push_back(1); + x3.push_back(0); + x3.push_back(0); + + BOOST_HASH_TEST_NAMESPACE::hash > hasher; + + BOOST_TEST_EQ(hasher(x_empty1), hasher(x_empty1)); + BOOST_TEST_EQ(hasher(x_empty1), hasher(x_empty2)); + BOOST_TEST_NE(hasher(x_empty1), hasher(x1)); + BOOST_TEST_NE(hasher(x_empty1), hasher(x2)); + BOOST_TEST_NE(hasher(x_empty1), hasher(x3)); + + BOOST_TEST_EQ(hasher(x1), hasher(x1)); + BOOST_TEST_EQ(hasher(x1), hasher(x1a)); + BOOST_TEST_NE(hasher(x1), hasher(x2)); + BOOST_TEST_NE(hasher(x1), hasher(x3)); + + BOOST_TEST_EQ(hasher(x2), hasher(x2)); + BOOST_TEST_NE(hasher(x2), hasher(x3)); + + BOOST_TEST_EQ(hasher(x3), hasher(x3)); + } +} + int main() { #ifdef BOOST_HASH_TEST_EXTENSIONS vector_tests::vector_hash_integer_tests(); #endif + vector_bool_tests::vector_bool_test(); + return boost::report_errors(); } From 60f5e0d393beffc51278694e8681299f3048bae1 Mon Sep 17 00:00:00 2001 From: Daniel James Date: Thu, 29 Mar 2018 19:50:17 +0100 Subject: [PATCH 4/6] Add explicit allocator to vector overloads Needed when container_fwd.hpp is used, as it doesn't specify the default arguments. --- include/boost/container_hash/extensions.hpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/include/boost/container_hash/extensions.hpp b/include/boost/container_hash/extensions.hpp index 29d2c32..35ebe7f 100644 --- a/include/boost/container_hash/extensions.hpp +++ b/include/boost/container_hash/extensions.hpp @@ -71,8 +71,8 @@ namespace boost } inline std::size_t hash_range( - std::vector::iterator first, - std::vector::iterator last) + std::vector >::iterator first, + std::vector >::iterator last) { std::size_t seed = 0; @@ -85,8 +85,8 @@ namespace boost } inline std::size_t hash_range( - std::vector::const_iterator first, - std::vector::const_iterator last) + std::vector >::const_iterator first, + std::vector >::const_iterator last) { std::size_t seed = 0; @@ -100,8 +100,8 @@ namespace boost inline void hash_range( std::size_t& seed, - std::vector::iterator first, - std::vector::iterator last) + std::vector >::iterator first, + std::vector >::iterator last) { for(; first != last; ++first) { @@ -111,8 +111,8 @@ namespace boost inline void hash_range( std::size_t& seed, - std::vector::const_iterator first, - std::vector::const_iterator last) + std::vector >::const_iterator first, + std::vector >::const_iterator last) { for(; first != last; ++first) { From 601b8d037829d8178df3410a165ad76dbc3d7cca Mon Sep 17 00:00:00 2001 From: Daniel James Date: Thu, 29 Mar 2018 21:57:52 +0100 Subject: [PATCH 5/6] Include vector header, needed to get the iterator type --- include/boost/container_hash/extensions.hpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/include/boost/container_hash/extensions.hpp b/include/boost/container_hash/extensions.hpp index 35ebe7f..4eebb4b 100644 --- a/include/boost/container_hash/extensions.hpp +++ b/include/boost/container_hash/extensions.hpp @@ -22,6 +22,7 @@ #include #include #include +#include #if !defined(BOOST_NO_CXX11_HDR_ARRAY) # include @@ -71,8 +72,8 @@ namespace boost } inline std::size_t hash_range( - std::vector >::iterator first, - std::vector >::iterator last) + std::vector::iterator first, + std::vector::iterator last) { std::size_t seed = 0; @@ -85,8 +86,8 @@ namespace boost } inline std::size_t hash_range( - std::vector >::const_iterator first, - std::vector >::const_iterator last) + std::vector::const_iterator first, + std::vector::const_iterator last) { std::size_t seed = 0; @@ -100,8 +101,8 @@ namespace boost inline void hash_range( std::size_t& seed, - std::vector >::iterator first, - std::vector >::iterator last) + std::vector::iterator first, + std::vector::iterator last) { for(; first != last; ++first) { @@ -111,8 +112,8 @@ namespace boost inline void hash_range( std::size_t& seed, - std::vector >::const_iterator first, - std::vector >::const_iterator last) + std::vector::const_iterator first, + std::vector::const_iterator last) { for(; first != last; ++first) { From 3e8dbcbcc55f759dda5192476e46acefaa4df3df Mon Sep 17 00:00:00 2001 From: Daniel James Date: Wed, 4 Apr 2018 00:32:37 +0100 Subject: [PATCH 6/6] Changelog entry for vector fix --- doc/changes.qbk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/changes.qbk b/doc/changes.qbk index 60d17c8..459a15d 100644 --- a/doc/changes.qbk +++ b/doc/changes.qbk @@ -216,5 +216,7 @@ preprocessor to generate them. Should improve usability, due to better error messages, and easier debugging. * Fix tutorial example ([ticket 11017]). +* Quick fix for hashing `vector` when using libc++. Will try to introduce + a more general fix in the next release. [endsect]