@@ -40,20 +40,10 @@ class IntrusiveStringSet {
40
40
SetEntryIt ();
41
41
}
42
42
43
- // uint32_t ExpiryTime() const {
44
- // return prev.Next()->ExpiryTime();
45
- // }
46
-
47
43
void SetExpiryTime (uint32_t ttl_sec, size_t * obj_malloc_used) {
48
44
entry_.SetExpiryTime (ttl_sec, obj_malloc_used);
49
45
}
50
46
51
- // bool HasExpiry() const {
52
- // return curr_entry_.HasExpiry();
53
- // }
54
-
55
- // void Advance();
56
-
57
47
iterator& operator ++() {
58
48
if (entry_) {
59
49
if (entry_.ExpireIfNeeded (time_now_, &buckets_it_->obj_malloc_used_ ))
@@ -133,11 +123,6 @@ class IntrusiveStringSet {
133
123
134
124
auto bucket = FindEmptyAround (bucket_id);
135
125
136
- if (bucket == entries_.end ()) {
137
- // NO empty bucket around bucket_id + allowed displacement
138
- bucket = entries_.begin () + bucket_id;
139
- }
140
-
141
126
return AddUnique (str, bucket, hash, EntryTTL (ttl_sec));
142
127
}
143
128
@@ -320,7 +305,8 @@ class IntrusiveStringSet {
320
305
auto list = std::move (entries_[i]);
321
306
for (auto entry = list.Pop (time_now_); entry; entry = list.Pop (time_now_)) {
322
307
auto bucket_id = entry.Rehash (i, prev_capacity_log, capacity_log_, kShiftLog );
323
- entries_[bucket_id].Insert (entry.Release ());
308
+ auto bucket = FindEmptyAround (bucket_id);
309
+ bucket->Insert (entry.Release ());
324
310
}
325
311
}
326
312
}
@@ -330,29 +316,34 @@ class IntrusiveStringSet {
330
316
}
331
317
332
318
Buckets::iterator FindEmptyAround (uint32_t bid) {
333
- if (entries_[bid].Empty ()) {
334
- return entries_.begin () + bid;
335
- }
336
- uint32_t displacement = std::min (kDisplacementSize , BucketCount () - 1 );
337
- for (uint32_t i = 0 ; i < displacement; i++) {
338
- auto it = entries_.begin () + ((bid + i) & (Capacity () - 1 ));
339
- // Expire top element or whole bucket ?!
319
+ auto begin_it = entries_.begin ();
320
+ const uint32_t displacement_size = std::min (kDisplacementSize , BucketCount ());
321
+ const uint32_t capacity_mask = Capacity () - 1 ;
322
+ for (uint32_t i = 0 ; i < displacement_size; i++) {
323
+ const uint32_t bucket_id = (bid + i) & capacity_mask;
324
+ auto it = begin_it + bucket_id;
340
325
it->ExpireIfNeeded (time_now_, &size_);
341
326
if (it->Empty ()) {
342
327
return it;
343
328
}
344
329
}
345
330
346
- return entries_.end ();
331
+ DCHECK (Capacity () >= kDisplacementSize );
332
+ uint32_t extension_point_shift = displacement_size - 1 ;
333
+ bid |= extension_point_shift;
334
+ DCHECK (bid < Capacity ());
335
+ return begin_it + bid;
347
336
}
348
337
349
338
std::pair<IntrusiveStringList::iterator, uint32_t > FindInternal (uint32_t bid,
350
339
std::string_view str,
351
340
uint64_t hash) {
352
- uint32_t displacement = std::min (kDisplacementSize , BucketCount () - 1 );
353
- for (uint32_t i = 0 ; i < displacement; i++) {
354
- uint32_t bucket_id = (bid + i) & (Capacity () - 1 );
355
- auto it = entries_.begin () + bucket_id;
341
+ const uint32_t displacement_size = std::min (kDisplacementSize , BucketCount ());
342
+ auto begin_it = entries_.begin ();
343
+ const uint32_t capacity_mask = Capacity () - 1 ;
344
+ for (uint32_t i = 0 ; i < displacement_size; i++) {
345
+ const uint32_t bucket_id = (bid + i) & capacity_mask;
346
+ auto it = begin_it + bucket_id;
356
347
if (it->Empty ()) {
357
348
continue ;
358
349
}
@@ -366,9 +357,9 @@ class IntrusiveStringSet {
366
357
}
367
358
368
359
private:
369
- static constexpr std::uint32_t kMinCapacityLog = 3 ; // TODO make template
370
- static constexpr std::uint32_t kShiftLog = 4 ; // TODO make template
371
- static constexpr std::uint32_t kDisplacementSize = (1 << kShiftLog ) - 1 ;
360
+ static constexpr std::uint32_t kMinCapacityLog = 3 ; // TODO make template
361
+ static constexpr std::uint32_t kShiftLog = 4 ; // TODO make template
362
+ static constexpr std::uint32_t kDisplacementSize = (1 << kShiftLog ); // TODO check
372
363
std::uint32_t capacity_log_ = 0 ;
373
364
std::uint32_t size_ = 0 ; // number of elements in the set.
374
365
std::uint32_t time_now_ = 0 ;
0 commit comments