in req/include/req_sketch_impl.hpp [446:508]
req_sketch<T, C, A> req_sketch<T, C, A>::deserialize(std::istream& is, const SerDe& sd, const C& comparator, const A& allocator) {
const auto preamble_ints = read<uint8_t>(is);
const auto serial_version = read<uint8_t>(is);
const auto family_id = read<uint8_t>(is);
const auto flags_byte = read<uint8_t>(is);
const auto k = read<uint16_t>(is);
const auto num_levels = read<uint8_t>(is);
const auto num_raw_items = read<uint8_t>(is);
check_preamble_ints(preamble_ints, num_levels);
check_serial_version(serial_version);
check_family_id(family_id);
if (!is.good()) throw std::runtime_error("error reading from std::istream");
const bool is_empty = flags_byte & (1 << flags::IS_EMPTY);
const bool hra = flags_byte & (1 << flags::IS_HIGH_RANK);
if (is_empty) return req_sketch(k, hra, comparator, allocator);
optional<T> tmp; // space to deserialize min and max
optional<T> min_item;
optional<T> max_item;
const bool raw_items = flags_byte & (1 << flags::RAW_ITEMS);
const bool is_level_0_sorted = flags_byte & (1 << flags::IS_LEVEL_ZERO_SORTED);
std::vector<Compactor, AllocCompactor> compactors(allocator);
uint64_t n = 1;
if (num_levels > 1) {
n = read<uint64_t>(is);
sd.deserialize(is, &*tmp, 1);
// serde call did not throw, repackage and cleanup
min_item.emplace(*tmp);
(*tmp).~T();
sd.deserialize(is, &*tmp, 1);
// serde call did not throw, repackage and cleanup
max_item.emplace(*tmp);
(*tmp).~T();
}
if (raw_items) {
compactors.push_back(Compactor::deserialize(is, sd, comparator, allocator, is_level_0_sorted, k, num_raw_items, hra));
} else {
for (size_t i = 0; i < num_levels; ++i) {
compactors.push_back(Compactor::deserialize(is, sd, comparator, allocator, i == 0 ? is_level_0_sorted : true, hra));
}
}
if (num_levels == 1) {
const auto begin = compactors[0].begin();
const auto end = compactors[0].end();
n = compactors[0].get_num_items();
auto min_it = begin;
auto max_it = begin;
for (auto it = begin; it != end; ++it) {
if (comparator(*it, *min_it)) min_it = it;
if (comparator(*max_it, *it)) max_it = it;
}
min_item.emplace(*min_it);
max_item.emplace(*max_it);
}
if (!is.good()) throw std::runtime_error("error reading from std::istream");
return req_sketch(k, hra, n, std::move(min_item), std::move(max_item), std::move(compactors), comparator);
}