static inline unsigned long mas_first_entry(struct ma_state *mas,
unsigned long limit)
{
- void **slots, *entry;
unsigned long max = mas->max, range_start = mas->min;
unsigned char offset;
+ unsigned long *pivots;
+ struct maple_node *mn;
+ void **slots;
+ enum maple_type mt;
while (likely(!mte_is_leaf(mas->node))) {
max = mte_pivot(mas->node, 0);
}
mas->max = max;
- slots = ma_slots(mte_to_node(mas->node), mte_node_type(mas->node));
+ mn = mas_mn(mas);
+ mt = mte_node_type(mas->node);
+ slots = ma_slots(mn, mt);
+ /* 0 or 1 must be set */
offset = 0;
- while ((range_start < limit) &&
- (offset < mt_slot_count(mas->node))) {
- entry = mas_slot(mas, slots, offset);
- if (entry)
- goto done;
- range_start = mas_safe_pivot(mas, offset) + 1;
- offset++;
- }
+ range_start = mas->min;
+ if (range_start > limit)
+ goto none;
+
+ if(likely(mas_slot(mas, slots, offset)))
+ goto done;
+
+ pivots = ma_pivots(mn, mt);
+ range_start = pivots[0] + 1;
+
+ if (range_start > limit)
+ goto none;
+
+ if(likely(mas_slot(mas, slots, ++offset)))
+ goto done;
+none:
mas->node = MAS_NONE;
done:
mas->offset = offset;