unsigned long *range_min, unsigned long *range_max)
{
unsigned long *pivots = ma_pivots(mas_mn(mas), type);
- unsigned long min, pivot = 0;
- min = mas_safe_min(mas, pivots, mas->offset);
- if (ma_is_dense(type)) {
- // Linear node.
- // What if mas->index != mas->last?
- pivot = min = mas->index;
+ if (unlikely(ma_is_dense(type))) {
+ (*range_max) = (*range_min) = mas->index;
mas->offset = mas->index = mas->min;
- goto dense;
+ return;
}
- while (mas->offset < mt_slots[type]) {
- pivot = _mas_safe_pivot(mas, pivots, mas->offset, type);
+ (*range_min) = mas_safe_min(mas, pivots, mas->offset);
+ if (unlikely(mas->offset == mt_pivots[type]))
+ goto max;
- if (!pivot && mas->offset) {
- pivot = mas->max;
- break;
- }
+ while (mas->offset < mt_pivots[type]) {
- if (mas->index <= pivot)
- break;
+ (*range_max) = pivots[mas->offset];
+ if (!(*range_max) && mas->offset)
+ goto max;
- min = pivot + 1;
+ if (mas->index <= (*range_max))
+ return;
+
+ (*range_min) = (*range_max) + 1;
mas->offset++;
}
-dense:
- *range_min = min;
- *range_max = pivot;
+max:
+ *range_max = mas->max;
}
/*
{
struct maple_enode *next;
enum maple_type type;
- bool ret = false;
while (true) {
- mas->depth++;
type = mte_node_type(mas->node);
+ mas->depth++;
mas_node_walk(mas, type, range_min, range_max);
if (ma_is_leaf(type)) // Leaf.
return true;
next = mas_get_slot(mas, mas->offset);
-
if (!next)
return false;
mas->node = next;
mas->offset = 0;
}
- return ret;
+ return false;
}
/*