{
enum maple_type type = mte_node_type(mas->node);
unsigned long pivot, min, gap = 0;
- unsigned char offset = 0;
+ unsigned char count, offset = 0;
unsigned long *gaps = NULL, *pivots = ma_pivots(mas_mn(mas), type);
void **slots = ma_slots(mas_mn(mas), type);
bool found = false;
gaps = ma_gaps(mte_to_node(mas->node), type);
}
+ count = mt_slots[type];
min = mas_safe_min(mas, pivots, offset);
- for (; offset < mt_slots[type]; offset++) {
+ for (; offset < count; offset++) {
pivot = _mas_safe_pivot(mas, pivots, offset, type);
if (offset && !pivot)
break;
/* Skip this slot in the parent. */
static inline bool mas_skip_node(struct ma_state *mas)
{
- unsigned char slot;
+ unsigned char slot, slot_count;
+ unsigned long *pivots;
+ enum maple_type mt;
+ mt = mte_node_type(mas->node);
+ slot_count = mt_slots[mt] - 1;
do {
if (mte_is_root(mas->node)) {
slot = mas->offset;
- if (slot > mt_slot_count(mas->node) - 1) {
+ if (slot > slot_count) {
mas_set_err(mas, -EBUSY);
return false;
}
} else {
slot = mte_parent_slot(mas->node);
mas_ascend(mas);
+ mt = mte_node_type(mas->node);
+ slot_count = mt_slots[mt] - 1;
}
- } while (slot > mt_slot_count(mas->node) - 1);
+ } while (slot > slot_count);
mas->offset = ++slot;
+ pivots = ma_pivots(mas_mn(mas), mt);
if (slot > 0)
- mas->min = mte_pivot(mas->node, slot - 1) + 1;
+ mas->min = pivots[slot - 1] + 1;
+
+ if (slot <= slot_count)
+ mas->max = pivots[slot];
- if (slot < mt_pivot_count(mas->node))
- mas->max = mte_pivot(mas->node, slot);
return true;
}