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(); }