提交 aa2ba334 创建 作者: David Benjamin's avatar David Benjamin

Drop the old radix_iterator

Removes a use of descend in skip_empty.
上级 d3adb158
...@@ -196,28 +196,12 @@ struct radix { ...@@ -196,28 +196,12 @@ struct radix {
radix_elem* search(u64 key); radix_elem* search(u64 key);
radix_range search_lock(u64 start, u64 size); radix_range search_lock(u64 start, u64 size);
// k is shifted value.
u64 skip_empty(u64 k) const;
NEW_DELETE_OPS(radix) NEW_DELETE_OPS(radix)
}; };
struct radix_iterator { struct radix_iterator {
const radix* r_; const radix* r_;
u64 k_; u64 k_;
radix_iterator(const radix* r, u64 k) : r_(r), k_(r->skip_empty(k)) {}
radix_iterator &operator++() { k_++; k_ = r_->skip_empty(k_); return *this; }
radix_elem* operator*();
bool operator==(const radix_iterator &other) {
return r_ == other.r_ && k_ == other.k_; }
bool operator!=(const radix_iterator &other) {
return r_ != other.r_ || k_ != other.k_; }
};
struct radix_iterator2 {
const radix* r_;
u64 k_;
// path_[i] is the node at level i. Note that the leaf is at zero // path_[i] is the node at level i. Note that the leaf is at zero
// and is radix_elem. The rest are radix_node. For now we assume all // and is radix_elem. The rest are radix_node. For now we assume all
// leaves are at level 0. Later we'll steal a bit for them. The root // leaves are at level 0. Later we'll steal a bit for them. The root
...@@ -225,9 +209,9 @@ struct radix_iterator2 { ...@@ -225,9 +209,9 @@ struct radix_iterator2 {
radix_entry path_[radix_levels+1]; radix_entry path_[radix_levels+1];
u32 leaf_; u32 leaf_;
radix_iterator2(const radix* r, u64 k); radix_iterator(const radix* r, u64 k);
radix_iterator2 &operator++() { radix_iterator &operator++() {
if (!advance(radix_levels-1)) k_ = ~0ULL; if (!advance(radix_levels-1)) k_ = ~0ULL;
return *this; return *this;
} }
...@@ -237,9 +221,9 @@ struct radix_iterator2 { ...@@ -237,9 +221,9 @@ struct radix_iterator2 {
radix_node* node(u32 level) { return path_[level].node(); } radix_node* node(u32 level) { return path_[level].node(); }
// Compare equality on just the key. // Compare equality on just the key.
bool operator==(const radix_iterator2 &other) { bool operator==(const radix_iterator &other) {
return r_ == other.r_ && k_ == other.k_; } return r_ == other.r_ && k_ == other.k_; }
bool operator!=(const radix_iterator2 &other) { bool operator!=(const radix_iterator &other) {
return r_ != other.r_ || k_ != other.k_; } return r_ != other.r_ || k_ != other.k_; }
private: private:
...@@ -247,8 +231,6 @@ private: ...@@ -247,8 +231,6 @@ private:
bool advance(u32 level); bool advance(u32 level);
}; };
#define radix_iterator radix_iterator2
static inline radix_iterator static inline radix_iterator
begin(const radix &r) { return radix_iterator(&r, 0); } begin(const radix &r) { return radix_iterator(&r, 0); }
...@@ -261,5 +243,3 @@ begin(const radix_range &rr) { return radix_iterator(rr.r_, rr.start_); } ...@@ -261,5 +243,3 @@ begin(const radix_range &rr) { return radix_iterator(rr.r_, rr.start_); }
static inline radix_iterator static inline radix_iterator
end(const radix_range &rr) { return radix_iterator(rr.r_, rr.start_ + rr.size_); } end(const radix_range &rr) { return radix_iterator(rr.r_, rr.start_ + rr.size_); }
#undef radix_iterator
...@@ -97,26 +97,6 @@ radix::search_lock(u64 start, u64 size) ...@@ -97,26 +97,6 @@ radix::search_lock(u64 start, u64 size)
return radix_range(this, start >> shift_, size >> shift_); return radix_range(this, start >> shift_, size >> shift_);
} }
u64
radix::skip_empty(u64 k) const
{
u64 next_k = k;
while (next_k < (1UL<<key_bits)) {
// Does next_k exist?
// FIXME: evil evil const_cast
u32 level = descend(next_k, const_cast<radix_ptr*>(&root_),
radix_levels-1, [](radix_ptr *v){}, false);
if (level == 0) {
return next_k;
}
u64 mask = 1UL<<(bits_per_level * level);
// Skip past everything we know is missing.
next_k = (next_k & ~(mask-1)) + mask;
}
// Nope, no successor.
return ~0ULL;
}
radix_range::radix_range(radix *r, u64 start, u64 size) radix_range::radix_range(radix *r, u64 start, u64 size)
: r_(r), start_(start), size_(size) : r_(r), start_(start), size_(size)
{ {
...@@ -175,17 +155,7 @@ radix_range::replace(u64 start, u64 size, radix_elem *val) ...@@ -175,17 +155,7 @@ radix_range::replace(u64 start, u64 size, radix_elem *val)
} }
} }
radix_elem* radix_iterator::radix_iterator(const radix* r, u64 k)
radix_iterator::operator*()
{
radix_elem *result = 0;
descend(k_, (radix_ptr*) &r_->root_, radix_levels-1, [&result](radix_ptr *v) {
result = v->load().elem();
}, false);
return result;
}
radix_iterator2::radix_iterator2(const radix* r, u64 k)
: r_(r), k_(k) { : r_(r), k_(k) {
dprintf("%p: Made iterator with k = %lu\n", r_, k_); dprintf("%p: Made iterator with k = %lu\n", r_, k_);
if (k_ != ~0ULL) { if (k_ != ~0ULL) {
...@@ -199,7 +169,7 @@ radix_iterator2::radix_iterator2(const radix* r, u64 k) ...@@ -199,7 +169,7 @@ radix_iterator2::radix_iterator2(const radix* r, u64 k)
} }
bool bool
radix_iterator2::advance(u32 level) radix_iterator::advance(u32 level)
{ {
// First, see if we can advance a lower level. // First, see if we can advance a lower level.
if (level > leaf_ && advance(level-1)) { if (level > leaf_ && advance(level-1)) {
...@@ -220,7 +190,7 @@ radix_iterator2::advance(u32 level) ...@@ -220,7 +190,7 @@ radix_iterator2::advance(u32 level)
} }
bool bool
radix_iterator2::find_first_leaf(u32 level) radix_iterator::find_first_leaf(u32 level)
{ {
// Find the first non-empty node after k_ on this level. // Find the first non-empty node after k_ on this level.
for (u32 idx = index(k_, level); idx < (1<<bits_per_level); idx++) { for (u32 idx = index(k_, level); idx < (1<<bits_per_level); idx++) {
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论