@@ -1175,7 +1175,7 @@ MergedSection<E>::insert(std::string_view data, u64 hash, i64 alignment) {
1175
1175
1176
1176
Subsection<E> *subsec;
1177
1177
bool inserted;
1178
- std::tie (subsec, inserted) = map.insert (data, hash, Subsection (this , data ));
1178
+ std::tie (subsec, inserted) = map.insert (data, hash, Subsection (this ));
1179
1179
assert (subsec);
1180
1180
1181
1181
for (u16 cur = subsec->alignment ; cur < alignment;)
@@ -1193,32 +1193,38 @@ void MergedSection<E>::assign_offsets(Context<E> &ctx) {
1193
1193
i64 shard_size = map.nbuckets / map.NUM_SHARDS ;
1194
1194
1195
1195
tbb::parallel_for ((i64 )0 , map.NUM_SHARDS , [&](i64 i) {
1196
- std::vector<Subsection<E> *> subsections;
1196
+ struct KeyVal {
1197
+ std::string_view key;
1198
+ Subsection<E> *val;
1199
+ };
1200
+
1201
+ std::vector<KeyVal> subsections;
1197
1202
subsections.reserve (shard_size);
1198
1203
1199
1204
for (i64 j = shard_size * i; j < shard_size * (i + 1 ); j++)
1200
1205
if (Subsection<E> &subsec = map.values [j]; subsec.is_alive )
1201
- subsections.push_back (&subsec);
1206
+ subsections.push_back ({{map. keys [j], map. sizes [j]}, &subsec} );
1202
1207
1203
1208
// Sort subsections to make output deterministic.
1204
1209
tbb::parallel_sort (subsections.begin (), subsections.end (),
1205
- [](Subsection<E> * a, Subsection<E> * b) {
1206
- if (a->alignment != b->alignment )
1207
- return a->alignment < b->alignment ;
1208
- if (a-> data . size () != b-> data .size ())
1209
- return a-> data . size () < b-> data .size ();
1210
- return a-> data < b-> data ;
1210
+ [](const KeyVal & a, const KeyVal & b) {
1211
+ if (a. val ->alignment != b. val ->alignment )
1212
+ return a. val ->alignment < b. val ->alignment ;
1213
+ if (a. key . size () != b. key .size ())
1214
+ return a. key . size () < b. key .size ();
1215
+ return a. key < b. key ;
1211
1216
});
1212
1217
1213
1218
// Assign offsets.
1214
1219
i64 offset = 0 ;
1215
1220
i64 max_alignment = 0 ;
1216
1221
1217
- for (Subsection<E> *subsec : subsections) {
1218
- offset = align_to (offset, subsec->alignment );
1219
- subsec->offset = offset;
1220
- offset += subsec->data .size ();
1221
- max_alignment = std::max<i64 >(max_alignment, subsec->alignment );
1222
+ for (KeyVal &kv : subsections) {
1223
+ Subsection<E> &subsec = *kv.val ;
1224
+ offset = align_to (offset, subsec.alignment );
1225
+ subsec.offset = offset;
1226
+ offset += kv.key .size ();
1227
+ max_alignment = std::max<i64 >(max_alignment, subsec.alignment );
1222
1228
}
1223
1229
1224
1230
sizes[i] = offset;
@@ -1260,7 +1266,7 @@ void MergedSection<E>::write_to(Context<E> &ctx, u8 *buf) {
1260
1266
1261
1267
for (i64 j = shard_size * i; j < shard_size * (i + 1 ); j++)
1262
1268
if (Subsection<E> &subsec = map.values [j]; subsec.is_alive )
1263
- memcpy (buf + subsec.offset , subsec. data . data (), subsec. data . size () );
1269
+ memcpy (buf + subsec.offset , map. keys [j], map. sizes [j] );
1264
1270
});
1265
1271
}
1266
1272
0 commit comments