in cpc/include/cpc_sketch_impl.hpp [408:458]
void cpc_sketch_alloc<A>::serialize(std::ostream& os) const {
compressed_state<A> compressed(A(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);
write(os, preamble_ints);
const uint8_t serial_version = SERIAL_VERSION;
write(os, serial_version);
const uint8_t family = FAMILY;
write(os, family);
write(os, lg_k);
write(os, first_interesting_column);
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)
);
write(os, flags_byte);
const uint16_t seed_hash(compute_seed_hash(seed));
write(os, seed_hash);
if (!is_empty()) {
write(os, num_coupons);
if (has_table && has_window) {
// if there is no window it is the same as number of coupons
write(os, compressed.table_num_entries);
// HIP values can be in two different places in the sequence of fields
// this is the first HIP decision point
if (has_hip) write_hip(os);
}
if (has_table) {
write(os, compressed.table_data_words);
}
if (has_window) {
write(os, compressed.window_data_words);
}
// this is the second HIP decision point
if (has_hip && !(has_table && has_window)) write_hip(os);
if (has_window) {
write(os, compressed.window_data.data(), compressed.window_data_words * sizeof(uint32_t));
}
if (has_table) {
write(os, compressed.table_data.data(), compressed.table_data_words * sizeof(uint32_t));
}
}
}