hash_tuple.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. // Copyright (c) 2006-2018 Maxim Khizhinsky
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. // file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #include <cds_test/ext_gtest.h>
  6. #include <cds/opt/hash.h>
  7. namespace {
  8. typedef cds::opt::v::hash_selector< cds::opt::none >::type hashing;
  9. #define HASHING(_n) \
  10. struct hash##_n: public hashing { \
  11. template <typename T> size_t operator()( T const& v ) const { return hashing::operator()(v) + _n ; } \
  12. };
  13. HASHING(2)
  14. HASHING(3)
  15. HASHING(4)
  16. HASHING(5)
  17. HASHING(6)
  18. HASHING(7)
  19. HASHING(8)
  20. HASHING(9)
  21. HASHING(10)
  22. #undef HASHING
  23. TEST( HashTuple, test )
  24. {
  25. int nVal = 5;
  26. size_t nHash = hashing()(nVal);
  27. size_t val[16];
  28. cds::opt::hash< std::tuple< hashing, hash2 > >::pack<cds::opt::none>::hash h2;
  29. h2( val, nVal );
  30. EXPECT_EQ( val[0], nHash );
  31. EXPECT_EQ( val[1], nHash + 2 );
  32. cds::opt::hash< std::tuple< hashing, hash2, hash3 > >::pack<cds::opt::none>::hash h3;
  33. h3( val, nVal );
  34. EXPECT_EQ( val[0], nHash );
  35. EXPECT_EQ( val[1], nHash + 2 );
  36. EXPECT_EQ( val[2], nHash + 3 );
  37. cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4 > >::pack<cds::opt::none>::hash h4;
  38. h4( val, nVal );
  39. EXPECT_EQ( val[0], nHash );
  40. EXPECT_EQ( val[1], nHash + 2 );
  41. EXPECT_EQ( val[2], nHash + 3 );
  42. EXPECT_EQ( val[3], nHash + 4 );
  43. cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5 > >::pack<cds::opt::none>::hash h5;
  44. h5( val, nVal );
  45. EXPECT_EQ( val[0], nHash );
  46. EXPECT_EQ( val[1], nHash + 2 );
  47. EXPECT_EQ( val[2], nHash + 3 );
  48. EXPECT_EQ( val[3], nHash + 4 );
  49. EXPECT_EQ( val[4], nHash + 5 );
  50. cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6 > >::pack<cds::opt::none>::hash h6;
  51. h6( val, nVal );
  52. EXPECT_EQ( val[0], nHash );
  53. EXPECT_EQ( val[1], nHash + 2 );
  54. EXPECT_EQ( val[2], nHash + 3 );
  55. EXPECT_EQ( val[3], nHash + 4 );
  56. EXPECT_EQ( val[4], nHash + 5 );
  57. EXPECT_EQ( val[5], nHash + 6 );
  58. cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7 > >::pack<cds::opt::none>::hash h7;
  59. h7( val, nVal );
  60. EXPECT_EQ( val[0], nHash );
  61. EXPECT_EQ( val[1], nHash + 2 );
  62. EXPECT_EQ( val[2], nHash + 3 );
  63. EXPECT_EQ( val[3], nHash + 4 );
  64. EXPECT_EQ( val[4], nHash + 5 );
  65. EXPECT_EQ( val[5], nHash + 6 );
  66. EXPECT_EQ( val[6], nHash + 7 );
  67. cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7, hash8 > >::pack<cds::opt::none>::hash h8;
  68. h8( val, nVal );
  69. EXPECT_EQ( val[0], nHash );
  70. EXPECT_EQ( val[1], nHash + 2 );
  71. EXPECT_EQ( val[2], nHash + 3 );
  72. EXPECT_EQ( val[3], nHash + 4 );
  73. EXPECT_EQ( val[4], nHash + 5 );
  74. EXPECT_EQ( val[5], nHash + 6 );
  75. EXPECT_EQ( val[6], nHash + 7 );
  76. EXPECT_EQ( val[7], nHash + 8 );
  77. cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7, hash8, hash9 > >::pack<cds::opt::none>::hash h9;
  78. h9( val, nVal );
  79. EXPECT_EQ( val[0], nHash );
  80. EXPECT_EQ( val[1], nHash + 2 );
  81. EXPECT_EQ( val[2], nHash + 3 );
  82. EXPECT_EQ( val[3], nHash + 4 );
  83. EXPECT_EQ( val[4], nHash + 5 );
  84. EXPECT_EQ( val[5], nHash + 6 );
  85. EXPECT_EQ( val[6], nHash + 7 );
  86. EXPECT_EQ( val[7], nHash + 8 );
  87. EXPECT_EQ( val[8], nHash + 9 );
  88. cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7, hash8, hash9, hash10 > >::pack<cds::opt::none>::hash h10;
  89. h10( val, nVal );
  90. EXPECT_EQ( val[0], nHash );
  91. EXPECT_EQ( val[1], nHash + 2 );
  92. EXPECT_EQ( val[2], nHash + 3 );
  93. EXPECT_EQ( val[3], nHash + 4 );
  94. EXPECT_EQ( val[4], nHash + 5 );
  95. EXPECT_EQ( val[5], nHash + 6 );
  96. EXPECT_EQ( val[6], nHash + 7 );
  97. EXPECT_EQ( val[7], nHash + 8 );
  98. EXPECT_EQ( val[8], nHash + 9 );
  99. EXPECT_EQ( val[9], nHash + 10 );
  100. }
  101. } // namespace