You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datasketches.apache.org by al...@apache.org on 2022/08/30 21:51:15 UTC

[datasketches-cpp] branch no_class_level_serde created (now dda51ce)

This is an automated email from the ASF dual-hosted git repository.

alsay pushed a change to branch no_class_level_serde
in repository https://gitbox.apache.org/repos/asf/datasketches-cpp.git


      at dda51ce  removed serde from class template

This branch includes the following new commits:

     new dda51ce  removed serde from class template

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datasketches.apache.org
For additional commands, e-mail: commits-help@datasketches.apache.org


[datasketches-cpp] 01/01: removed serde from class template

Posted by al...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

alsay pushed a commit to branch no_class_level_serde
in repository https://gitbox.apache.org/repos/asf/datasketches-cpp.git

commit dda51cee29ae82054f58ad2e40c9d9cd32605af9
Author: AlexanderSaydakov <Al...@users.noreply.github.com>
AuthorDate: Tue Aug 30 14:51:09 2022 -0700

    removed serde from class template
---
 fi/include/frequent_items_sketch.hpp               |  36 +-----
 fi/include/frequent_items_sketch_impl.hpp          | 144 ++++++++++-----------
 fi/test/frequent_items_sketch_custom_type_test.cpp |  10 +-
 3 files changed, 78 insertions(+), 112 deletions(-)

diff --git a/fi/include/frequent_items_sketch.hpp b/fi/include/frequent_items_sketch.hpp
index 5af6a2b..f447b77 100644
--- a/fi/include/frequent_items_sketch.hpp
+++ b/fi/include/frequent_items_sketch.hpp
@@ -46,7 +46,6 @@ template<
   typename W = uint64_t,
   typename H = std::hash<T>,
   typename E = std::equal_to<T>,
-  typename S = serde<T>, // deprecated, to be removed in the next major version
   typename A = std::allocator<T>
 >
 class frequent_items_sketch {
@@ -228,7 +227,7 @@ public:
    * @param instance of a SerDe
    * @return size in bytes needed to serialize this sketch
    */
-  template<typename SerDe = S>
+  template<typename SerDe = serde<T>>
   size_t get_serialized_size_bytes(const SerDe& sd = SerDe()) const;
 
   /**
@@ -236,7 +235,7 @@ public:
    * @param os output stream
    * @param instance of a SerDe
    */
-  template<typename SerDe = S>
+  template<typename SerDe = serde<T>>
   void serialize(std::ostream& os, const SerDe& sd = SerDe()) const;
 
   // This is a convenience alias for users
@@ -252,19 +251,9 @@ public:
    * @param instance of a SerDe
    * @return serialized sketch as a vector of bytes
    */
-  template<typename SerDe = S>
+  template<typename SerDe = serde<T>>
   vector_bytes serialize(unsigned header_size_bytes = 0, const SerDe& sd = SerDe()) const;
 
-  /**
-   * This method deserializes a sketch from a given stream.
-   * @param is input stream
-   * @param instance of an Allocator
-   * @return an instance of the sketch
-   *
-   * Deprecated, to be removed in the next major version
-   */
-  static frequent_items_sketch deserialize(std::istream& is, const A& allocator = A());
-
   /**
    * This method deserializes a sketch from a given stream.
    * @param is input stream
@@ -272,20 +261,9 @@ public:
    * @param instance of an Allocator
    * @return an instance of the sketch
    */
-  template<typename SerDe = S>
+  template<typename SerDe = serde<T>>
   static frequent_items_sketch deserialize(std::istream& is, const SerDe& sd = SerDe(), const A& allocator = A());
 
-  /**
-   * This method deserializes a sketch from a given array of bytes.
-   * @param bytes pointer to the array of bytes
-   * @param size the size of the array
-   * @param instance of an Allocator
-   * @return an instance of the sketch
-   *
-   * Deprecated, to be removed in the next major version
-   */
-  static frequent_items_sketch deserialize(const void* bytes, size_t size, const A& allocator = A());
-
   /**
    * This method deserializes a sketch from a given array of bytes.
    * @param bytes pointer to the array of bytes
@@ -294,7 +272,7 @@ public:
    * @param instance of an Allocator
    * @return an instance of the sketch
    */
-  template<typename SerDe = S>
+  template<typename SerDe = serde<T>>
   static frequent_items_sketch deserialize(const void* bytes, size_t size, const SerDe& sd = SerDe(), const A& allocator = A());
 
   /**
@@ -334,8 +312,8 @@ private:
   class items_deleter;
 };
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-class frequent_items_sketch<T, W, H, E, S, A>::row {
+template<typename T, typename W, typename H, typename E, typename A>
+class frequent_items_sketch<T, W, H, E, A>::row {
 public:
   row(const T* item, W weight, W offset):
     item(item), weight(weight), offset(offset) {}
diff --git a/fi/include/frequent_items_sketch_impl.hpp b/fi/include/frequent_items_sketch_impl.hpp
index 151f527..e485da7 100644
--- a/fi/include/frequent_items_sketch_impl.hpp
+++ b/fi/include/frequent_items_sketch_impl.hpp
@@ -30,11 +30,11 @@
 namespace datasketches {
 
 // clang++ seems to require this declaration for CMAKE_BUILD_TYPE='Debug"
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-const uint8_t frequent_items_sketch<T, W, H, E, S, A>::LG_MIN_MAP_SIZE;
+template<typename T, typename W, typename H, typename E, typename A>
+const uint8_t frequent_items_sketch<T, W, H, E, A>::LG_MIN_MAP_SIZE;
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-frequent_items_sketch<T, W, H, E, S, A>::frequent_items_sketch(uint8_t lg_max_map_size, uint8_t lg_start_map_size, const A& allocator):
+template<typename T, typename W, typename H, typename E, typename A>
+frequent_items_sketch<T, W, H, E, A>::frequent_items_sketch(uint8_t lg_max_map_size, uint8_t lg_start_map_size, const A& allocator):
 total_weight(0),
 offset(0),
 map(
@@ -46,24 +46,24 @@ map(
   if (lg_start_map_size > lg_max_map_size) throw std::invalid_argument("starting size must not be greater than maximum size");
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-void frequent_items_sketch<T, W, H, E, S, A>::update(const T& item, W weight) {
+template<typename T, typename W, typename H, typename E, typename A>
+void frequent_items_sketch<T, W, H, E, A>::update(const T& item, W weight) {
   check_weight(weight);
   if (weight == 0) return;
   total_weight += weight;
   offset += map.adjust_or_insert(item, weight);
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-void frequent_items_sketch<T, W, H, E, S, A>::update(T&& item, W weight) {
+template<typename T, typename W, typename H, typename E, typename A>
+void frequent_items_sketch<T, W, H, E, A>::update(T&& item, W weight) {
   check_weight(weight);
   if (weight == 0) return;
   total_weight += weight;
   offset += map.adjust_or_insert(std::move(item), weight);
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-void frequent_items_sketch<T, W, H, E, S, A>::merge(const frequent_items_sketch& other) {
+template<typename T, typename W, typename H, typename E, typename A>
+void frequent_items_sketch<T, W, H, E, A>::merge(const frequent_items_sketch& other) {
   if (other.is_empty()) return;
   const W merged_total_weight = total_weight + other.get_total_weight(); // for correction at the end
   for (auto it: other.map) {
@@ -73,8 +73,8 @@ void frequent_items_sketch<T, W, H, E, S, A>::merge(const frequent_items_sketch&
   total_weight = merged_total_weight;
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-void frequent_items_sketch<T, W, H, E, S, A>::merge(frequent_items_sketch&& other) {
+template<typename T, typename W, typename H, typename E, typename A>
+void frequent_items_sketch<T, W, H, E, A>::merge(frequent_items_sketch&& other) {
   if (other.is_empty()) return;
   const W merged_total_weight = total_weight + other.get_total_weight(); // for correction at the end
   for (auto it: other.map) {
@@ -84,69 +84,67 @@ void frequent_items_sketch<T, W, H, E, S, A>::merge(frequent_items_sketch&& othe
   total_weight = merged_total_weight;
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-bool frequent_items_sketch<T, W, H, E, S, A>::is_empty() const {
+template<typename T, typename W, typename H, typename E, typename A>
+bool frequent_items_sketch<T, W, H, E, A>::is_empty() const {
   return map.get_num_active() == 0;
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-uint32_t frequent_items_sketch<T, W, H, E, S, A>::get_num_active_items() const {
+template<typename T, typename W, typename H, typename E, typename A>
+uint32_t frequent_items_sketch<T, W, H, E, A>::get_num_active_items() const {
   return map.get_num_active();
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-W frequent_items_sketch<T, W, H, E, S, A>::get_total_weight() const {
+template<typename T, typename W, typename H, typename E, typename A>
+W frequent_items_sketch<T, W, H, E, A>::get_total_weight() const {
   return total_weight;
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-W frequent_items_sketch<T, W, H, E, S, A>::get_estimate(const T& item) const {
+template<typename T, typename W, typename H, typename E, typename A>
+W frequent_items_sketch<T, W, H, E, A>::get_estimate(const T& item) const {
   // if item is tracked estimate = weight + offset, otherwise 0
   const W weight = map.get(item);
   if (weight > 0) return weight + offset;
   return 0;
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-W frequent_items_sketch<T, W, H, E, S, A>::get_lower_bound(const T& item) const {
+template<typename T, typename W, typename H, typename E, typename A>
+W frequent_items_sketch<T, W, H, E, A>::get_lower_bound(const T& item) const {
   return map.get(item);
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-W frequent_items_sketch<T, W, H, E, S, A>::get_upper_bound(const T& item) const {
+template<typename T, typename W, typename H, typename E, typename A>
+W frequent_items_sketch<T, W, H, E, A>::get_upper_bound(const T& item) const {
   return map.get(item) + offset;
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-W frequent_items_sketch<T, W, H, E, S, A>::get_maximum_error() const {
+template<typename T, typename W, typename H, typename E, typename A>
+W frequent_items_sketch<T, W, H, E, A>::get_maximum_error() const {
   return offset;
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-double frequent_items_sketch<T, W, H, E, S, A>::get_epsilon() const {
+template<typename T, typename W, typename H, typename E, typename A>
+double frequent_items_sketch<T, W, H, E, A>::get_epsilon() const {
   return EPSILON_FACTOR / (1 << map.get_lg_max_size());
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-double frequent_items_sketch<T, W, H, E, S, A>::get_epsilon(uint8_t lg_max_map_size) {
+template<typename T, typename W, typename H, typename E, typename A>
+double frequent_items_sketch<T, W, H, E, A>::get_epsilon(uint8_t lg_max_map_size) {
   return EPSILON_FACTOR / (1 << lg_max_map_size);
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-double frequent_items_sketch<T, W, H, E, S, A>::get_apriori_error(uint8_t lg_max_map_size, W estimated_total_weight) {
+template<typename T, typename W, typename H, typename E, typename A>
+double frequent_items_sketch<T, W, H, E, A>::get_apriori_error(uint8_t lg_max_map_size, W estimated_total_weight) {
   return get_epsilon(lg_max_map_size) * estimated_total_weight;
 }
 
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-typename frequent_items_sketch<T, W, H, E, S, A>::vector_row
-frequent_items_sketch<T, W, H, E, S, A>::get_frequent_items(frequent_items_error_type err_type) const {
+template<typename T, typename W, typename H, typename E, typename A>
+auto frequent_items_sketch<T, W, H, E, A>::get_frequent_items(frequent_items_error_type err_type) const -> vector_row {
   return get_frequent_items(err_type, get_maximum_error());
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-typename frequent_items_sketch<T, W, H, E, S, A>::vector_row
-frequent_items_sketch<T, W, H, E, S, A>::get_frequent_items(frequent_items_error_type err_type, W threshold) const {
+template<typename T, typename W, typename H, typename E, typename A>
+auto frequent_items_sketch<T, W, H, E, A>::get_frequent_items(frequent_items_error_type err_type, W threshold) const -> vector_row {
   vector_row items(map.get_allocator());
   for (auto it: map) {
     const W lb = it.second;
@@ -160,9 +158,9 @@ frequent_items_sketch<T, W, H, E, S, A>::get_frequent_items(frequent_items_error
   return items;
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
+template<typename T, typename W, typename H, typename E, typename A>
 template<typename SerDe>
-void frequent_items_sketch<T, W, H, E, S, A>::serialize(std::ostream& os, const SerDe& sd) const {
+void frequent_items_sketch<T, W, H, E, A>::serialize(std::ostream& os, const SerDe& sd) const {
   const uint8_t preamble_longs = is_empty() ? PREAMBLE_LONGS_EMPTY : PREAMBLE_LONGS_NONEMPTY;
   write(os, preamble_longs);
   const uint8_t serial_version = SERIAL_VERSION;
@@ -206,18 +204,18 @@ void frequent_items_sketch<T, W, H, E, S, A>::serialize(std::ostream& os, const
   }
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
+template<typename T, typename W, typename H, typename E, typename A>
 template<typename SerDe>
-size_t frequent_items_sketch<T, W, H, E, S, A>::get_serialized_size_bytes(const SerDe& sd) const {
+size_t frequent_items_sketch<T, W, H, E, A>::get_serialized_size_bytes(const SerDe& sd) const {
   if (is_empty()) return PREAMBLE_LONGS_EMPTY * sizeof(uint64_t);
   size_t size = PREAMBLE_LONGS_NONEMPTY * sizeof(uint64_t) + map.get_num_active() * sizeof(W);
   for (auto it: map) size += sd.size_of_item(it.first);
   return size;
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
+template<typename T, typename W, typename H, typename E, typename A>
 template<typename SerDe>
-auto frequent_items_sketch<T, W, H, E, S, A>::serialize(unsigned header_size_bytes, const SerDe& sd) const -> vector_bytes {
+auto frequent_items_sketch<T, W, H, E, A>::serialize(unsigned header_size_bytes, const SerDe& sd) const -> vector_bytes {
   const size_t size = header_size_bytes + get_serialized_size_bytes(sd);
   vector_bytes bytes(size, 0, map.get_allocator());
   uint8_t* ptr = bytes.data() + header_size_bytes;
@@ -266,8 +264,8 @@ auto frequent_items_sketch<T, W, H, E, S, A>::serialize(unsigned header_size_byt
   return bytes;
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-class frequent_items_sketch<T, W, H, E, S, A>::items_deleter {
+template<typename T, typename W, typename H, typename E, typename A>
+class frequent_items_sketch<T, W, H, E, A>::items_deleter {
 public:
   items_deleter(uint32_t num, bool destroy, const A& allocator):
     allocator_(allocator), num_(num), destroy_(destroy) {}
@@ -286,14 +284,9 @@ private:
   bool destroy_;
 };
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-frequent_items_sketch<T, W, H, E, S, A> frequent_items_sketch<T, W, H, E, S, A>::deserialize(std::istream& is, const A& allocator) {
-  return deserialize(is, S(), allocator);
-}
-
-template<typename T, typename W, typename H, typename E, typename S, typename A>
+template<typename T, typename W, typename H, typename E, typename A>
 template<typename SerDe>
-frequent_items_sketch<T, W, H, E, S, A> frequent_items_sketch<T, W, H, E, S, A>::deserialize(std::istream& is, const SerDe& sd, const A& allocator) {
+frequent_items_sketch<T, W, H, E, A> frequent_items_sketch<T, W, H, E, A>::deserialize(std::istream& is, const SerDe& sd, const A& allocator) {
   const auto preamble_longs = read<uint8_t>(is);
   const auto serial_version = read<uint8_t>(is);
   const auto family_id = read<uint8_t>(is);
@@ -309,7 +302,7 @@ frequent_items_sketch<T, W, H, E, S, A> frequent_items_sketch<T, W, H, E, S, A>:
   check_family_id(family_id);
   check_size(lg_cur_size, lg_max_size);
 
-  frequent_items_sketch<T, W, H, E, S, A> sketch(lg_max_size, lg_cur_size, allocator);
+  frequent_items_sketch sketch(lg_max_size, lg_cur_size, allocator);
   if (!is_empty) {
     const auto num_items = read<uint32_t>(is);
     read<uint32_t>(is); // unused
@@ -335,14 +328,9 @@ frequent_items_sketch<T, W, H, E, S, A> frequent_items_sketch<T, W, H, E, S, A>:
   return sketch;
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-frequent_items_sketch<T, W, H, E, S, A> frequent_items_sketch<T, W, H, E, S, A>::deserialize(const void* bytes, size_t size, const A& allocator) {
-  return deserialize(bytes, size, S(), allocator);
-}
-
-template<typename T, typename W, typename H, typename E, typename S, typename A>
+template<typename T, typename W, typename H, typename E, typename A>
 template<typename SerDe>
-frequent_items_sketch<T, W, H, E, S, A> frequent_items_sketch<T, W, H, E, S, A>::deserialize(const void* bytes, size_t size, const SerDe& sd, const A& allocator) {
+frequent_items_sketch<T, W, H, E, A> frequent_items_sketch<T, W, H, E, A>::deserialize(const void* bytes, size_t size, const SerDe& sd, const A& allocator) {
   ensure_minimum_memory(size, 8);
   const char* ptr = static_cast<const char*>(bytes);
   const char* base = static_cast<const char*>(bytes);
@@ -368,7 +356,7 @@ frequent_items_sketch<T, W, H, E, S, A> frequent_items_sketch<T, W, H, E, S, A>:
   check_size(lg_cur_size, lg_max_size);
   ensure_minimum_memory(size, preamble_longs * sizeof(uint64_t));
 
-  frequent_items_sketch<T, W, H, E, S, A> sketch(lg_max_size, lg_cur_size, allocator);
+  frequent_items_sketch sketch(lg_max_size, lg_cur_size, allocator);
   if (!is_empty) {
     uint32_t num_items;
     ptr += copy_from_mem(ptr, num_items);
@@ -398,8 +386,8 @@ frequent_items_sketch<T, W, H, E, S, A> frequent_items_sketch<T, W, H, E, S, A>:
   return sketch;
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-void frequent_items_sketch<T, W, H, E, S, A>::check_preamble_longs(uint8_t preamble_longs, bool is_empty) {
+template<typename T, typename W, typename H, typename E, typename A>
+void frequent_items_sketch<T, W, H, E, A>::check_preamble_longs(uint8_t preamble_longs, bool is_empty) {
   if (is_empty) {
     if (preamble_longs != PREAMBLE_LONGS_EMPTY) {
       throw std::invalid_argument("Possible corruption: preamble longs of an empty sketch must be " + std::to_string(PREAMBLE_LONGS_EMPTY) + ": " + std::to_string(preamble_longs));
@@ -411,22 +399,22 @@ void frequent_items_sketch<T, W, H, E, S, A>::check_preamble_longs(uint8_t pream
   }
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-void frequent_items_sketch<T, W, H, E, S, A>::check_serial_version(uint8_t serial_version) {
+template<typename T, typename W, typename H, typename E, typename A>
+void frequent_items_sketch<T, W, H, E, A>::check_serial_version(uint8_t serial_version) {
   if (serial_version != SERIAL_VERSION) {
     throw std::invalid_argument("Possible corruption: serial version must be " + std::to_string(SERIAL_VERSION) + ": " + std::to_string(serial_version));
   }
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-void frequent_items_sketch<T, W, H, E, S, A>::check_family_id(uint8_t family_id) {
+template<typename T, typename W, typename H, typename E, typename A>
+void frequent_items_sketch<T, W, H, E, A>::check_family_id(uint8_t family_id) {
   if (family_id != FAMILY_ID) {
     throw std::invalid_argument("Possible corruption: family ID must be " + std::to_string(FAMILY_ID) + ": " + std::to_string(family_id));
   }
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-void frequent_items_sketch<T, W, H, E, S, A>::check_size(uint8_t lg_cur_size, uint8_t lg_max_size) {
+template<typename T, typename W, typename H, typename E, typename A>
+void frequent_items_sketch<T, W, H, E, A>::check_size(uint8_t lg_cur_size, uint8_t lg_max_size) {
   if (lg_cur_size > lg_max_size) {
     throw std::invalid_argument("Possible corruption: expected lg_cur_size <= lg_max_size: " + std::to_string(lg_cur_size) + " <= " + std::to_string(lg_max_size));
   }
@@ -435,8 +423,8 @@ void frequent_items_sketch<T, W, H, E, S, A>::check_size(uint8_t lg_cur_size, ui
   }
 }
 
-template<typename T, typename W, typename H, typename E, typename S, typename A>
-string<A> frequent_items_sketch<T, W, H, E, S, A>::to_string(bool print_items) const {
+template<typename T, typename W, typename H, typename E, typename A>
+string<A> frequent_items_sketch<T, W, H, E, A>::to_string(bool print_items) const {
   // Using a temporary stream for implementation here does not comply with AllocatorAwareContainer requirements.
   // The stream does not support passing an allocator instance, and alternatives are complicated.
   std::ostringstream os;
@@ -466,23 +454,23 @@ string<A> frequent_items_sketch<T, W, H, E, S, A>::to_string(bool print_items) c
 }
 
 // version for integral signed type
-template<typename T, typename W, typename H, typename E, typename S, typename A>
+template<typename T, typename W, typename H, typename E, typename A>
 template<typename WW, typename std::enable_if<std::is_integral<WW>::value && std::is_signed<WW>::value, int>::type>
-void frequent_items_sketch<T, W, H, E, S, A>::check_weight(WW weight) {
+void frequent_items_sketch<T, W, H, E, A>::check_weight(WW weight) {
   if (weight < 0) {
     throw std::invalid_argument("weight must be non-negative");
   }
 }
 
 // version for integral unsigned type - no-op
-template<typename T, typename W, typename H, typename E, typename S, typename A>
+template<typename T, typename W, typename H, typename E, typename A>
 template<typename WW, typename std::enable_if<std::is_integral<WW>::value && std::is_unsigned<WW>::value, int>::type>
-void frequent_items_sketch<T, W, H, E, S, A>::check_weight(WW) {}
+void frequent_items_sketch<T, W, H, E, A>::check_weight(WW) {}
 
 // version for floating point type
-template<typename T, typename W, typename H, typename E, typename S, typename A>
+template<typename T, typename W, typename H, typename E, typename A>
 template<typename WW, typename std::enable_if<std::is_floating_point<WW>::value, int>::type>
-void frequent_items_sketch<T, W, H, E, S, A>::check_weight(WW weight) {
+void frequent_items_sketch<T, W, H, E, A>::check_weight(WW weight) {
   if (weight < 0) {
     throw std::invalid_argument("weight must be non-negative");
   }
diff --git a/fi/test/frequent_items_sketch_custom_type_test.cpp b/fi/test/frequent_items_sketch_custom_type_test.cpp
index b638da9..bf12989 100644
--- a/fi/test/frequent_items_sketch_custom_type_test.cpp
+++ b/fi/test/frequent_items_sketch_custom_type_test.cpp
@@ -27,7 +27,7 @@
 
 namespace datasketches {
 
-using frequent_test_type_sketch = frequent_items_sketch<test_type, float, test_type_hash, test_type_equal, test_type_serde, test_allocator<test_type>>;
+using frequent_test_type_sketch = frequent_items_sketch<test_type, float, test_type_hash, test_type_equal, test_allocator<test_type>>;
 using alloc = test_allocator<test_type>;
 
 TEST_CASE("frequent items: custom type", "[frequent_items_sketch]") {
@@ -51,16 +51,16 @@ TEST_CASE("frequent items: custom type", "[frequent_items_sketch]") {
   REQUIRE(items[0].get_estimate() == 10);
 
   std::stringstream s(std::ios::in | std::ios::out | std::ios::binary);
-  sketch.serialize(s);
-  auto sketch2 = frequent_test_type_sketch::deserialize(s, alloc(0));
+  sketch.serialize(s, test_type_serde());
+  auto sketch2 = frequent_test_type_sketch::deserialize(s, test_type_serde(), alloc(0));
   REQUIRE_FALSE(sketch2.is_empty());
   REQUIRE(sketch2.get_total_weight() == 17);
   REQUIRE(sketch2.get_estimate(1) == 10);
   REQUIRE(sketch.get_num_active_items() == sketch2.get_num_active_items());
   REQUIRE(sketch.get_maximum_error() == sketch2.get_maximum_error());
 
-  auto bytes = sketch.serialize();
-  auto sketch3 = frequent_test_type_sketch::deserialize(bytes.data(), bytes.size(), alloc(0));
+  auto bytes = sketch.serialize(0, test_type_serde());
+  auto sketch3 = frequent_test_type_sketch::deserialize(bytes.data(), bytes.size(), test_type_serde(), alloc(0));
   REQUIRE_FALSE(sketch3.is_empty());
   REQUIRE(sketch3.get_total_weight() == 17);
   REQUIRE(sketch3.get_estimate(1) == 10);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datasketches.apache.org
For additional commands, e-mail: commits-help@datasketches.apache.org