static
| 58 | |
| 59 | // static |
| 60 | unique_ptr<MetadataDeserializer> MetadataDeserializer::Load(Reader & reader) |
| 61 | { |
| 62 | auto deserializer = make_unique<MetadataDeserializer>(); |
| 63 | deserializer->m_version = Version::V0; |
| 64 | |
| 65 | Header header; |
| 66 | header.Read(reader); |
| 67 | |
| 68 | deserializer->m_stringsSubreader = reader.CreateSubReader(header.m_stringsOffset, header.m_stringsSize); |
| 69 | if (!deserializer->m_stringsSubreader) |
| 70 | return {}; |
| 71 | deserializer->m_strings.InitializeIfNeeded(*deserializer->m_stringsSubreader); |
| 72 | |
| 73 | deserializer->m_mapSubreader = reader.CreateSubReader(header.m_metadataMapOffset, header.m_metadataMapSize); |
| 74 | if (!deserializer->m_mapSubreader) |
| 75 | return {}; |
| 76 | |
| 77 | // Decodes block encoded by writeBlockCallback from MetadataBuilder::Freeze. |
| 78 | auto const readBlockCallback = [&](NonOwningReaderSource & source, uint32_t blockSize, vector<MetaIds> & values) |
| 79 | { |
| 80 | values.resize(blockSize); |
| 81 | for (size_t i = 0; i < blockSize && source.Size() > 0; ++i) |
| 82 | { |
| 83 | auto const size = ReadVarUint<uint32_t>(source); |
| 84 | values[i].resize(size); |
| 85 | CHECK_GREATER(size, 0, ()); |
| 86 | |
| 87 | for (auto & value : values[i]) |
| 88 | value.first = ReadPrimitiveFromSource<uint8_t>(source); |
| 89 | |
| 90 | values[i][0].second = ReadVarUint<uint32_t>(source); |
| 91 | for (size_t j = 1; j < values[i].size(); ++j) |
| 92 | values[i][j].second = values[i][j - 1].second + ReadVarInt<int32_t>(source); |
| 93 | } |
| 94 | }; |
| 95 | |
| 96 | deserializer->m_map = Map::Load(*deserializer->m_mapSubreader, readBlockCallback); |
| 97 | if (!deserializer->m_map) |
| 98 | return {}; |
| 99 | |
| 100 | return deserializer; |
| 101 | } |
| 102 | |
| 103 | // static |
| 104 | std::unique_ptr<MetadataDeserializer> MetadataDeserializer::Load(FilesContainerR const & cont) |
nothing calls this directly
no test coverage detected