Skip to content

Commit c0eef55

Browse files
committed
feat: add extension point
1 parent 71ed443 commit c0eef55

File tree

1 file changed

+22
-31
lines changed

1 file changed

+22
-31
lines changed

src/core/intrusive_string_set.h

Lines changed: 22 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)