in tuple/include/tuple_sketch_impl.hpp [447:495]
compact_tuple_sketch<S, A> compact_tuple_sketch<S, A>::deserialize(std::istream& is, uint64_t seed, const SerDe& sd, const A& allocator) {
const auto preamble_longs = read<uint8_t>(is);
const auto serial_version = read<uint8_t>(is);
const auto family = read<uint8_t>(is);
const auto type = read<uint8_t>(is);
read<uint8_t>(is); // unused
const auto flags_byte = read<uint8_t>(is);
const auto seed_hash = read<uint16_t>(is);
if (serial_version != SERIAL_VERSION && serial_version != SERIAL_VERSION_LEGACY) {
throw std::invalid_argument("serial version mismatch: expected " + std::to_string(SERIAL_VERSION) + " or "
+ std::to_string(SERIAL_VERSION_LEGACY) + ", actual " + std::to_string(serial_version));
}
checker<true>::check_sketch_family(family, SKETCH_FAMILY);
if (type != SKETCH_TYPE && type != SKETCH_TYPE_LEGACY) {
throw std::invalid_argument("sketch type mismatch: expected " + std::to_string(SKETCH_TYPE) + " or "
+ std::to_string(SKETCH_TYPE_LEGACY) + ", actual " + std::to_string(type));
}
const bool is_empty = flags_byte & (1 << flags::IS_EMPTY);
if (!is_empty) checker<true>::check_seed_hash(seed_hash, compute_seed_hash(seed));
uint64_t theta = theta_constants::MAX_THETA;
uint32_t num_entries = 0;
if (!is_empty) {
if (preamble_longs == 1) {
num_entries = 1;
} else {
num_entries = read<uint32_t>(is);
read<uint32_t>(is); // unused
if (preamble_longs > 2) {
theta = read<uint64_t>(is);
}
}
}
A alloc(allocator);
std::vector<Entry, AllocEntry> entries(alloc);
if (!is_empty) {
entries.reserve(num_entries);
std::unique_ptr<S, deleter_of_summaries> summary(alloc.allocate(1), deleter_of_summaries(1, false, allocator));
for (size_t i = 0; i < num_entries; ++i) {
const auto key = read<uint64_t>(is);
sd.deserialize(is, summary.get(), 1);
entries.push_back(Entry(key, std::move(*summary)));
(*summary).~S();
}
}
if (!is.good()) throw std::runtime_error("error reading from std::istream");
const bool is_ordered = flags_byte & (1 << flags::IS_ORDERED);
return compact_tuple_sketch(is_empty, is_ordered, seed_hash, theta, std::move(entries));
}