datasketches 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (160) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/ext/datasketches/cpc_wrapper.cpp +12 -13
  4. data/ext/datasketches/ext.cpp +1 -1
  5. data/ext/datasketches/ext.h +4 -0
  6. data/ext/datasketches/extconf.rb +1 -1
  7. data/ext/datasketches/fi_wrapper.cpp +6 -8
  8. data/ext/datasketches/hll_wrapper.cpp +13 -14
  9. data/ext/datasketches/kll_wrapper.cpp +28 -76
  10. data/ext/datasketches/theta_wrapper.cpp +27 -41
  11. data/ext/datasketches/vo_wrapper.cpp +4 -6
  12. data/lib/datasketches/version.rb +1 -1
  13. data/vendor/datasketches-cpp/CMakeLists.txt +1 -0
  14. data/vendor/datasketches-cpp/README.md +4 -4
  15. data/vendor/datasketches-cpp/common/include/MurmurHash3.h +7 -0
  16. data/vendor/datasketches-cpp/common/include/memory_operations.hpp +12 -0
  17. data/vendor/datasketches-cpp/common/test/CMakeLists.txt +24 -0
  18. data/vendor/datasketches-cpp/common/test/integration_test.cpp +77 -0
  19. data/vendor/datasketches-cpp/common/test/test_allocator.hpp +9 -1
  20. data/vendor/datasketches-cpp/cpc/include/cpc_common.hpp +3 -0
  21. data/vendor/datasketches-cpp/cpc/include/cpc_compressor.hpp +2 -2
  22. data/vendor/datasketches-cpp/cpc/include/cpc_compressor_impl.hpp +28 -19
  23. data/vendor/datasketches-cpp/cpc/include/cpc_sketch.hpp +8 -5
  24. data/vendor/datasketches-cpp/cpc/include/cpc_sketch_impl.hpp +19 -14
  25. data/vendor/datasketches-cpp/cpc/include/cpc_union.hpp +2 -2
  26. data/vendor/datasketches-cpp/cpc/include/cpc_union_impl.hpp +6 -6
  27. data/vendor/datasketches-cpp/cpc/include/cpc_util.hpp +0 -6
  28. data/vendor/datasketches-cpp/cpc/include/icon_estimator.hpp +3 -3
  29. data/vendor/datasketches-cpp/cpc/include/u32_table.hpp +3 -3
  30. data/vendor/datasketches-cpp/cpc/include/u32_table_impl.hpp +9 -9
  31. data/vendor/datasketches-cpp/cpc/test/CMakeLists.txt +1 -0
  32. data/vendor/datasketches-cpp/cpc/test/cpc_sketch_allocation_test.cpp +237 -0
  33. data/vendor/datasketches-cpp/fi/include/frequent_items_sketch.hpp +15 -10
  34. data/vendor/datasketches-cpp/fi/include/frequent_items_sketch_impl.hpp +40 -28
  35. data/vendor/datasketches-cpp/fi/include/reverse_purge_hash_map.hpp +19 -13
  36. data/vendor/datasketches-cpp/fi/include/reverse_purge_hash_map_impl.hpp +140 -124
  37. data/vendor/datasketches-cpp/fi/test/frequent_items_sketch_custom_type_test.cpp +15 -12
  38. data/vendor/datasketches-cpp/fi/test/reverse_purge_hash_map_test.cpp +3 -3
  39. data/vendor/datasketches-cpp/hll/CMakeLists.txt +3 -0
  40. data/vendor/datasketches-cpp/hll/include/AuxHashMap-internal.hpp +32 -57
  41. data/vendor/datasketches-cpp/hll/include/AuxHashMap.hpp +9 -8
  42. data/vendor/datasketches-cpp/hll/include/CompositeInterpolationXTable.hpp +2 -2
  43. data/vendor/datasketches-cpp/hll/include/CouponHashSet-internal.hpp +34 -48
  44. data/vendor/datasketches-cpp/hll/include/CouponHashSet.hpp +10 -10
  45. data/vendor/datasketches-cpp/hll/include/CouponList-internal.hpp +45 -77
  46. data/vendor/datasketches-cpp/hll/include/CouponList.hpp +11 -12
  47. data/vendor/datasketches-cpp/hll/include/CubicInterpolation.hpp +2 -2
  48. data/vendor/datasketches-cpp/hll/include/HarmonicNumbers.hpp +2 -2
  49. data/vendor/datasketches-cpp/hll/include/Hll4Array-internal.hpp +15 -14
  50. data/vendor/datasketches-cpp/hll/include/Hll4Array.hpp +1 -1
  51. data/vendor/datasketches-cpp/hll/include/Hll6Array-internal.hpp +10 -21
  52. data/vendor/datasketches-cpp/hll/include/Hll6Array.hpp +2 -3
  53. data/vendor/datasketches-cpp/hll/include/Hll8Array-internal.hpp +10 -21
  54. data/vendor/datasketches-cpp/hll/include/Hll8Array.hpp +2 -3
  55. data/vendor/datasketches-cpp/hll/include/HllArray-internal.hpp +28 -55
  56. data/vendor/datasketches-cpp/hll/include/HllArray.hpp +8 -8
  57. data/vendor/datasketches-cpp/hll/include/HllSketch-internal.hpp +9 -11
  58. data/vendor/datasketches-cpp/hll/include/HllSketchImpl.hpp +2 -1
  59. data/vendor/datasketches-cpp/hll/include/HllSketchImplFactory.hpp +34 -31
  60. data/vendor/datasketches-cpp/hll/include/HllUnion-internal.hpp +3 -28
  61. data/vendor/datasketches-cpp/hll/include/HllUtil.hpp +1 -1
  62. data/vendor/datasketches-cpp/hll/include/RelativeErrorTables.hpp +1 -1
  63. data/vendor/datasketches-cpp/hll/include/hll.hpp +6 -34
  64. data/vendor/datasketches-cpp/hll/test/AuxHashMapTest.cpp +7 -7
  65. data/vendor/datasketches-cpp/hll/test/CouponHashSetTest.cpp +2 -2
  66. data/vendor/datasketches-cpp/hll/test/CouponListTest.cpp +3 -3
  67. data/vendor/datasketches-cpp/hll/test/HllArrayTest.cpp +2 -2
  68. data/vendor/datasketches-cpp/hll/test/HllSketchTest.cpp +46 -50
  69. data/vendor/datasketches-cpp/kll/include/kll_quantile_calculator.hpp +1 -1
  70. data/vendor/datasketches-cpp/kll/include/kll_quantile_calculator_impl.hpp +3 -3
  71. data/vendor/datasketches-cpp/kll/include/kll_sketch.hpp +10 -3
  72. data/vendor/datasketches-cpp/kll/include/kll_sketch_impl.hpp +93 -75
  73. data/vendor/datasketches-cpp/kll/test/kll_sketch_custom_type_test.cpp +11 -10
  74. data/vendor/datasketches-cpp/kll/test/kll_sketch_test.cpp +45 -42
  75. data/vendor/datasketches-cpp/python/CMakeLists.txt +2 -0
  76. data/vendor/datasketches-cpp/python/README.md +6 -3
  77. data/vendor/datasketches-cpp/python/src/datasketches.cpp +2 -0
  78. data/vendor/datasketches-cpp/python/src/hll_wrapper.cpp +0 -2
  79. data/vendor/datasketches-cpp/python/src/kll_wrapper.cpp +3 -1
  80. data/vendor/datasketches-cpp/python/src/req_wrapper.cpp +246 -0
  81. data/vendor/datasketches-cpp/python/src/theta_wrapper.cpp +36 -26
  82. data/vendor/datasketches-cpp/python/tests/hll_test.py +0 -1
  83. data/vendor/datasketches-cpp/python/tests/kll_test.py +3 -3
  84. data/vendor/datasketches-cpp/python/tests/req_test.py +126 -0
  85. data/vendor/datasketches-cpp/python/tests/theta_test.py +28 -3
  86. data/vendor/datasketches-cpp/req/CMakeLists.txt +60 -0
  87. data/vendor/datasketches-cpp/{tuple/include/theta_a_not_b_experimental_impl.hpp → req/include/req_common.hpp} +17 -8
  88. data/vendor/datasketches-cpp/req/include/req_compactor.hpp +137 -0
  89. data/vendor/datasketches-cpp/req/include/req_compactor_impl.hpp +501 -0
  90. data/vendor/datasketches-cpp/req/include/req_quantile_calculator.hpp +69 -0
  91. data/vendor/datasketches-cpp/req/include/req_quantile_calculator_impl.hpp +60 -0
  92. data/vendor/datasketches-cpp/req/include/req_sketch.hpp +395 -0
  93. data/vendor/datasketches-cpp/req/include/req_sketch_impl.hpp +810 -0
  94. data/vendor/datasketches-cpp/req/test/CMakeLists.txt +43 -0
  95. data/vendor/datasketches-cpp/req/test/req_float_empty_from_java.sk +0 -0
  96. data/vendor/datasketches-cpp/req/test/req_float_estimation_from_java.sk +0 -0
  97. data/vendor/datasketches-cpp/req/test/req_float_exact_from_java.sk +0 -0
  98. data/vendor/datasketches-cpp/req/test/req_float_raw_items_from_java.sk +0 -0
  99. data/vendor/datasketches-cpp/req/test/req_float_single_item_from_java.sk +0 -0
  100. data/vendor/datasketches-cpp/req/test/req_sketch_custom_type_test.cpp +128 -0
  101. data/vendor/datasketches-cpp/req/test/req_sketch_test.cpp +494 -0
  102. data/vendor/datasketches-cpp/sampling/include/var_opt_sketch.hpp +10 -9
  103. data/vendor/datasketches-cpp/sampling/include/var_opt_sketch_impl.hpp +82 -70
  104. data/vendor/datasketches-cpp/sampling/include/var_opt_union.hpp +5 -5
  105. data/vendor/datasketches-cpp/sampling/include/var_opt_union_impl.hpp +7 -7
  106. data/vendor/datasketches-cpp/sampling/test/CMakeLists.txt +1 -0
  107. data/vendor/datasketches-cpp/sampling/test/var_opt_allocation_test.cpp +96 -0
  108. data/vendor/datasketches-cpp/sampling/test/var_opt_union_test.cpp +0 -31
  109. data/vendor/datasketches-cpp/setup.py +5 -3
  110. data/vendor/datasketches-cpp/theta/CMakeLists.txt +30 -3
  111. data/vendor/datasketches-cpp/{tuple → theta}/include/bounds_on_ratios_in_sampled_sets.hpp +2 -1
  112. data/vendor/datasketches-cpp/{tuple → theta}/include/bounds_on_ratios_in_theta_sketched_sets.hpp +1 -1
  113. data/vendor/datasketches-cpp/theta/include/theta_a_not_b.hpp +12 -29
  114. data/vendor/datasketches-cpp/theta/include/theta_a_not_b_impl.hpp +5 -46
  115. data/vendor/datasketches-cpp/{tuple → theta}/include/theta_comparators.hpp +0 -0
  116. data/vendor/datasketches-cpp/{tuple → theta}/include/theta_constants.hpp +2 -0
  117. data/vendor/datasketches-cpp/{tuple → theta}/include/theta_helpers.hpp +0 -0
  118. data/vendor/datasketches-cpp/theta/include/theta_intersection.hpp +22 -29
  119. data/vendor/datasketches-cpp/{tuple → theta}/include/theta_intersection_base.hpp +0 -0
  120. data/vendor/datasketches-cpp/{tuple → theta}/include/theta_intersection_base_impl.hpp +0 -0
  121. data/vendor/datasketches-cpp/theta/include/theta_intersection_impl.hpp +8 -90
  122. data/vendor/datasketches-cpp/{tuple/test/theta_union_experimental_test.cpp → theta/include/theta_jaccard_similarity.hpp} +11 -18
  123. data/vendor/datasketches-cpp/{tuple/include/jaccard_similarity.hpp → theta/include/theta_jaccard_similarity_base.hpp} +6 -22
  124. data/vendor/datasketches-cpp/{tuple → theta}/include/theta_set_difference_base.hpp +0 -0
  125. data/vendor/datasketches-cpp/{tuple → theta}/include/theta_set_difference_base_impl.hpp +5 -0
  126. data/vendor/datasketches-cpp/theta/include/theta_sketch.hpp +132 -266
  127. data/vendor/datasketches-cpp/theta/include/theta_sketch_impl.hpp +200 -650
  128. data/vendor/datasketches-cpp/theta/include/theta_union.hpp +27 -60
  129. data/vendor/datasketches-cpp/{tuple → theta}/include/theta_union_base.hpp +1 -1
  130. data/vendor/datasketches-cpp/{tuple → theta}/include/theta_union_base_impl.hpp +5 -0
  131. data/vendor/datasketches-cpp/theta/include/theta_union_impl.hpp +13 -69
  132. data/vendor/datasketches-cpp/{tuple → theta}/include/theta_update_sketch_base.hpp +3 -19
  133. data/vendor/datasketches-cpp/{tuple → theta}/include/theta_update_sketch_base_impl.hpp +6 -1
  134. data/vendor/datasketches-cpp/theta/test/CMakeLists.txt +1 -0
  135. data/vendor/datasketches-cpp/{tuple → theta}/test/theta_jaccard_similarity_test.cpp +2 -3
  136. data/vendor/datasketches-cpp/theta/test/theta_sketch_test.cpp +37 -234
  137. data/vendor/datasketches-cpp/tuple/CMakeLists.txt +3 -35
  138. data/vendor/datasketches-cpp/tuple/include/tuple_jaccard_similarity.hpp +38 -0
  139. data/vendor/datasketches-cpp/tuple/include/tuple_sketch.hpp +28 -13
  140. data/vendor/datasketches-cpp/tuple/include/tuple_sketch_impl.hpp +6 -6
  141. data/vendor/datasketches-cpp/tuple/test/CMakeLists.txt +1 -6
  142. data/vendor/datasketches-cpp/tuple/test/tuple_a_not_b_test.cpp +1 -4
  143. data/vendor/datasketches-cpp/tuple/test/tuple_intersection_test.cpp +1 -4
  144. data/vendor/datasketches-cpp/tuple/test/tuple_jaccard_similarity_test.cpp +2 -1
  145. data/vendor/datasketches-cpp/tuple/test/tuple_sketch_allocation_test.cpp +2 -2
  146. data/vendor/datasketches-cpp/tuple/test/tuple_union_test.cpp +1 -4
  147. metadata +43 -34
  148. data/vendor/datasketches-cpp/tuple/include/theta_a_not_b_experimental.hpp +0 -53
  149. data/vendor/datasketches-cpp/tuple/include/theta_intersection_experimental.hpp +0 -78
  150. data/vendor/datasketches-cpp/tuple/include/theta_intersection_experimental_impl.hpp +0 -43
  151. data/vendor/datasketches-cpp/tuple/include/theta_sketch_experimental.hpp +0 -393
  152. data/vendor/datasketches-cpp/tuple/include/theta_sketch_experimental_impl.hpp +0 -481
  153. data/vendor/datasketches-cpp/tuple/include/theta_union_experimental.hpp +0 -88
  154. data/vendor/datasketches-cpp/tuple/include/theta_union_experimental_impl.hpp +0 -47
  155. data/vendor/datasketches-cpp/tuple/test/theta_a_not_b_experimental_test.cpp +0 -250
  156. data/vendor/datasketches-cpp/tuple/test/theta_compact_empty_from_java.sk +0 -0
  157. data/vendor/datasketches-cpp/tuple/test/theta_compact_estimation_from_java.sk +0 -0
  158. data/vendor/datasketches-cpp/tuple/test/theta_compact_single_item_from_java.sk +0 -0
  159. data/vendor/datasketches-cpp/tuple/test/theta_intersection_experimental_test.cpp +0 -224
  160. data/vendor/datasketches-cpp/tuple/test/theta_sketch_experimental_test.cpp +0 -247
@@ -31,7 +31,7 @@ class Hll4Iterator;
31
31
  template<typename A>
32
32
  class Hll4Array final : public HllArray<A> {
33
33
  public:
34
- explicit Hll4Array(int lgConfigK, bool startFullSize);
34
+ explicit Hll4Array(int lgConfigK, bool startFullSize, const A& allocator);
35
35
  explicit Hll4Array(const Hll4Array<A>& that);
36
36
 
37
37
  virtual ~Hll4Array();
@@ -27,40 +27,29 @@
27
27
  namespace datasketches {
28
28
 
29
29
  template<typename A>
30
- Hll6Array<A>::Hll6Array(const int lgConfigK, const bool startFullSize) :
31
- HllArray<A>(lgConfigK, target_hll_type::HLL_6, startFullSize) {
32
- const int numBytes = this->hll6ArrBytes(lgConfigK);
33
- typedef typename std::allocator_traits<A>::template rebind_alloc<uint8_t> uint8Alloc;
34
- this->hllByteArr = uint8Alloc().allocate(numBytes);
35
- std::fill(this->hllByteArr, this->hllByteArr + numBytes, 0);
36
- }
37
-
38
- template<typename A>
39
- Hll6Array<A>::Hll6Array(const Hll6Array<A>& that) :
40
- HllArray<A>(that)
30
+ Hll6Array<A>::Hll6Array(const int lgConfigK, const bool startFullSize, const A& allocator):
31
+ HllArray<A>(lgConfigK, target_hll_type::HLL_6, startFullSize, allocator)
41
32
  {
42
- // can determine hllByteArr size in parent class, no need to allocate here
43
- }
44
-
45
- template<typename A>
46
- Hll6Array<A>::~Hll6Array() {
47
- // hllByteArr deleted in parent
33
+ const int numBytes = this->hll6ArrBytes(lgConfigK);
34
+ this->hllByteArr.resize(numBytes, 0);
48
35
  }
49
36
 
50
37
  template<typename A>
51
38
  std::function<void(HllSketchImpl<A>*)> Hll6Array<A>::get_deleter() const {
52
39
  return [](HllSketchImpl<A>* ptr) {
53
- typedef typename std::allocator_traits<A>::template rebind_alloc<Hll6Array<A>> hll6Alloc;
40
+ using Hll6Alloc = typename std::allocator_traits<A>::template rebind_alloc<Hll6Array<A>>;
54
41
  Hll6Array<A>* hll = static_cast<Hll6Array<A>*>(ptr);
42
+ Hll6Alloc hll6Alloc(hll->getAllocator());
55
43
  hll->~Hll6Array();
56
- hll6Alloc().deallocate(hll, 1);
44
+ hll6Alloc.deallocate(hll, 1);
57
45
  };
58
46
  }
59
47
 
60
48
  template<typename A>
61
49
  Hll6Array<A>* Hll6Array<A>::copy() const {
62
- typedef typename std::allocator_traits<A>::template rebind_alloc<Hll6Array<A>> hll6Alloc;
63
- return new (hll6Alloc().allocate(1)) Hll6Array<A>(*this);
50
+ using Hll6Alloc = typename std::allocator_traits<A>::template rebind_alloc<Hll6Array<A>>;
51
+ Hll6Alloc hll6Alloc(this->getAllocator());
52
+ return new (hll6Alloc.allocate(1)) Hll6Array<A>(*this);
64
53
  }
65
54
 
66
55
  template<typename A>
@@ -30,10 +30,9 @@ class Hll6Iterator;
30
30
  template<typename A>
31
31
  class Hll6Array final : public HllArray<A> {
32
32
  public:
33
- explicit Hll6Array(int lgConfigK, bool startFullSize);
34
- explicit Hll6Array(const Hll6Array<A>& that);
33
+ Hll6Array(int lgConfigK, bool startFullSize, const A& allocator);
35
34
 
36
- virtual ~Hll6Array();
35
+ virtual ~Hll6Array() = default;
37
36
  virtual std::function<void(HllSketchImpl<A>*)> get_deleter() const;
38
37
 
39
38
  virtual Hll6Array* copy() const;
@@ -25,40 +25,29 @@
25
25
  namespace datasketches {
26
26
 
27
27
  template<typename A>
28
- Hll8Array<A>::Hll8Array(const int lgConfigK, const bool startFullSize) :
29
- HllArray<A>(lgConfigK, target_hll_type::HLL_8, startFullSize) {
30
- const int numBytes = this->hll8ArrBytes(lgConfigK);
31
- typedef typename std::allocator_traits<A>::template rebind_alloc<uint8_t> uint8Alloc;
32
- this->hllByteArr = uint8Alloc().allocate(numBytes);
33
- std::fill(this->hllByteArr, this->hllByteArr + numBytes, 0);
34
- }
35
-
36
- template<typename A>
37
- Hll8Array<A>::Hll8Array(const Hll8Array<A>& that) :
38
- HllArray<A>(that)
28
+ Hll8Array<A>::Hll8Array(const int lgConfigK, const bool startFullSize, const A& allocator):
29
+ HllArray<A>(lgConfigK, target_hll_type::HLL_8, startFullSize, allocator)
39
30
  {
40
- // can determine hllByteArr size in parent class, no need to allocate here
41
- }
42
-
43
- template<typename A>
44
- Hll8Array<A>::~Hll8Array() {
45
- // hllByteArr deleted in parent
31
+ const int numBytes = this->hll8ArrBytes(lgConfigK);
32
+ this->hllByteArr.resize(numBytes, 0);
46
33
  }
47
34
 
48
35
  template<typename A>
49
36
  std::function<void(HllSketchImpl<A>*)> Hll8Array<A>::get_deleter() const {
50
37
  return [](HllSketchImpl<A>* ptr) {
51
- typedef typename std::allocator_traits<A>::template rebind_alloc<Hll8Array<A>> hll8Alloc;
52
38
  Hll8Array<A>* hll = static_cast<Hll8Array<A>*>(ptr);
39
+ using Hll8Alloc = typename std::allocator_traits<A>::template rebind_alloc<Hll8Array<A>>;
40
+ Hll8Alloc hll8Alloc(hll->getAllocator());
53
41
  hll->~Hll8Array();
54
- hll8Alloc().deallocate(hll, 1);
42
+ hll8Alloc.deallocate(hll, 1);
55
43
  };
56
44
  }
57
45
 
58
46
  template<typename A>
59
47
  Hll8Array<A>* Hll8Array<A>::copy() const {
60
- typedef typename std::allocator_traits<A>::template rebind_alloc<Hll8Array<A>> hll8Alloc;
61
- return new (hll8Alloc().allocate(1)) Hll8Array<A>(*this);
48
+ using Hll8Alloc = typename std::allocator_traits<A>::template rebind_alloc<Hll8Array<A>>;
49
+ Hll8Alloc hll8Alloc(this->getAllocator());
50
+ return new (hll8Alloc.allocate(1)) Hll8Array<A>(*this);
62
51
  }
63
52
 
64
53
  template<typename A>
@@ -30,10 +30,9 @@ class Hll8Iterator;
30
30
  template<typename A>
31
31
  class Hll8Array final : public HllArray<A> {
32
32
  public:
33
- explicit Hll8Array(int lgConfigK, bool startFullSize);
34
- explicit Hll8Array(const Hll8Array& that);
33
+ Hll8Array(int lgConfigK, bool startFullSize, const A& allocator);
35
34
 
36
- virtual ~Hll8Array();
35
+ virtual ~Hll8Array() = default;
37
36
  virtual std::function<void(HllSketchImpl<A>*)> get_deleter() const;
38
37
 
39
38
  virtual Hll8Array<A>* copy() const;
@@ -35,48 +35,16 @@
35
35
  namespace datasketches {
36
36
 
37
37
  template<typename A>
38
- HllArray<A>::HllArray(const int lgConfigK, const target_hll_type tgtHllType, bool startFullSize)
39
- : HllSketchImpl<A>(lgConfigK, tgtHllType, hll_mode::HLL, startFullSize) {
40
- hipAccum = 0.0;
41
- kxq0 = 1 << lgConfigK;
42
- kxq1 = 0.0;
43
- curMin = 0;
44
- numAtCurMin = 1 << lgConfigK;
45
- oooFlag = false;
46
- hllByteArr = nullptr; // allocated in derived class
47
- }
48
-
49
- template<typename A>
50
- HllArray<A>::HllArray(const HllArray<A>& that):
51
- HllSketchImpl<A>(that.lgConfigK, that.tgtHllType, hll_mode::HLL, that.startFullSize),
52
- hipAccum(that.hipAccum),
53
- kxq0(that.kxq0),
54
- kxq1(that.kxq1),
55
- hllByteArr(nullptr),
56
- curMin(that.curMin),
57
- numAtCurMin(that.numAtCurMin),
58
- oooFlag(that.oooFlag)
59
- {
60
- const int arrayLen = that.getHllByteArrBytes();
61
- typedef typename std::allocator_traits<A>::template rebind_alloc<uint8_t> uint8Alloc;
62
- hllByteArr = uint8Alloc().allocate(arrayLen);
63
- std::copy(that.hllByteArr, that.hllByteArr + arrayLen, hllByteArr);
64
- }
65
-
66
- template<typename A>
67
- HllArray<A>::~HllArray() {
68
- // need to determine number of bytes to deallocate
69
- int hllArrBytes = 0;
70
- if (this->tgtHllType == target_hll_type::HLL_4) {
71
- hllArrBytes = hll4ArrBytes(this->lgConfigK);
72
- } else if (this->tgtHllType == target_hll_type::HLL_6) {
73
- hllArrBytes = hll6ArrBytes(this->lgConfigK);
74
- } else { // tgtHllType == HLL_8
75
- hllArrBytes = hll8ArrBytes(this->lgConfigK);
76
- }
77
- typedef typename std::allocator_traits<A>::template rebind_alloc<uint8_t> uint8Alloc;
78
- uint8Alloc().deallocate(hllByteArr, hllArrBytes);
79
- }
38
+ HllArray<A>::HllArray(const int lgConfigK, const target_hll_type tgtHllType, bool startFullSize, const A& allocator):
39
+ HllSketchImpl<A>(lgConfigK, tgtHllType, hll_mode::HLL, startFullSize),
40
+ hipAccum(0.0),
41
+ kxq0(1 << lgConfigK),
42
+ kxq1(0.0),
43
+ hllByteArr(allocator),
44
+ curMin(0),
45
+ numAtCurMin(1 << lgConfigK),
46
+ oooFlag(false)
47
+ {}
80
48
 
81
49
  template<typename A>
82
50
  HllArray<A>* HllArray<A>::copyAs(const target_hll_type tgtHllType) const {
@@ -93,7 +61,7 @@ HllArray<A>* HllArray<A>::copyAs(const target_hll_type tgtHllType) const {
93
61
  }
94
62
 
95
63
  template<typename A>
96
- HllArray<A>* HllArray<A>::newHll(const void* bytes, size_t len) {
64
+ HllArray<A>* HllArray<A>::newHll(const void* bytes, size_t len, const A& allocator) {
97
65
  if (len < HllUtil<A>::HLL_BYTE_ARR_START) {
98
66
  throw std::out_of_range("Input data length insufficient to hold HLL array");
99
67
  }
@@ -143,11 +111,11 @@ HllArray<A>* HllArray<A>::newHll(const void* bytes, size_t len) {
143
111
  int auxLgIntArrSize = (int) data[4];
144
112
  const size_t offset = HllUtil<A>::HLL_BYTE_ARR_START + arrayBytes;
145
113
  const uint8_t* auxDataStart = data + offset;
146
- auxHashMap = AuxHashMap<A>::deserialize(auxDataStart, len - offset, lgK, auxCount, auxLgIntArrSize, comapctFlag);
114
+ auxHashMap = AuxHashMap<A>::deserialize(auxDataStart, len - offset, lgK, auxCount, auxLgIntArrSize, comapctFlag, allocator);
147
115
  aux_ptr = aux_hash_map_ptr(auxHashMap, auxHashMap->make_deleter());
148
116
  }
149
117
 
150
- HllArray<A>* sketch = HllSketchImplFactory<A>::newHll(lgK, tgtHllType, startFullSizeFlag);
118
+ HllArray<A>* sketch = HllSketchImplFactory<A>::newHll(lgK, tgtHllType, startFullSizeFlag, allocator);
151
119
  sketch->putCurMin(curMin);
152
120
  sketch->putOutOfOrderFlag(oooFlag);
153
121
  if (!oooFlag) sketch->putHipAccum(hip);
@@ -155,7 +123,7 @@ HllArray<A>* HllArray<A>::newHll(const void* bytes, size_t len) {
155
123
  sketch->putKxQ1(kxq1);
156
124
  sketch->putNumAtCurMin(numAtCurMin);
157
125
 
158
- std::memcpy(sketch->hllByteArr, data + HllUtil<A>::HLL_BYTE_ARR_START, arrayBytes);
126
+ std::memcpy(sketch->hllByteArr.data(), data + HllUtil<A>::HLL_BYTE_ARR_START, arrayBytes);
159
127
 
160
128
  if (auxHashMap != nullptr)
161
129
  ((Hll4Array<A>*)sketch)->putAuxHashMap(auxHashMap);
@@ -165,7 +133,7 @@ HllArray<A>* HllArray<A>::newHll(const void* bytes, size_t len) {
165
133
  }
166
134
 
167
135
  template<typename A>
168
- HllArray<A>* HllArray<A>::newHll(std::istream& is) {
136
+ HllArray<A>* HllArray<A>::newHll(std::istream& is, const A& allocator) {
169
137
  uint8_t listHeader[8];
170
138
  is.read((char*)listHeader, 8 * sizeof(uint8_t));
171
139
 
@@ -192,7 +160,7 @@ HllArray<A>* HllArray<A>::newHll(std::istream& is) {
192
160
  const int lgK = (int) listHeader[HllUtil<A>::LG_K_BYTE];
193
161
  const int curMin = (int) listHeader[HllUtil<A>::HLL_CUR_MIN_BYTE];
194
162
 
195
- HllArray* sketch = HllSketchImplFactory<A>::newHll(lgK, tgtHllType, startFullSizeFlag);
163
+ HllArray* sketch = HllSketchImplFactory<A>::newHll(lgK, tgtHllType, startFullSizeFlag, allocator);
196
164
  typedef std::unique_ptr<HllArray<A>, std::function<void(HllSketchImpl<A>*)>> hll_array_ptr;
197
165
  hll_array_ptr sketch_ptr(sketch, sketch->get_deleter());
198
166
  sketch->putCurMin(curMin);
@@ -211,11 +179,11 @@ HllArray<A>* HllArray<A>::newHll(std::istream& is) {
211
179
  is.read((char*)&auxCount, sizeof(auxCount));
212
180
  sketch->putNumAtCurMin(numAtCurMin);
213
181
 
214
- is.read((char*)sketch->hllByteArr, sketch->getHllByteArrBytes());
182
+ is.read((char*)sketch->hllByteArr.data(), sketch->getHllByteArrBytes());
215
183
 
216
184
  if (auxCount > 0) { // necessarily TgtHllType == HLL_4
217
185
  int auxLgIntArrSize = listHeader[4];
218
- AuxHashMap<A>* auxHashMap = AuxHashMap<A>::deserialize(is, lgK, auxCount, auxLgIntArrSize, comapctFlag);
186
+ AuxHashMap<A>* auxHashMap = AuxHashMap<A>::deserialize(is, lgK, auxCount, auxLgIntArrSize, comapctFlag, allocator);
219
187
  ((Hll4Array<A>*)sketch)->putAuxHashMap(auxHashMap);
220
188
  }
221
189
 
@@ -228,7 +196,7 @@ HllArray<A>* HllArray<A>::newHll(std::istream& is) {
228
196
  template<typename A>
229
197
  vector_u8<A> HllArray<A>::serialize(bool compact, unsigned header_size_bytes) const {
230
198
  const size_t sketchSizeBytes = (compact ? getCompactSerializationBytes() : getUpdatableSerializationBytes()) + header_size_bytes;
231
- vector_u8<A> byteArr(sketchSizeBytes);
199
+ vector_u8<A> byteArr(sketchSizeBytes, 0, getAllocator());
232
200
  uint8_t* bytes = byteArr.data() + header_size_bytes;
233
201
  AuxHashMap<A>* auxHashMap = getAuxHashMap();
234
202
 
@@ -249,7 +217,7 @@ vector_u8<A> HllArray<A>::serialize(bool compact, unsigned header_size_bytes) co
249
217
  std::memcpy(bytes + HllUtil<A>::AUX_COUNT_INT, &auxCount, sizeof(int));
250
218
 
251
219
  const int hllByteArrBytes = getHllByteArrBytes();
252
- std::memcpy(bytes + getMemDataStart(), hllByteArr, hllByteArrBytes);
220
+ std::memcpy(bytes + getMemDataStart(), hllByteArr.data(), hllByteArrBytes);
253
221
 
254
222
  // aux map if HLL_4
255
223
  if (this->tgtHllType == HLL_4) {
@@ -309,7 +277,7 @@ void HllArray<A>::serialize(std::ostream& os, const bool compact) const {
309
277
 
310
278
  const int auxCount = (auxHashMap == nullptr ? 0 : auxHashMap->getAuxCount());
311
279
  os.write((char*)&auxCount, sizeof(auxCount));
312
- os.write((char*)hllByteArr, getHllByteArrBytes());
280
+ os.write((char*)hllByteArr.data(), getHllByteArrBytes());
313
281
 
314
282
  // aux map if HLL_4
315
283
  if (this->tgtHllType == HLL_4) {
@@ -639,12 +607,12 @@ double HllArray<A>::getHllRawEstimate(const int lgConfigK, const double kxqSum)
639
607
 
640
608
  template<typename A>
641
609
  typename HllArray<A>::const_iterator HllArray<A>::begin(bool all) const {
642
- return const_iterator(hllByteArr, 1 << this->lgConfigK, 0, this->tgtHllType, nullptr, 0, all);
610
+ return const_iterator(hllByteArr.data(), 1 << this->lgConfigK, 0, this->tgtHllType, nullptr, 0, all);
643
611
  }
644
612
 
645
613
  template<typename A>
646
614
  typename HllArray<A>::const_iterator HllArray<A>::end() const {
647
- return const_iterator(hllByteArr, 1 << this->lgConfigK, 1 << this->lgConfigK, this->tgtHllType, nullptr, 0, false);
615
+ return const_iterator(hllByteArr.data(), 1 << this->lgConfigK, 1 << this->lgConfigK, this->tgtHllType, nullptr, 0, false);
648
616
  }
649
617
 
650
618
  template<typename A>
@@ -701,6 +669,11 @@ uint8_t HllArray<A>::const_iterator::get_value(const uint8_t* array, size_t inde
701
669
  return array[index];
702
670
  }
703
671
 
672
+ template<typename A>
673
+ A HllArray<A>::getAllocator() const {
674
+ return hllByteArr.get_allocator();
675
+ }
676
+
704
677
  }
705
678
 
706
679
  #endif // _HLLARRAY_INTERNAL_HPP_
@@ -28,19 +28,18 @@ namespace datasketches {
28
28
  template<typename A>
29
29
  class AuxHashMap;
30
30
 
31
- template<typename A = std::allocator<char>>
31
+ template<typename A>
32
32
  class HllArray : public HllSketchImpl<A> {
33
33
  public:
34
- explicit HllArray(int lgConfigK, target_hll_type tgtHllType, bool startFullSize);
35
- explicit HllArray(const HllArray<A>& that);
34
+ HllArray(int lgConfigK, target_hll_type tgtHllType, bool startFullSize, const A& allocator);
36
35
 
37
- static HllArray* newHll(const void* bytes, size_t len);
38
- static HllArray* newHll(std::istream& is);
36
+ static HllArray* newHll(const void* bytes, size_t len, const A& allocator);
37
+ static HllArray* newHll(std::istream& is, const A& allocator);
39
38
 
40
39
  virtual vector_u8<A> serialize(bool compact, unsigned header_size_bytes) const;
41
40
  virtual void serialize(std::ostream& os, bool compact) const;
42
41
 
43
- virtual ~HllArray();
42
+ virtual ~HllArray() = default;
44
43
  virtual std::function<void(HllSketchImpl<A>*)> get_deleter() const = 0;
45
44
 
46
45
  virtual HllArray* copy() const = 0;
@@ -95,6 +94,8 @@ class HllArray : public HllSketchImpl<A> {
95
94
  virtual const_iterator begin(bool all = false) const;
96
95
  virtual const_iterator end() const;
97
96
 
97
+ virtual A getAllocator() const;
98
+
98
99
  protected:
99
100
  void hipAndKxQIncrementalUpdate(uint8_t oldValue, uint8_t newValue);
100
101
  double getHllBitMapEstimate(int lgConfigK, int curMin, int numAtCurMin) const;
@@ -103,7 +104,7 @@ class HllArray : public HllSketchImpl<A> {
103
104
  double hipAccum;
104
105
  double kxq0;
105
106
  double kxq1;
106
- uint8_t* hllByteArr; //init by sub-classes
107
+ vector_u8<A> hllByteArr; //init by sub-classes
107
108
  int curMin; //always zero for Hll6 and Hll8, only tracked by Hll4Array
108
109
  int numAtCurMin; //interpreted as num zeros when curMin == 0
109
110
  bool oooFlag; //Out-Of-Order Flag
@@ -115,7 +116,6 @@ template<typename A>
115
116
  class HllArray<A>::const_iterator: public std::iterator<std::input_iterator_tag, uint32_t> {
116
117
  public:
117
118
  const_iterator(const uint8_t* array, size_t array_slze, size_t index, target_hll_type hll_type, const AuxHashMap<A>* exceptions, uint8_t offset, bool all);
118
- //const_iterator(const uint8_t* array, size_t array_slze, size_t index, target_hll_type hll_type, const AuxHashMap<A>* exceptions, uint8_t offset);
119
119
  const_iterator& operator++();
120
120
  bool operator!=(const const_iterator& other) const;
121
121
  uint32_t operator*() const;
@@ -42,28 +42,26 @@ typedef union {
42
42
  } longDoubleUnion;
43
43
 
44
44
  template<typename A>
45
- hll_sketch_alloc<A>::hll_sketch_alloc(int lg_config_k, target_hll_type tgt_type, bool start_full_size) {
45
+ hll_sketch_alloc<A>::hll_sketch_alloc(int lg_config_k, target_hll_type tgt_type, bool start_full_size, const A& allocator) {
46
46
  HllUtil<A>::checkLgK(lg_config_k);
47
47
  if (start_full_size) {
48
- sketch_impl = HllSketchImplFactory<A>::newHll(lg_config_k, tgt_type, start_full_size);
48
+ sketch_impl = HllSketchImplFactory<A>::newHll(lg_config_k, tgt_type, start_full_size, allocator);
49
49
  } else {
50
50
  typedef typename std::allocator_traits<A>::template rebind_alloc<CouponList<A>> clAlloc;
51
- sketch_impl = new (clAlloc().allocate(1)) CouponList<A>(lg_config_k, tgt_type, hll_mode::LIST);
51
+ sketch_impl = new (clAlloc(allocator).allocate(1)) CouponList<A>(lg_config_k, tgt_type, hll_mode::LIST, allocator);
52
52
  }
53
53
  }
54
54
 
55
55
  template<typename A>
56
- hll_sketch_alloc<A> hll_sketch_alloc<A>::deserialize(std::istream& is) {
57
- HllSketchImpl<A>* impl = HllSketchImplFactory<A>::deserialize(is);
58
- hll_sketch_alloc<A> sketch(impl);
59
- return sketch;
56
+ hll_sketch_alloc<A> hll_sketch_alloc<A>::deserialize(std::istream& is, const A& allocator) {
57
+ HllSketchImpl<A>* impl = HllSketchImplFactory<A>::deserialize(is, allocator);
58
+ return hll_sketch_alloc<A>(impl);
60
59
  }
61
60
 
62
61
  template<typename A>
63
- hll_sketch_alloc<A> hll_sketch_alloc<A>::deserialize(const void* bytes, size_t len) {
64
- HllSketchImpl<A>* impl = HllSketchImplFactory<A>::deserialize(bytes, len);
65
- hll_sketch_alloc<A> sketch(impl);
66
- return sketch;
62
+ hll_sketch_alloc<A> hll_sketch_alloc<A>::deserialize(const void* bytes, size_t len, const A& allocator) {
63
+ HllSketchImpl<A>* impl = HllSketchImplFactory<A>::deserialize(bytes, len, allocator);
64
+ return hll_sketch_alloc<A>(impl);
67
65
  }
68
66
 
69
67
  template<typename A>
@@ -27,7 +27,7 @@
27
27
 
28
28
  namespace datasketches {
29
29
 
30
- template<typename A = std::allocator<char>>
30
+ template<typename A>
31
31
  class HllSketchImpl {
32
32
  public:
33
33
  HllSketchImpl(int lgConfigK, target_hll_type tgtHllType, hll_mode mode, bool startFullSize);
@@ -66,6 +66,7 @@ class HllSketchImpl {
66
66
  virtual bool isEmpty() const = 0;
67
67
  virtual bool isOutOfOrderFlag() const = 0;
68
68
  virtual void putOutOfOrderFlag(bool oooFlag) = 0;
69
+ virtual A getAllocator() const = 0;
69
70
  bool isStartFullSize() const;
70
71
 
71
72
  protected:
@@ -31,15 +31,15 @@
31
31
 
32
32
  namespace datasketches {
33
33
 
34
- template<typename A = std::allocator<char>>
34
+ template<typename A>
35
35
  class HllSketchImplFactory final {
36
36
  public:
37
- static HllSketchImpl<A>* deserialize(std::istream& os);
38
- static HllSketchImpl<A>* deserialize(const void* bytes, size_t len);
37
+ static HllSketchImpl<A>* deserialize(std::istream& os, const A& allocator);
38
+ static HllSketchImpl<A>* deserialize(const void* bytes, size_t len, const A& allocator);
39
39
 
40
40
  static CouponHashSet<A>* promoteListToSet(const CouponList<A>& list);
41
41
  static HllArray<A>* promoteListOrSetToHll(const CouponList<A>& list);
42
- static HllArray<A>* newHll(int lgConfigK, target_hll_type tgtHllType, bool startFullSize = false);
42
+ static HllArray<A>* newHll(int lgConfigK, target_hll_type tgtHllType, bool startFullSize, const A& allocator);
43
43
 
44
44
  // resets the input impl, deleting the input pointer and returning a new pointer
45
45
  static HllSketchImpl<A>* reset(HllSketchImpl<A>* impl, bool startFullSize);
@@ -51,8 +51,8 @@ public:
51
51
 
52
52
  template<typename A>
53
53
  CouponHashSet<A>* HllSketchImplFactory<A>::promoteListToSet(const CouponList<A>& list) {
54
- typedef typename std::allocator_traits<A>::template rebind_alloc<CouponHashSet<A>> chsAlloc;
55
- CouponHashSet<A>* chSet = new (chsAlloc().allocate(1)) CouponHashSet<A>(list.getLgConfigK(), list.getTgtHllType());
54
+ using ChsAlloc = typename std::allocator_traits<A>::template rebind_alloc<CouponHashSet<A>>;
55
+ CouponHashSet<A>* chSet = new (ChsAlloc(list.getAllocator()).allocate(1)) CouponHashSet<A>(list.getLgConfigK(), list.getTgtHllType(), list.getAllocator());
56
56
  for (auto coupon: list) {
57
57
  chSet->couponUpdate(coupon);
58
58
  }
@@ -61,7 +61,7 @@ CouponHashSet<A>* HllSketchImplFactory<A>::promoteListToSet(const CouponList<A>&
61
61
 
62
62
  template<typename A>
63
63
  HllArray<A>* HllSketchImplFactory<A>::promoteListOrSetToHll(const CouponList<A>& src) {
64
- HllArray<A>* tgtHllArr = HllSketchImplFactory<A>::newHll(src.getLgConfigK(), src.getTgtHllType());
64
+ HllArray<A>* tgtHllArr = HllSketchImplFactory<A>::newHll(src.getLgConfigK(), src.getTgtHllType(), false, src.getAllocator());
65
65
  tgtHllArr->putKxQ0(1 << src.getLgConfigK());
66
66
  for (auto coupon: src) {
67
67
  tgtHllArr->couponUpdate(coupon);
@@ -72,48 +72,48 @@ HllArray<A>* HllSketchImplFactory<A>::promoteListOrSetToHll(const CouponList<A>&
72
72
  }
73
73
 
74
74
  template<typename A>
75
- HllSketchImpl<A>* HllSketchImplFactory<A>::deserialize(std::istream& is) {
75
+ HllSketchImpl<A>* HllSketchImplFactory<A>::deserialize(std::istream& is, const A& allocator) {
76
76
  // we'll hand off the sketch based on PreInts so we don't need
77
77
  // to move the stream pointer back and forth -- perhaps somewhat fragile?
78
78
  const int preInts = is.peek();
79
79
  if (preInts == HllUtil<A>::HLL_PREINTS) {
80
- return HllArray<A>::newHll(is);
80
+ return HllArray<A>::newHll(is, allocator);
81
81
  } else if (preInts == HllUtil<A>::HASH_SET_PREINTS) {
82
- return CouponHashSet<A>::newSet(is);
82
+ return CouponHashSet<A>::newSet(is, allocator);
83
83
  } else if (preInts == HllUtil<A>::LIST_PREINTS) {
84
- return CouponList<A>::newList(is);
84
+ return CouponList<A>::newList(is, allocator);
85
85
  } else {
86
86
  throw std::invalid_argument("Attempt to deserialize unknown object type");
87
87
  }
88
88
  }
89
89
 
90
90
  template<typename A>
91
- HllSketchImpl<A>* HllSketchImplFactory<A>::deserialize(const void* bytes, size_t len) {
91
+ HllSketchImpl<A>* HllSketchImplFactory<A>::deserialize(const void* bytes, size_t len, const A& allocator) {
92
92
  // read current mode directly
93
93
  const int preInts = static_cast<const uint8_t*>(bytes)[0];
94
94
  if (preInts == HllUtil<A>::HLL_PREINTS) {
95
- return HllArray<A>::newHll(bytes, len);
95
+ return HllArray<A>::newHll(bytes, len, allocator);
96
96
  } else if (preInts == HllUtil<A>::HASH_SET_PREINTS) {
97
- return CouponHashSet<A>::newSet(bytes, len);
97
+ return CouponHashSet<A>::newSet(bytes, len, allocator);
98
98
  } else if (preInts == HllUtil<A>::LIST_PREINTS) {
99
- return CouponList<A>::newList(bytes, len);
99
+ return CouponList<A>::newList(bytes, len, allocator);
100
100
  } else {
101
101
  throw std::invalid_argument("Attempt to deserialize unknown object type");
102
102
  }
103
103
  }
104
104
 
105
105
  template<typename A>
106
- HllArray<A>* HllSketchImplFactory<A>::newHll(int lgConfigK, target_hll_type tgtHllType, bool startFullSize) {
106
+ HllArray<A>* HllSketchImplFactory<A>::newHll(int lgConfigK, target_hll_type tgtHllType, bool startFullSize, const A& allocator) {
107
107
  switch (tgtHllType) {
108
108
  case HLL_8:
109
- typedef typename std::allocator_traits<A>::template rebind_alloc<Hll8Array<A>> hll8Alloc;
110
- return new (hll8Alloc().allocate(1)) Hll8Array<A>(lgConfigK, startFullSize);
109
+ using Hll8Alloc = typename std::allocator_traits<A>::template rebind_alloc<Hll8Array<A>>;
110
+ return new (Hll8Alloc(allocator).allocate(1)) Hll8Array<A>(lgConfigK, startFullSize, allocator);
111
111
  case HLL_6:
112
- typedef typename std::allocator_traits<A>::template rebind_alloc<Hll6Array<A>> hll6Alloc;
113
- return new (hll6Alloc().allocate(1)) Hll6Array<A>(lgConfigK, startFullSize);
112
+ using Hll6Alloc = typename std::allocator_traits<A>::template rebind_alloc<Hll6Array<A>>;
113
+ return new (Hll6Alloc(allocator).allocate(1)) Hll6Array<A>(lgConfigK, startFullSize, allocator);
114
114
  case HLL_4:
115
- typedef typename std::allocator_traits<A>::template rebind_alloc<Hll4Array<A>> hll4Alloc;
116
- return new (hll4Alloc().allocate(1)) Hll4Array<A>(lgConfigK, startFullSize);
115
+ using Hll4Alloc = typename std::allocator_traits<A>::template rebind_alloc<Hll4Array<A>>;
116
+ return new (Hll4Alloc(allocator).allocate(1)) Hll4Array<A>(lgConfigK, startFullSize, allocator);
117
117
  }
118
118
  throw std::logic_error("Invalid target_hll_type");
119
119
  }
@@ -121,12 +121,12 @@ HllArray<A>* HllSketchImplFactory<A>::newHll(int lgConfigK, target_hll_type tgtH
121
121
  template<typename A>
122
122
  HllSketchImpl<A>* HllSketchImplFactory<A>::reset(HllSketchImpl<A>* impl, bool startFullSize) {
123
123
  if (startFullSize) {
124
- HllArray<A>* hll = newHll(impl->getLgConfigK(), impl->getTgtHllType(), startFullSize);
124
+ HllArray<A>* hll = newHll(impl->getLgConfigK(), impl->getTgtHllType(), startFullSize, impl->getAllocator());
125
125
  impl->get_deleter()(impl);
126
126
  return hll;
127
127
  } else {
128
- typedef typename std::allocator_traits<A>::template rebind_alloc<CouponList<A>> clAlloc;
129
- CouponList<A>* cl = new (clAlloc().allocate(1)) CouponList<A>(impl->getLgConfigK(), impl->getTgtHllType(), hll_mode::LIST);
128
+ using ClAlloc = typename std::allocator_traits<A>::template rebind_alloc<CouponList<A>>;
129
+ CouponList<A>* cl = new (ClAlloc(impl->getAllocator()).allocate(1)) CouponList<A>(impl->getLgConfigK(), impl->getTgtHllType(), hll_mode::LIST, impl->getAllocator());
130
130
  impl->get_deleter()(impl);
131
131
  return cl;
132
132
  }
@@ -135,8 +135,9 @@ HllSketchImpl<A>* HllSketchImplFactory<A>::reset(HllSketchImpl<A>* impl, bool st
135
135
  template<typename A>
136
136
  Hll4Array<A>* HllSketchImplFactory<A>::convertToHll4(const HllArray<A>& srcHllArr) {
137
137
  const int lgConfigK = srcHllArr.getLgConfigK();
138
- typedef typename std::allocator_traits<A>::template rebind_alloc<Hll4Array<A>> hll4Alloc;
139
- Hll4Array<A>* hll4Array = new (hll4Alloc().allocate(1)) Hll4Array<A>(lgConfigK, srcHllArr.isStartFullSize());
138
+ using Hll4Alloc = typename std::allocator_traits<A>::template rebind_alloc<Hll4Array<A>>;
139
+ Hll4Array<A>* hll4Array = new (Hll4Alloc(srcHllArr.getAllocator()).allocate(1))
140
+ Hll4Array<A>(lgConfigK, srcHllArr.isStartFullSize(), srcHllArr.getAllocator());
140
141
  hll4Array->putOutOfOrderFlag(srcHllArr.isOutOfOrderFlag());
141
142
  hll4Array->mergeHll(srcHllArr);
142
143
  hll4Array->putHipAccum(srcHllArr.getHipAccum());
@@ -146,8 +147,9 @@ Hll4Array<A>* HllSketchImplFactory<A>::convertToHll4(const HllArray<A>& srcHllAr
146
147
  template<typename A>
147
148
  Hll6Array<A>* HllSketchImplFactory<A>::convertToHll6(const HllArray<A>& srcHllArr) {
148
149
  const int lgConfigK = srcHllArr.getLgConfigK();
149
- typedef typename std::allocator_traits<A>::template rebind_alloc<Hll6Array<A>> hll6Alloc;
150
- Hll6Array<A>* hll6Array = new (hll6Alloc().allocate(1)) Hll6Array<A>(lgConfigK, srcHllArr.isStartFullSize());
150
+ using Hll6Alloc = typename std::allocator_traits<A>::template rebind_alloc<Hll6Array<A>>;
151
+ Hll6Array<A>* hll6Array = new (Hll6Alloc(srcHllArr.getAllocator()).allocate(1))
152
+ Hll6Array<A>(lgConfigK, srcHllArr.isStartFullSize(), srcHllArr.getAllocator());
151
153
  hll6Array->putOutOfOrderFlag(srcHllArr.isOutOfOrderFlag());
152
154
  hll6Array->mergeHll(srcHllArr);
153
155
  hll6Array->putHipAccum(srcHllArr.getHipAccum());
@@ -157,8 +159,9 @@ Hll6Array<A>* HllSketchImplFactory<A>::convertToHll6(const HllArray<A>& srcHllAr
157
159
  template<typename A>
158
160
  Hll8Array<A>* HllSketchImplFactory<A>::convertToHll8(const HllArray<A>& srcHllArr) {
159
161
  const int lgConfigK = srcHllArr.getLgConfigK();
160
- typedef typename std::allocator_traits<A>::template rebind_alloc<Hll8Array<A>> hll8Alloc;
161
- Hll8Array<A>* hll8Array = new (hll8Alloc().allocate(1)) Hll8Array<A>(lgConfigK, srcHllArr.isStartFullSize());
162
+ using Hll8Alloc = typename std::allocator_traits<A>::template rebind_alloc<Hll8Array<A>>;
163
+ Hll8Array<A>* hll8Array = new (Hll8Alloc(srcHllArr.getAllocator()).allocate(1))
164
+ Hll8Array<A>(lgConfigK, srcHllArr.isStartFullSize(), srcHllArr.getAllocator());
162
165
  hll8Array->putOutOfOrderFlag(srcHllArr.isOutOfOrderFlag());
163
166
  hll8Array->mergeHll(srcHllArr);
164
167
  hll8Array->putHipAccum(srcHllArr.getHipAccum());