in req/include/req_sketch_impl.hpp [404:442]
auto req_sketch<T, C, 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, allocator_);
uint8_t* ptr = bytes.data() + header_size_bytes;
const uint8_t* end_ptr = ptr + size;
const uint8_t preamble_ints = is_estimation_mode() ? 4 : 2;
ptr += copy_to_mem(preamble_ints, ptr);
const uint8_t serial_version = SERIAL_VERSION;
ptr += copy_to_mem(serial_version, ptr);
const uint8_t family = FAMILY;
ptr += copy_to_mem(family, ptr);
const bool raw_items = n_ <= req_constants::MIN_K;
const uint8_t flags_byte(
(is_empty() ? 1 << flags::IS_EMPTY : 0)
| (hra_ ? 1 << flags::IS_HIGH_RANK : 0)
| (raw_items ? 1 << flags::RAW_ITEMS : 0)
| (compactors_[0].is_sorted() ? 1 << flags::IS_LEVEL_ZERO_SORTED : 0)
);
ptr += copy_to_mem(flags_byte, ptr);
ptr += copy_to_mem(k_, ptr);
const uint8_t num_levels = is_empty() ? 0 : get_num_levels();
ptr += copy_to_mem(num_levels, ptr);
const uint8_t num_raw_items = raw_items ? static_cast<uint8_t>(n_) : 0;
ptr += copy_to_mem(num_raw_items, ptr);
if (!is_empty()) {
if (is_estimation_mode()) {
ptr += copy_to_mem(n_, ptr);
ptr += sd.serialize(ptr, end_ptr - ptr, &*min_item_, 1);
ptr += sd.serialize(ptr, end_ptr - ptr, &*max_item_, 1);
}
if (raw_items) {
ptr += sd.serialize(ptr, end_ptr - ptr, compactors_[0].begin(), num_raw_items);
} else {
for (const auto& compactor: compactors_) ptr += compactor.serialize(ptr, end_ptr - ptr, sd);
}
}
return bytes;
}