diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..657c9ac --- /dev/null +++ b/.travis.yml @@ -0,0 +1,39 @@ +# Copyright (C) 2016 Daniel James. +# Distributed under the Boost Software License, Version 1.0. (See accompanying +# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +# Use Trusty to get a reasonably recent version of Boost. +sudo: required +dist: trusty + +language: c++ + +addons: + apt: + packages: + - libboost-dev + - libboost-tools-dev + +matrix: + include: + - compiler: gcc + env: BJAM_TOOLSET=gcc + - compiler: gcc + env: BJAM_TOOLSET=gcc-std11 + - compiler: clang + env: BJAM_TOOLSET=clang + - compiler: clang + env: BJAM_TOOLSET=clang-std11 + +before_script: + - | + echo "using gcc : : g++-4.8 ;" > ~/user-config.jam + echo "using gcc : std11 : g++-4.8 --std=c++11 ;" >> ~/user-config.jam + echo "using clang : : clang++ ;" >> ~/user-config.jam + echo "using clang : std11 : clang++ --std=c++11 ;" >> ~/user-config.jam + - cat ~/user-config.jam + - touch Jamroot.jam + +script: + - cd ${TRAVIS_BUILD_DIR}/test + - bjam -q ${BJAM_TOOLSET} include=${TRAVIS_BUILD_DIR}/include diff --git a/examples/point.cpp b/examples/point.cpp index 6943342..f3d30e1 100644 --- a/examples/point.cpp +++ b/examples/point.cpp @@ -3,6 +3,11 @@ // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// Force use of assert. +#if defined(NDEBUG) +#undef NDEBUG +#endif + #include #include diff --git a/examples/portable.cpp b/examples/portable.cpp index 88f2fc7..511133e 100644 --- a/examples/portable.cpp +++ b/examples/portable.cpp @@ -3,6 +3,11 @@ // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// Force use of assert. +#if defined(NDEBUG) +#undef NDEBUG +#endif + #include #include diff --git a/include/boost/functional/hash/hash.hpp b/include/boost/functional/hash/hash.hpp index 2fb9f21..0a8ceeb 100644 --- a/include/boost/functional/hash/hash.hpp +++ b/include/boost/functional/hash/hash.hpp @@ -212,7 +212,6 @@ namespace boost seed ^= value + 0x9e3779b9 + (seed<<6) + (seed>>2); } - template inline void hash_combine_impl(boost::uint32_t& h1, boost::uint32_t k1) { @@ -229,12 +228,11 @@ namespace boost } -// Don't define 64-bit hash combine on platforms with 64 bit integers, +// Don't define 64-bit hash combine on platforms without 64 bit integers, // and also not for 32-bit gcc as it warns about the 64-bit constant. #if !defined(BOOST_NO_INT64_T) && \ !(defined(__GNUC__) && ULONG_MAX == 0xffffffff) - template inline void hash_combine_impl(boost::uint64_t& h, boost::uint64_t k) { @@ -247,6 +245,10 @@ namespace boost h ^= k; h *= m; + + // Completely arbitrary number, to prevent 0's + // from hashing to 0. + h += 0xe6546b64; } #endif // BOOST_NO_INT64_T diff --git a/test/hash_number_test.cpp b/test/hash_number_test.cpp index 242c731..9adb5c6 100644 --- a/test/hash_number_test.cpp +++ b/test/hash_number_test.cpp @@ -58,8 +58,6 @@ void numeric_extra_tests(typename template void numeric_test(T*) { - typedef boost::hash_detail::limits limits; - compile_time_tests((T*) 0); BOOST_HASH_TEST_NAMESPACE::hash x1; diff --git a/test/hash_string_test.cpp b/test/hash_string_test.cpp index de8ca87..5f72d4e 100644 --- a/test/hash_string_test.cpp +++ b/test/hash_string_test.cpp @@ -38,6 +38,23 @@ void string_tests() #endif } +void string0_tests() +{ + std::string x1(1, '\0'); + std::string x2(2, '\0'); + std::string x3(3, '\0'); + std::string x4(10, '\0'); + + BOOST_HASH_TEST_NAMESPACE::hash hasher; + + BOOST_TEST(hasher(x1) != hasher(x2)); + BOOST_TEST(hasher(x1) != hasher(x3)); + BOOST_TEST(hasher(x1) != hasher(x4)); + BOOST_TEST(hasher(x2) != hasher(x3)); + BOOST_TEST(hasher(x2) != hasher(x4)); + BOOST_TEST(hasher(x3) != hasher(x4)); +} + #if !defined(BOOST_NO_STD_WSTRING) void wstring_tests() { @@ -66,6 +83,7 @@ void wstring_tests() int main() { string_tests(); + string0_tests(); #if !defined(BOOST_NO_STD_WSTRING) wstring_tests(); #endif