提交 73eaacd0 创建 作者: Austin Clements's avatar Austin Clements

radix: Let the compiler inline and deduplicate radix{_range}.end()

This puts the trivial part of the radix_iterator constructor used by end() in the class definition, so the compiler can see the full definition of end(). This should let it inline it and, hopefully, constant-eliminate it so it doesn't get called repeatedly.
上级 53ec8ed9
......@@ -234,7 +234,12 @@ struct radix_iterator {
// The level of the current element.
u32 level_;
radix_iterator(const radix* r, u64 k, u64 limit);
radix_iterator(const radix* r, u64 k, u64 limit)
: r_(r), k_(k), key_limit_(limit)
{
if (k_ != key_limit_)
prime_path();
}
radix_iterator &operator++() {
assert(k_ < key_limit_);
......@@ -252,6 +257,8 @@ struct radix_iterator {
return r_ != other.r_ || k_ != other.k_; }
private:
// Prepare the initial path_ and level_ based on k_.
void prime_path();
// Advance to the next non-null leaf. This assumes that
// k_ < key_limit_.
void advance();
......
......@@ -246,11 +246,10 @@ radix_range::replace(u64 start, u64 size, radix_elem *val)
}, 0, 1L << key_bits, start, start + size);
}
radix_iterator::radix_iterator(const radix* r, u64 k, u64 limit)
: r_(r), k_(k), key_limit_(limit) {
void
radix_iterator::prime_path()
{
dprintf("%p: Made iterator with k = %lx\n", r_, k_);
if (k_ == key_limit_)
return;
// Load the initial path
level_ = radix_levels;
......@@ -261,6 +260,7 @@ radix_iterator::radix_iterator(const radix* r, u64 k, u64 limit)
path_[level_] = &entry.node()->child[index(k_, level_)];
node = path_[level_];
}
dprintf("%p: Adjusted: k = %lx\n", r_, k_);
}
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论