mast->bn->type = mte_node_type(mas->node);
}
+
+static inline void mast_split_data(struct maple_subtree_state *mast,
+ struct ma_state *mas)
+{
+ unsigned char p_slot, mid_split, split = 0;
+
+ split = mab_calc_split(mast->bn, &mid_split);
+ mab_mas_cp(mast->bn, 0, split, mast->l);
+ mte_set_pivot(mast->r->node, 0, mast->r->max);
+ mab_mas_cp(mast->bn, split + 1, mast->bn->b_end, mast->r);
+ mas_set_slot(mast->l, mte_parent_slot(mas->node));
+ mast->l->max = mast->bn->pivot[split];
+ mast->r->min = mast->l->max + 1;
+ if (!mte_is_leaf(mas->node)) {
+ p_slot = mas_get_slot(mast->orig_l);
+ mas_set_split_parent(mast->orig_l, mast->l->node,
+ mast->r->node, &p_slot, split);
+ mas_set_split_parent(mast->orig_r, mast->l->node,
+ mast->r->node, &p_slot, split);
+ }
+}
static inline int mas_split(struct ma_state *mas,
struct maple_big_node *b_node)
{
struct maple_subtree_state mast;
- unsigned char p_slot, split = 0;
int height = 0;
- unsigned char mid_split;
MA_STATE(l_mas, mas->tree, mas->index, mas->last);
MA_STATE(r_mas, mas->tree, mas->index, mas->last);
mast.l = &l_mas;
mast.r = &r_mas;
+ mast.orig_l = &prev_l_mas;
+ mast.orig_r = &prev_r_mas;
mast.free = &mat;
mast.bn = b_node;
mas_dup_state(&r_mas, mas);
l_mas.node = mas_new_ma_node(mas, b_node);
r_mas.node = mas_new_ma_node(mas, b_node);
- split = mab_calc_split(b_node, &mid_split);
- mab_mas_cp(b_node, 0, split, &l_mas);
- mte_set_pivot(r_mas.node, 0, r_mas.max);
- mab_mas_cp(b_node, split + 1, b_node->b_end, &r_mas);
- mas_set_slot(&l_mas, mte_parent_slot(mas->node));
- l_mas.max = b_node->pivot[split];
- r_mas.min = l_mas.max + 1;
- if (!mte_is_leaf(mas->node)) {
- p_slot = mas_get_slot(&prev_l_mas);
- mas_set_split_parent(&prev_l_mas, l_mas.node,
- r_mas.node, &p_slot, split);
- mas_set_split_parent(&prev_r_mas, l_mas.node,
- r_mas.node, &p_slot, split);
- }
+ mast_split_data(&mast, mas);
mast_split_fill_bnode(&mast, mas);
mas_dup_state(&prev_l_mas, mast.l);
mas_dup_state(&prev_r_mas, mast.r);