unsigned char mas_end, struct maple_big_node *b_node,
unsigned char mab_start)
{
- enum maple_type mt;
- struct maple_node *node;
- void **slots;
- unsigned long *pivots, *gaps;
+ enum maple_type mt = mte_node_type(mas->node);
+ struct maple_node *node = mte_to_node(mas->node);
+ void **slots = ma_slots(node, mt);
+ unsigned long *pivots = ma_pivots(node, mt);
+ unsigned long *gaps = NULL;
int i = mas_start, j = mab_start;
- unsigned char piv_end;
- node = mas_mn(mas);
- mt = mte_node_type(mas->node);
- pivots = ma_pivots(node, mt);
- if (!i) {
- b_node->pivot[j] = pivots[i++];
- if (unlikely(i > mas_end))
- goto complete;
- j++;
- }
+ for (; i <= mas_end; i++, j++) {
+ b_node->pivot[j] = _mas_safe_pivot(mas, pivots, i, mt);
- piv_end = min(mas_end, mt_pivots[mt]);
- for (; i < piv_end; i++, j++) {
- b_node->pivot[j] = pivots[i];
- if (unlikely(mas->max == b_node->pivot[j] || !b_node->pivot[j]))
- goto complete;
+ if ((mas->max == b_node->pivot[j]) ||
+ (j && !b_node->pivot[j])) { // end of node.
+ j++;
+ break;
+ }
}
- if (likely(i <= mas_end))
- b_node->pivot[j] = _mas_safe_pivot(mas, pivots, i, mt);
-
-complete:
- b_node->b_end = ++j;
+ b_node->b_end = j;
j -= mab_start;
- slots = ma_slots(node, mt);
+
memcpy(b_node->slot + mab_start, slots + mas_start, sizeof(void *) * j);
- if (!ma_is_leaf(mt) && mt_is_alloc(mas->tree)) {
+
+ if (!mte_is_leaf(mas->node) && mt_is_alloc(mas->tree)) {
gaps = ma_gaps(node, mt);
memcpy(b_node->gap + mab_start, gaps + mas_start,
sizeof(unsigned long) * j);