@@ -262,39 +262,58 @@ return _sketch_array.end();
262262
263263template <typename W, typename A>
264264void count_min_sketch<W,A>::serialize(std::ostream& os) const {
265+ serialize_to ([&os](const void * data, size_t size) {
266+ os.write (static_cast <const char *>(data), size);
267+ });
268+ }
269+
270+ template <typename Sink, typename T>
271+ static inline void write_count_min_value (Sink& sink, size_t & bytes_written, const T& value) {
272+ sink (&value, sizeof (value));
273+ bytes_written += sizeof (value);
274+ }
275+
276+ template <typename W, typename A>
277+ template <typename Sink>
278+ size_t count_min_sketch<W,A>::serialize_to(Sink&& sink) const {
279+ size_t bytes_written = 0 ;
280+
265281 // Long 0
266282 // const uint8_t preamble_longs = is_empty() ? PREAMBLE_LONGS_SHORT : PREAMBLE_LONGS_FULL;
267283 const uint8_t preamble_longs = PREAMBLE_LONGS_SHORT ;
268284 const uint8_t ser_ver = SERIAL_VERSION_1 ;
269285 const uint8_t family_id = FAMILY_ID ;
270286 const uint8_t flags_byte = (is_empty () ? 1 << flags::IS_EMPTY : 0 );
271287 const uint32_t unused32 = NULL_32 ;
272- write (os , preamble_longs);
273- write (os , ser_ver);
274- write (os , family_id);
275- write (os , flags_byte);
276- write (os , unused32);
288+ write_count_min_value (sink, bytes_written , preamble_longs);
289+ write_count_min_value (sink, bytes_written , ser_ver);
290+ write_count_min_value (sink, bytes_written , family_id);
291+ write_count_min_value (sink, bytes_written , flags_byte);
292+ write_count_min_value (sink, bytes_written , unused32);
277293
278294 // Long 1
279295 const uint32_t nbuckets = _num_buckets;
280296 const uint8_t nhashes = _num_hashes;
281297 const uint16_t seed_hash (compute_seed_hash (_seed));
282298 const uint8_t unused8 = NULL_8 ;
283- write (os , nbuckets);
284- write (os , nhashes);
285- write (os , seed_hash);
286- write (os , unused8);
287- if (is_empty ()) { return ; } // sketch is empty, no need to write further bytes.
299+ write_count_min_value (sink, bytes_written , nbuckets);
300+ write_count_min_value (sink, bytes_written , nhashes);
301+ write_count_min_value (sink, bytes_written , seed_hash);
302+ write_count_min_value (sink, bytes_written , unused8);
303+ if (is_empty ()) { return bytes_written ; } // sketch is empty, no need to write further bytes.
288304
289305 // Long 2
290- write (os, _total_weight);
306+ const W t_weight = _total_weight;
307+ write_count_min_value (sink, bytes_written, t_weight);
291308
292309 // Long 3 onwards: remaining bytes are consumed by writing the weight and the array values.
293- auto it = _sketch_array.begin ();
294- while (it != _sketch_array. end () ) {
295- write (os, *it );
296- ++it ;
310+ const size_t sketch_array_bytes = sizeof (W) * _sketch_array.size ();
311+ if (sketch_array_bytes > 0 ) {
312+ sink (_sketch_array. data (), sketch_array_bytes );
313+ bytes_written += sketch_array_bytes ;
297314 }
315+
316+ return bytes_written;
298317}
299318
300319template <typename W, typename A>
@@ -345,40 +364,9 @@ template<typename W, typename A>
345364auto count_min_sketch<W,A>::serialize(unsigned header_size_bytes) const -> vector_bytes {
346365 vector_bytes bytes (header_size_bytes + get_serialized_size_bytes (), 0 , _allocator);
347366 uint8_t *ptr = bytes.data () + header_size_bytes;
348-
349- // Long 0
350- const uint8_t preamble_longs = PREAMBLE_LONGS_SHORT ;
351- ptr += copy_to_mem (preamble_longs, ptr);
352- const uint8_t ser_ver = SERIAL_VERSION_1 ;
353- ptr += copy_to_mem (ser_ver, ptr);
354- const uint8_t family_id = FAMILY_ID ;
355- ptr += copy_to_mem (family_id, ptr);
356- const uint8_t flags_byte = (is_empty () ? 1 << flags::IS_EMPTY : 0 );
357- ptr += copy_to_mem (flags_byte, ptr);
358- const uint32_t unused32 = NULL_32 ;
359- ptr += copy_to_mem (unused32, ptr);
360-
361- // Long 1
362- const uint32_t nbuckets = _num_buckets;
363- const uint8_t nhashes = _num_hashes;
364- const uint16_t seed_hash (compute_seed_hash (_seed));
365- const uint8_t null_characters_8 = NULL_8 ;
366- ptr += copy_to_mem (nbuckets, ptr);
367- ptr += copy_to_mem (nhashes, ptr);
368- ptr += copy_to_mem (seed_hash, ptr);
369- ptr += copy_to_mem (null_characters_8, ptr);
370- if (is_empty ()) { return bytes; } // sketch is empty, no need to write further bytes.
371-
372- // Long 2
373- const W t_weight = _total_weight;
374- ptr += copy_to_mem (t_weight, ptr);
375-
376- // Long 3 onwards: remaining bytes are consumed by writing the weight and the array values.
377- auto it = _sketch_array.begin ();
378- while (it != _sketch_array.end ()) {
379- ptr += copy_to_mem (*it, ptr);
380- ++it;
381- }
367+ serialize_to ([&ptr](const void * data, size_t size) {
368+ ptr += copy_to_mem (data, ptr, size);
369+ });
382370
383371 return bytes;
384372}
0 commit comments