in theta/include/theta_sketch_impl.hpp [605:643]
compact_theta_sketch_alloc<A> compact_theta_sketch_alloc<A>::deserialize_v2(
uint8_t preamble_longs, std::istream& is, uint64_t seed, const A& allocator)
{
read<uint8_t>(is); // unused
read<uint16_t>(is); // unused
const uint16_t seed_hash = read<uint16_t>(is);
checker<true>::check_seed_hash(seed_hash, compute_seed_hash(seed));
if (preamble_longs == 1) {
if (!is.good()) throw std::runtime_error("error reading from std::istream");
std::vector<uint64_t, A> entries(0, 0, allocator);
return compact_theta_sketch_alloc(true, true, seed_hash, theta_constants::MAX_THETA, std::move(entries));
} else if (preamble_longs == 2) {
const uint32_t num_entries = read<uint32_t>(is);
read<uint32_t>(is); // unused
std::vector<uint64_t, A> entries(num_entries, 0, allocator);
if (num_entries == 0) {
return compact_theta_sketch_alloc(true, true, seed_hash, theta_constants::MAX_THETA, std::move(entries));
}
read(is, entries.data(), entries.size() * sizeof(uint64_t));
if (!is.good()) throw std::runtime_error("error reading from std::istream");
return compact_theta_sketch_alloc(false, true, seed_hash, theta_constants::MAX_THETA, std::move(entries));
} else if (preamble_longs == 3) {
const uint32_t num_entries = read<uint32_t>(is);
read<uint32_t>(is); // unused
const auto theta = read<uint64_t>(is);
bool is_empty = (num_entries == 0) && (theta == theta_constants::MAX_THETA);
std::vector<uint64_t, A> entries(num_entries, 0, allocator);
if (is_empty) {
if (!is.good()) throw std::runtime_error("error reading from std::istream");
return compact_theta_sketch_alloc(true, true, seed_hash, theta, std::move(entries));
} else {
read(is, entries.data(), sizeof(uint64_t) * entries.size());
if (!is.good()) throw std::runtime_error("error reading from std::istream");
return compact_theta_sketch_alloc(false, true, seed_hash, theta, std::move(entries));
}
} else {
throw std::invalid_argument(std::to_string(preamble_longs) + " longs of premable, but expected 1, 2, or 3");
}
}