hash_global_namespace_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. // This test demonstrates an ADL bug in Borland 5.5 where ADL isn't performed
  5. // in the global namespace.
  6. #include "./config.hpp"
  7. #include <boost/config.hpp>
  8. #include <cstddef>
  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. #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
  25. namespace boost
  26. {
  27. std::size_t hash_value(custom x)
  28. {
  29. return x.hash();
  30. }
  31. }
  32. #endif
  33. #include "./config.hpp"
  34. #ifdef BOOST_HASH_TEST_EXTENSIONS
  35. # ifdef BOOST_HASH_TEST_STD_INCLUDES
  36. # include <functional>
  37. # else
  38. # include <boost/container_hash/hash.hpp>
  39. # endif
  40. #endif
  41. #include <boost/core/lightweight_test.hpp>
  42. #ifdef BOOST_HASH_TEST_EXTENSIONS
  43. #include <vector>
  44. #include <string>
  45. #include <cctype>
  46. void custom_tests()
  47. {
  48. BOOST_HASH_TEST_NAMESPACE::hash<custom> custom_hasher;
  49. BOOST_TEST(custom_hasher(10) == 100u);
  50. custom x(55);
  51. BOOST_TEST(custom_hasher(x) == 550u);
  52. {
  53. using namespace BOOST_HASH_TEST_NAMESPACE;
  54. BOOST_TEST(custom_hasher(x) == hash_value(x));
  55. }
  56. std::vector<custom> custom_vector;
  57. custom_vector.push_back(5);
  58. custom_vector.push_back(25);
  59. custom_vector.push_back(35);
  60. std::size_t seed = 0;
  61. BOOST_HASH_TEST_NAMESPACE::hash_combine(seed, custom(5));
  62. BOOST_HASH_TEST_NAMESPACE::hash_combine(seed, custom(25));
  63. BOOST_HASH_TEST_NAMESPACE::hash_combine(seed, custom(35));
  64. std::size_t seed2 = 0;
  65. BOOST_HASH_TEST_NAMESPACE::hash_combine(seed2, 50u);
  66. BOOST_HASH_TEST_NAMESPACE::hash_combine(seed2, 250u);
  67. BOOST_HASH_TEST_NAMESPACE::hash_combine(seed2, 350u);
  68. BOOST_TEST(seed == BOOST_HASH_TEST_NAMESPACE::hash_range(
  69. custom_vector.begin(), custom_vector.end()));
  70. BOOST_TEST(seed == seed2);
  71. }
  72. #endif // BOOST_HASH_TEST_EXTENSIONS
  73. int main()
  74. {
  75. #ifdef BOOST_HASH_TEST_EXTENSIONS
  76. custom_tests();
  77. #endif
  78. return boost::report_errors();
  79. }