in kll/include/kll_sketch_impl.hpp [400:438]
auto kll_sketch<T, C, A>::serialize(unsigned header_size_bytes, const SerDe& sd) const -> vector_bytes {
const bool is_single_item = n_ == 1;
const size_t size = header_size_bytes + get_serialized_size_bytes(sd);
vector_bytes bytes(size, 0, allocator_);
uint8_t* ptr = bytes.data() + header_size_bytes;
const uint8_t* end_ptr = ptr + size;
const uint8_t preamble_ints(is_empty() || is_single_item ? PREAMBLE_INTS_SHORT : PREAMBLE_INTS_FULL);
ptr += copy_to_mem(preamble_ints, ptr);
const uint8_t serial_version(is_single_item ? SERIAL_VERSION_2 : SERIAL_VERSION_1);
ptr += copy_to_mem(serial_version, ptr);
const uint8_t family(FAMILY);
ptr += copy_to_mem(family, ptr);
const uint8_t flags_byte(
(is_empty() ? 1 << flags::IS_EMPTY : 0)
| (is_level_zero_sorted_ ? 1 << flags::IS_LEVEL_ZERO_SORTED : 0)
| (is_single_item ? 1 << flags::IS_SINGLE_ITEM : 0)
);
ptr += copy_to_mem(flags_byte, ptr);
ptr += copy_to_mem(k_, ptr);
ptr += copy_to_mem(m_, ptr);
ptr += sizeof(uint8_t); // unused
if (!is_empty()) {
if (!is_single_item) {
ptr += copy_to_mem(n_, ptr);
ptr += copy_to_mem(min_k_, ptr);
ptr += copy_to_mem(num_levels_, ptr);
ptr += sizeof(uint8_t); // unused
ptr += copy_to_mem(levels_.data(), ptr, sizeof(levels_[0]) * num_levels_);
ptr += sd.serialize(ptr, end_ptr - ptr, &*min_item_, 1);
ptr += sd.serialize(ptr, end_ptr - ptr, &*max_item_, 1);
}
const size_t bytes_remaining = end_ptr - ptr;
ptr += sd.serialize(ptr, bytes_remaining, &items_[levels_[0]], get_num_retained());
}
const size_t delta = ptr - bytes.data();
if (delta != size) throw std::logic_error("serialized size mismatch: " + std::to_string(delta)
+ " != " + std::to_string(size));
return bytes;
}