hash_custom_test.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Copyright 2005-2009 Daniel James.
  2. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  3. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  4. #include "./config.hpp"
  5. #include <boost/config.hpp>
  6. #include <cstddef>
  7. namespace test
  8. {
  9. struct custom
  10. {
  11. int value_;
  12. std::size_t hash() const
  13. {
  14. return static_cast<std::size_t>(value_ * 10);
  15. }
  16. #if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
  17. friend std::size_t hash_value(custom const& x )
  18. {
  19. return x.hash();
  20. }
  21. #endif
  22. custom(int x) : value_(x) {}
  23. };
  24. }
  25. #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
  26. namespace boost
  27. {
  28. std::size_t hash_value(test::custom x)
  29. {
  30. return x.hash();
  31. }
  32. }
  33. #endif
  34. #include "./config.hpp"
  35. #ifdef BOOST_HASH_TEST_EXTENSIONS
  36. # ifdef BOOST_HASH_TEST_STD_INCLUDES
  37. # include <functional>
  38. # else
  39. # include <boost/container_hash/hash.hpp>
  40. # endif
  41. #endif
  42. #include <boost/core/lightweight_test.hpp>
  43. #ifdef BOOST_HASH_TEST_EXTENSIONS
  44. #include <vector>
  45. #include <string>
  46. #include <cctype>
  47. void custom_tests()
  48. {
  49. BOOST_HASH_TEST_NAMESPACE::hash<test::custom> custom_hasher;
  50. BOOST_TEST(custom_hasher(10) == 100u);
  51. test::custom x(55);
  52. BOOST_TEST(custom_hasher(x) == 550u);
  53. {
  54. using namespace BOOST_HASH_TEST_NAMESPACE;
  55. BOOST_TEST(custom_hasher(x) == hash_value(x));
  56. }
  57. std::vector<test::custom> custom_vector;
  58. custom_vector.push_back(5);
  59. custom_vector.push_back(25);
  60. custom_vector.push_back(35);
  61. std::size_t seed = 0;
  62. BOOST_HASH_TEST_NAMESPACE::hash_combine(seed, test::custom(5));
  63. BOOST_HASH_TEST_NAMESPACE::hash_combine(seed, test::custom(25));
  64. BOOST_HASH_TEST_NAMESPACE::hash_combine(seed, test::custom(35));
  65. std::size_t seed2 = 0;
  66. BOOST_HASH_TEST_NAMESPACE::hash_combine(seed2, 50u);
  67. BOOST_HASH_TEST_NAMESPACE::hash_combine(seed2, 250u);
  68. BOOST_HASH_TEST_NAMESPACE::hash_combine(seed2, 350u);
  69. BOOST_TEST(seed == BOOST_HASH_TEST_NAMESPACE::hash_range(
  70. custom_vector.begin(), custom_vector.end()));
  71. BOOST_TEST(seed == seed2);
  72. }
  73. #endif // BOOST_HASH_TEST_EXTENSIONS
  74. int main()
  75. {
  76. #ifdef BOOST_HASH_TEST_EXTENSIONS
  77. custom_tests();
  78. #endif
  79. return boost::report_errors();
  80. }