| 181 | |
| 182 | template <typename Reader> |
| 183 | void Read(Reader & reader) |
| 184 | { |
| 185 | auto const indexOffset = ReadPrimitiveFromPos<uint64_t>(reader, 0); |
| 186 | |
| 187 | NonOwningReaderSource source(reader); |
| 188 | source.Skip(indexOffset); |
| 189 | |
| 190 | auto const numBlocks = ReadVarUint<uint64_t>(source); |
| 191 | m_blocks.assign(static_cast<size_t>(numBlocks), {}); |
| 192 | |
| 193 | uint64_t prevOffset = 8; // 8 bytes for the offset of the data section |
| 194 | for (uint64_t i = 0; i < numBlocks; ++i) |
| 195 | { |
| 196 | auto const delta = ReadVarUint<uint64_t>(source); |
| 197 | CHECK_GREATER_OR_EQUAL(prevOffset + delta, prevOffset, ()); |
| 198 | prevOffset += delta; |
| 199 | |
| 200 | auto & block = m_blocks[static_cast<size_t>(i)]; |
| 201 | block.m_offset = prevOffset; |
| 202 | block.m_from = i == 0 ? 0 : m_blocks[static_cast<size_t>(i - 1)].To(); |
| 203 | block.m_subs = ReadVarUint<uint64_t>(source); |
| 204 | CHECK_GREATER_OR_EQUAL(block.m_from + block.m_subs, block.m_from, ()); |
| 205 | } |
| 206 | } |
| 207 | |
| 208 | private: |
| 209 | std::vector<BlockInfo> m_blocks; |
no test coverage detected