15 const int64_t start = offset;
16 const int64_t end = offset + int64_t(size);
18 int64_t actual_end = start;
20 for (
auto b: db.get_buffer_table())
22 const int64_t b_start = db.get_offset(b);
23 const int64_t b_size = db.get_size(b);
28 const int64_t b_end = int64_t(uint64_t(b_start) + uint64_t(b_size));
30 const int64_t intersection_start = std::max(start, b_start);
31 const int64_t intersection_end = std::min(end, b_end);
33 if (intersection_start < intersection_end && intersection_start <= actual_end)
35 if (b != decoded_buffer)
37 if (uint64_t(b_size) > uint64_t(max_buffer_size))
40 const size_t read_buffer_size = size_t(b_size);
42 if (read_buffer.size() < read_buffer_size)
43 read_buffer.resize(read_buffer_size);
47 blob_reader.read_blob(db.get_data(b), max_buffer_size),
57 buffer + intersection_start - start,
58 read_buffer.data() + intersection_start - b_start,
59 size_t(intersection_end - intersection_start)
62 if (intersection_end > actual_end)
63 actual_end = intersection_end;
67 return size_t(actual_end - start);