@@ -47,34 +47,43 @@ auto RCache::add(RChunk const& chunk, std::span<char const> data) -> bool {
47
47
auto RCache::contains (ChunkID chunkId) const noexcept -> bool { return bundle_.lookup .contains (chunkId); }
48
48
49
49
auto RCache::uncache (std::vector<RChunk::Dst> chunks, RChunk::Dst::data_cb on_data) const -> std::vector<RChunk::Dst> {
50
- sort_by<&RChunk::Dst::chunkId, &RChunk::Dst::uncompressed_offset>(chunks.begin (), chunks.end ());
51
- auto lastId = ChunkID::None;
52
- auto dst = std::span<char const >{};
53
- remove_if (chunks, [&](RChunk::Dst const & chunk) mutable {
50
+ auto found = std::vector<RChunk::Dst>{};
51
+ found.reserve (chunks.size ());
52
+ remove_if (chunks, [&](RChunk::Dst& chunk) mutable {
54
53
if (chunk.chunkId == ChunkID::None) {
55
54
return false ;
56
55
}
57
- if (chunk.chunkId == lastId) {
58
- on_data (chunk, dst);
59
- return true ;
60
- }
61
56
auto i = bundle_.lookup .find (chunk.chunkId );
62
57
if (i == bundle_.lookup .end ()) {
63
58
return false ;
64
59
}
65
60
auto const & c = i->second ;
66
61
rlib_assert (c.uncompressed_size == chunk.uncompressed_size );
62
+ chunk.compressed_offset = c.compressed_offset ;
63
+ chunk.compressed_size = c.compressed_size ;
64
+ found.push_back (chunk);
65
+ return true ;
66
+ });
67
+
68
+ sort_by<&RChunk::Dst::compressed_offset, &RChunk::Dst::uncompressed_offset>(found.begin (), found.end ());
69
+
70
+ auto lastId = ChunkID::None;
71
+ auto dst = std::span<char const >{};
72
+ for (RChunk::Dst const & chunk : found) {
73
+ if (chunk.chunkId == lastId) {
74
+ on_data (chunk, dst);
75
+ continue ;
76
+ }
67
77
auto src = std::span (buffer_);
68
- if (c .compressed_offset > bundle_.toc_offset ) {
69
- src = src.subspan (c .compressed_offset - bundle_.toc_offset , c .compressed_size );
78
+ if (chunk .compressed_offset > bundle_.toc_offset ) {
79
+ src = src.subspan (chunk .compressed_offset - bundle_.toc_offset , chunk .compressed_size );
70
80
} else {
71
- src = file_.copy (c .compressed_offset , c .compressed_size );
81
+ src = file_.copy (chunk .compressed_offset , chunk .compressed_size );
72
82
}
73
- dst = zstd_decompress (src, c .uncompressed_size );
83
+ dst = zstd_decompress (src, chunk .uncompressed_size );
74
84
on_data (chunk, dst);
75
85
lastId = chunk.chunkId ;
76
- return true ;
77
- });
86
+ }
78
87
return std::move (chunks);
79
88
}
80
89
0 commit comments