@@ -40,20 +40,10 @@ class IntrusiveStringSet {
4040 SetEntryIt ();
4141 }
4242
43- // uint32_t ExpiryTime() const {
44- // return prev.Next()->ExpiryTime();
45- // }
46-
4743 void SetExpiryTime (uint32_t ttl_sec, size_t * obj_malloc_used) {
4844 entry_.SetExpiryTime (ttl_sec, obj_malloc_used);
4945 }
5046
51- // bool HasExpiry() const {
52- // return curr_entry_.HasExpiry();
53- // }
54-
55- // void Advance();
56-
5747 iterator& operator ++() {
5848 if (entry_) {
5949 if (entry_.ExpireIfNeeded (time_now_, &buckets_it_->obj_malloc_used_ ))
@@ -133,11 +123,6 @@ class IntrusiveStringSet {
133123
134124 auto bucket = FindEmptyAround (bucket_id);
135125
136- if (bucket == entries_.end ()) {
137- // NO empty bucket around bucket_id + allowed displacement
138- bucket = entries_.begin () + bucket_id;
139- }
140-
141126 return AddUnique (str, bucket, hash, EntryTTL (ttl_sec));
142127 }
143128
@@ -320,7 +305,8 @@ class IntrusiveStringSet {
320305 auto list = std::move (entries_[i]);
321306 for (auto entry = list.Pop (time_now_); entry; entry = list.Pop (time_now_)) {
322307 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 ());
324310 }
325311 }
326312 }
@@ -330,29 +316,34 @@ class IntrusiveStringSet {
330316 }
331317
332318 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;
340325 it->ExpireIfNeeded (time_now_, &size_);
341326 if (it->Empty ()) {
342327 return it;
343328 }
344329 }
345330
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;
347336 }
348337
349338 std::pair<IntrusiveStringList::iterator, uint32_t > FindInternal (uint32_t bid,
350339 std::string_view str,
351340 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;
356347 if (it->Empty ()) {
357348 continue ;
358349 }
@@ -366,9 +357,9 @@ class IntrusiveStringSet {
366357 }
367358
368359 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
372363 std::uint32_t capacity_log_ = 0 ;
373364 std::uint32_t size_ = 0 ; // number of elements in the set.
374365 std::uint32_t time_now_ = 0 ;
0 commit comments