in cpc/include/cpc_sketch_impl.hpp [461:516]
vector_u8<A> cpc_sketch_alloc<A>::serialize(unsigned header_size_bytes) const {
compressed_state<A> compressed(sliding_window.get_allocator());
compressed.table_data_words = 0;
compressed.table_num_entries = 0;
compressed.window_data_words = 0;
get_compressor<A>().compress(*this, compressed);
const bool has_hip = !was_merged;
const bool has_table = compressed.table_data.size() > 0;
const bool has_window = compressed.window_data.size() > 0;
const uint8_t preamble_ints = get_preamble_ints(num_coupons, has_hip, has_table, has_window);
const size_t size = header_size_bytes + (preamble_ints + compressed.table_data_words + compressed.window_data_words) * sizeof(uint32_t);
vector_u8<A> bytes(size, 0, sliding_window.get_allocator());
uint8_t* ptr = bytes.data() + header_size_bytes;
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);
ptr += copy_to_mem(lg_k, ptr);
ptr += copy_to_mem(first_interesting_column, ptr);
const uint8_t flags_byte(
(1 << flags::IS_COMPRESSED)
| (has_hip ? 1 << flags::HAS_HIP : 0)
| (has_table ? 1 << flags::HAS_TABLE : 0)
| (has_window ? 1 << flags::HAS_WINDOW : 0)
);
ptr += copy_to_mem(flags_byte, ptr);
const uint16_t seed_hash = compute_seed_hash(seed);
ptr += copy_to_mem(seed_hash, ptr);
if (!is_empty()) {
ptr += copy_to_mem(num_coupons, ptr);
if (has_table && has_window) {
// if there is no window it is the same as number of coupons
ptr += copy_to_mem(compressed.table_num_entries, ptr);
// HIP values can be in two different places in the sequence of fields
// this is the first HIP decision point
if (has_hip) ptr += copy_hip_to_mem(ptr);
}
if (has_table) {
ptr += copy_to_mem(compressed.table_data_words, ptr);
}
if (has_window) {
ptr += copy_to_mem(compressed.window_data_words, ptr);
}
// this is the second HIP decision point
if (has_hip && !(has_table && has_window)) ptr += copy_hip_to_mem(ptr);
if (has_window) {
ptr += copy_to_mem(compressed.window_data.data(), ptr, compressed.window_data_words * sizeof(uint32_t));
}
if (has_table) {
ptr += copy_to_mem(compressed.table_data.data(), ptr, compressed.table_data_words * sizeof(uint32_t));
}
}
if (ptr != bytes.data() + size) throw std::logic_error("serialized size mismatch");
return bytes;
}