feldman_hashmap_dhp.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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 "test_feldman_hashmap_hp.h"
  6. #include <cds/container/feldman_hashmap_dhp.h>
  7. namespace {
  8. namespace cc = cds::container;
  9. typedef cds::gc::DHP gc_type;
  10. class FeldmanHashMap_DHP : public cds_test::feldman_hashmap_hp
  11. {
  12. protected:
  13. typedef cds_test::feldman_hashmap_hp base_class;
  14. void SetUp()
  15. {
  16. typedef cc::FeldmanHashMap< gc_type, key_type, value_type > map_type;
  17. cds::gc::dhp::smr::construct( map_type::c_nHazardPtrCount );
  18. cds::threading::Manager::attachThread();
  19. }
  20. void TearDown()
  21. {
  22. cds::threading::Manager::detachThread();
  23. cds::gc::dhp::smr::destruct();
  24. }
  25. };
  26. TEST_F( FeldmanHashMap_DHP, defaulted )
  27. {
  28. typedef cc::FeldmanHashMap< gc_type, key_type, value_type > map_type;
  29. map_type m;
  30. test( m );
  31. }
  32. TEST_F( FeldmanHashMap_DHP, compare )
  33. {
  34. typedef cc::FeldmanHashMap< gc_type, key_type, value_type,
  35. typename cc::feldman_hashmap::make_traits<
  36. cds::opt::compare< cmp >
  37. >::type
  38. > map_type;
  39. map_type m( 4, 5 );
  40. test( m );
  41. }
  42. TEST_F( FeldmanHashMap_DHP, less )
  43. {
  44. typedef cc::FeldmanHashMap< gc_type, key_type, value_type,
  45. typename cc::feldman_hashmap::make_traits<
  46. cds::opt::less< less >
  47. >::type
  48. > map_type;
  49. map_type m( 3, 2 );
  50. test( m );
  51. }
  52. TEST_F( FeldmanHashMap_DHP, cmpmix )
  53. {
  54. typedef cc::FeldmanHashMap< gc_type, key_type, value_type,
  55. typename cc::feldman_hashmap::make_traits<
  56. cds::opt::less< less >
  57. ,cds::opt::compare< cmp >
  58. >::type
  59. > map_type;
  60. map_type m( 4, 4 );
  61. test( m );
  62. }
  63. TEST_F( FeldmanHashMap_DHP, backoff )
  64. {
  65. struct map_traits: public cc::feldman_hashmap::traits
  66. {
  67. typedef cmp compare;
  68. typedef cds::atomicity::item_counter item_counter;
  69. typedef cds::backoff::yield back_off;
  70. };
  71. typedef cc::FeldmanHashMap< gc_type, key_type, value_type, map_traits > map_type;
  72. map_type m( 8, 2 );
  73. test( m );
  74. }
  75. TEST_F( FeldmanHashMap_DHP, stat )
  76. {
  77. struct map_traits: public cc::feldman_hashmap::traits
  78. {
  79. typedef cds::backoff::yield back_off;
  80. typedef cc::feldman_hashmap::stat<> stat;
  81. };
  82. typedef cc::FeldmanHashMap< gc_type, key_type, value_type, map_traits > map_type;
  83. map_type m( 1, 1 );
  84. test( m );
  85. }
  86. TEST_F( FeldmanHashMap_DHP, explicit_key_size )
  87. {
  88. struct map_traits: public cc::feldman_hashmap::traits
  89. {
  90. enum: size_t {
  91. hash_size = sizeof( int ) + sizeof( uint16_t )
  92. };
  93. typedef hash2 hash;
  94. typedef less2 less;
  95. typedef cc::feldman_hashmap::stat<> stat;
  96. };
  97. typedef cc::FeldmanHashMap< gc_type, key_type2, value_type, map_traits > map_type;
  98. map_type m( 5, 3 );
  99. EXPECT_EQ( m.head_size(), static_cast<size_t>(1 << 6));
  100. EXPECT_EQ( m.array_node_size(), static_cast<size_t>(1 << 3));
  101. test( m );
  102. }
  103. TEST_F( FeldmanHashMap_DHP, byte_cut )
  104. {
  105. typedef cc::FeldmanHashMap< gc_type, key_type, value_type,
  106. typename cc::feldman_hashmap::make_traits<
  107. cds::opt::compare< cmp >
  108. , cc::feldman_hashmap::hash_splitter< cds::algo::byte_splitter< key_type >>
  109. >::type
  110. > map_type;
  111. map_type m( 8, 8 );
  112. EXPECT_EQ( m.head_size(), static_cast<size_t>( 1 << 8 ));
  113. EXPECT_EQ( m.array_node_size(), static_cast<size_t>( 1 << 8 ));
  114. test( m );
  115. }
  116. TEST_F( FeldmanHashMap_DHP, byte_cut_explicit_key_size )
  117. {
  118. struct map_traits: public cc::feldman_hashmap::traits
  119. {
  120. enum: size_t {
  121. hash_size = sizeof(int) + sizeof( uint16_t)
  122. };
  123. typedef cds::algo::byte_splitter< key_type2, hash_size > hash_splitter;
  124. typedef hash2 hash;
  125. typedef less2 less;
  126. typedef cc::feldman_hashmap::stat<> stat;
  127. };
  128. typedef cc::FeldmanHashMap< gc_type, key_type2, value_type, map_traits > map_type;
  129. map_type m( 8, 8 );
  130. EXPECT_EQ( m.head_size(), static_cast<size_t>(1 << 8));
  131. EXPECT_EQ( m.array_node_size(), static_cast<size_t>(1 << 8));
  132. test( m );
  133. }
  134. } // namespace