void *entry = NULL;
struct maple_enode *prev_node;
unsigned long index = mas->index;
+ enum maple_type mt = mte_node_type(mas->node);
mas->offset++;
retry:
*range_start = mas->last + 1;
while (!mas_is_none(mas)) {
-
- if (mas->offset >= mt_slot_count(mas->node))
+ if (mas->offset >= mt_slots[mt])
goto next_node;
- if (!mte_is_leaf(mas->node) || !mas->offset) {
+ if (!ma_is_leaf(mt) || !mas->offset) {
prev_node = mas->node;
*range_start = mas_first_entry(mas, limit);
if (mas_is_none(mas)) {
next_node:
mas_next_node(mas, limit);
mas->offset = 0;
+ mt = mte_node_type(mas->node);
}
if (mas_is_none(mas))
bool _mas_rev_awalk(struct ma_state *mas, unsigned long size)
{
- struct maple_node *node = mas_mn(mas);
enum maple_type type = mte_node_type(mas->node);
+ struct maple_node *node = mas_mn(mas);
unsigned long *pivots, *gaps;
void **slots;
- unsigned char offset = mas->offset;
- unsigned long max;
- unsigned long gap, min;
+ unsigned long gap, max, min;
if (ma_is_dense(type)) { // dense nodes.
mas->offset = (unsigned char)(mas->index - mas->min);
if (!ma_is_leaf(type))
gaps = ma_gaps(node, type);
- min = _mas_safe_pivot(mas, pivots, offset, type) + 1;
+ min = _mas_safe_pivot(mas, pivots, mas->offset, type) + 1;
do {
max = min - 1;
- min = mas_safe_min(mas, pivots, offset);
+ min = mas_safe_min(mas, pivots, mas->offset);
if (mas->last < min)
continue;
}
if (!ma_is_leaf(type))
- gap = gaps[offset];
- else if (mas_slot(mas, slots, offset))
+ gap = gaps[mas->offset];
+ else if (mas_slot(mas, slots, mas->offset))
continue; // no gap in leaf.
else
gap = max - min + 1;
if (ma_is_leaf(type)) {
mas->min = min;
mas->max = min + gap - 1;
- mas->offset = offset;
return true;
}
break;
- } while (offset--);
+ } while (mas->offset--);
- if (offset >= mt_slots[type]) { // Overflow, node exhausted.
- offset = 0;
+ if (mas->offset >= mt_slots[type]) { // Overflow, node exhausted.
+ mas->offset = 0;
goto ascend;
}
//descend
- mas->node = mas_slot(mas, slots, offset);
+ mas->node = mas_slot(mas, slots, mas->offset);
mas->min = min;
mas->max = max;
mas->offset = mas_data_end(mas);
if (mte_is_root(mas->node))
mas_set_err(mas, -EBUSY);
- mas->offset = offset;
return false;
}