hash_friend_test.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. // Copyright 2006-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. template <class T>
  10. struct custom
  11. {
  12. int value_;
  13. std::size_t hash() const
  14. {
  15. return static_cast<std::size_t>(value_ * 10);
  16. }
  17. #if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
  18. friend std::size_t hash_value(custom const& x)
  19. {
  20. return x.hash();
  21. }
  22. #endif
  23. custom(int x) : value_(x) {}
  24. };
  25. }
  26. #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
  27. namespace boost
  28. {
  29. template <class T>
  30. std::size_t hash_value(test::custom<T> x)
  31. {
  32. return x.hash();
  33. }
  34. }
  35. #endif
  36. #include "./config.hpp"
  37. #ifdef BOOST_HASH_TEST_EXTENSIONS
  38. # ifdef BOOST_HASH_TEST_STD_INCLUDES
  39. # include <functional>
  40. # else
  41. # include <boost/container_hash/hash.hpp>
  42. # endif
  43. #endif
  44. #include <boost/core/lightweight_test.hpp>
  45. #ifdef BOOST_HASH_TEST_EXTENSIONS
  46. #include <vector>
  47. #include <string>
  48. #include <cctype>
  49. void custom_tests()
  50. {
  51. BOOST_HASH_TEST_NAMESPACE::hash<test::custom<int> > custom_hasher;
  52. BOOST_TEST(custom_hasher(10) == 100u);
  53. test::custom<int> x(55);
  54. BOOST_TEST(custom_hasher(x) == 550u);
  55. {
  56. using namespace BOOST_HASH_TEST_NAMESPACE;
  57. BOOST_TEST(custom_hasher(x) == hash_value(x));
  58. }
  59. std::vector<test::custom<int> > custom_vector;
  60. custom_vector.push_back(5);
  61. custom_vector.push_back(25);
  62. custom_vector.push_back(35);
  63. std::size_t seed = 0;
  64. BOOST_HASH_TEST_NAMESPACE::hash_combine(seed, test::custom<int>(5));
  65. BOOST_HASH_TEST_NAMESPACE::hash_combine(seed, test::custom<int>(25));
  66. BOOST_HASH_TEST_NAMESPACE::hash_combine(seed, test::custom<int>(35));
  67. std::size_t seed2 = 0;
  68. BOOST_HASH_TEST_NAMESPACE::hash_combine(seed2, 50u);
  69. BOOST_HASH_TEST_NAMESPACE::hash_combine(seed2, 250u);
  70. BOOST_HASH_TEST_NAMESPACE::hash_combine(seed2, 350u);
  71. BOOST_TEST(seed == BOOST_HASH_TEST_NAMESPACE::hash_range(
  72. custom_vector.begin(), custom_vector.end()));
  73. BOOST_TEST(seed == seed2);
  74. }
  75. #endif // BOOST_HASH_TEST_EXTENSIONS
  76. int main()
  77. {
  78. #ifdef BOOST_HASH_TEST_EXTENSIONS
  79. custom_tests();
  80. #endif
  81. return boost::report_errors();
  82. }