mt = mte_node_type(mas->node);
slots = ma_slots(mas_mn(mas), mt);
mas->max = mas_safe_pivot(mas, offset);
+ if (mas->max < limit)
+ goto no_entry;
+
while (level > 1) {
level--;
mas->node = mas_slot(mas, slots, offset);
goto restart_prev_node;
mt = mte_node_type(mas->node);
slots = ma_slots(mas_mn(mas), mt);
- offset = mt_slots[mt];
- do {} while (!mas_get_slot(mas, --offset));
+ offset = mas_data_end(mas);
mas->max = mas_safe_pivot(mas, offset);
+ if (mas->max < limit)
+ goto no_entry;
}
mas->offset = offset;
static inline bool mas_prev_nentry(struct ma_state *mas, unsigned long limit,
unsigned long *max)
{
- unsigned long pivot = mas->max;
- unsigned char slot = mas->offset;
- void *entry;
+ unsigned long pivot;
+ unsigned char offset;
+ struct maple_node *mn;
+ enum maple_type mt;
+ unsigned long *pivots;
+ void **slots;
- if (!slot)
+ if (!mas->offset)
return false;
- slot--;
- do {
- pivot = mas_safe_pivot(mas, slot);
- if (pivot < limit)
- return false;
+ mn = mas_mn(mas);
+ mt = mte_node_type(mas->node);
+ offset = mas->offset - 1;
+ slots = ma_slots(mn, mt);
+ pivots = ma_pivots(mn, mt);
- entry = mas_get_slot(mas, slot);
- if (entry)
- break;
- } while (slot--);
+ if (offset == mt_pivots[mt])
+ pivot = mas->max;
+ else
+ pivot = pivots[offset];
- if (!entry)
+ while ((offset && !slots[offset] && pivot >= limit) || !pivot)
+ pivot = pivots[--offset];
+
+ mas->offset = offset;
+ if (!slots[offset])
return false;
*max = pivot;
- mas->offset = slot;
return true;
}
}
if (mas_is_none(mas)) {
- mas->index = 0;
+ mas->index = mas->last = limit;
return NULL;
}
{
void *entry;
- if (!mas->index) // Nothing comes before 0.
+ if (!mas->index) {// Nothing comes before 0.
+ mas->last = 0;
return NULL;
+ }
if (mas_is_none(mas))
mas->node = MAS_START;
do {
entry = _mas_prev(mas, min);
- if (!mas_searchable(mas))
- break;
- } while (!entry);
+ } while (mas_searchable(mas) && !entry);
return entry;
}