示例#1
0
static void
rotate_right(size_t pidx, bnode_t *lbnode,
             bnode_t *rbnode, bnode_t *parent,
             const piojo_btree_t *tree)
{
        size_t i;

        /* Prepend parent entry to right bnode. */
        for (i = rbnode->ecnt; i > 0; --i){
                copy_bentry(i - 1, rbnode, i, rbnode, tree);
        }
        copy_bentry(pidx, parent, 0, rbnode, tree);
        ++rbnode->ecnt;

        /* Prepend last child from left bnode to right bnode. */
        if (! rbnode->leaf_p){
                for (i = rbnode->ecnt; i > 0; --i){
                        move_child(rbnode->children[i - 1], i, rbnode);
                }
                move_child(lbnode->children[lbnode->ecnt], 0, rbnode);
        }

        /* Move last entry from left bnode to parent bnode. */
        copy_bentry(lbnode->ecnt - 1, lbnode, pidx, parent, tree);

        --lbnode->ecnt;
}
示例#2
0
static void
rotate_left(size_t pidx, bnode_t *lbnode,
            bnode_t *rbnode, bnode_t *parent,
            const piojo_btree_t *tree)
{
        size_t i;

        /* Append parent entry to left bnode. */
        copy_bentry(pidx, parent, lbnode->ecnt, lbnode, tree);

        /* Append first child from right bnode to left bnode. */
        --rbnode->ecnt;
        if (! lbnode->leaf_p){
                move_child(rbnode->children[0], lbnode->ecnt + 1, lbnode);
                for (i = 0; i <= rbnode->ecnt; ++i){
                        move_child(rbnode->children[i + 1], i, rbnode);
                }
        }

        /* Move first entry from right bnode to parent bnode. */
        copy_bentry(0, rbnode, pidx, parent, tree);
        for (i = 0; i < rbnode->ecnt; ++i){
                copy_bentry(i + 1, rbnode, i, rbnode, tree);
        }

        ++lbnode->ecnt;
}
示例#3
0
文件: node.cpp 项目: P-GLEZ/godot
void Node::add_child_below_node(Node *p_node, Node *p_child, bool p_legible_unique_name) {
	add_child(p_child, p_legible_unique_name);

	if (is_a_parent_of(p_node)) {
		move_child(p_child, p_node->get_position_in_parent() + 1);
	} else {
		WARN_PRINTS("Cannot move under node " + p_node->get_name() + " as " + p_child->get_name() + " does not share a parent")
	}
}
示例#4
0
void BoxContainer::add_spacer(bool p_begin) {

	Control *c = memnew( Control );
	if (vertical)
		c->set_v_size_flags(SIZE_EXPAND_FILL);
	else
		c->set_h_size_flags(SIZE_EXPAND_FILL);

	add_child(c);
	if (p_begin)
		move_child(c,0);
}
示例#5
0
void GraphEdit::_graph_node_raised(Node *p_gn) {

	GraphNode *gn = p_gn->cast_to<GraphNode>();
	ERR_FAIL_COND(!gn);
	gn->raise();
	if (gn->is_comment()) {
		move_child(gn, 0);
	}
	int first_not_comment = 0;
	for (int i = 0; i < get_child_count(); i++) {
		GraphNode *gn = get_child(i)->cast_to<GraphNode>();
		if (gn && !gn->is_comment()) {
			first_not_comment = i;
			break;
		}
	}

	move_child(connections_layer, first_not_comment);
	top_layer->raise();
	emit_signal("node_selected", p_gn);
}
示例#6
0
static void
merge_bnodes(piojo_btree_t *tree, size_t pidx, bnode_t *lbnode,
             bnode_t *rbnode, bnode_t *parent)
{
        size_t i, ccnt = lbnode->ecnt + 1;

        /* Append parent entry to left bnode. */
        copy_bentry(pidx, parent, lbnode->ecnt, lbnode, tree);
        ++lbnode->ecnt;

        /* Append right bnode to left bnode. */
        for (i = 0; i < rbnode->ecnt; ++i, ++lbnode->ecnt){
                copy_bentry(i, rbnode, lbnode->ecnt, lbnode, tree);
        }
        if (! rbnode->leaf_p){
                for (i = 0; i <= rbnode->ecnt; ++i, ++ccnt){
                        move_child(rbnode->children[i], ccnt, lbnode);
                }
        }

        /* Shrink parent bnode. */
        --parent->ecnt;
        for (i = pidx; i < parent->ecnt; ++i){
                copy_bentry(i + 1, parent, i, parent, tree);
        }
        for (i = pidx + 1; i <= parent->ecnt; ++i){
                move_child(parent->children[i + 1], i, parent);
        }
        PIOJO_ASSERT(parent->children[pidx] == lbnode);

        /* Make left bnode the new root when the root is empty. */
        if (tree->root == parent && parent->ecnt == 0){
                free_bnode(tree->root, tree);
                tree->root = lbnode;
        }

        /* Free right bnode. */
        free_bnode(rbnode, tree);
}
示例#7
0
static void
split_root(piojo_btree_t *tree)
{
        bnode_t *newroot;
        PIOJO_ASSERT(tree->root->ecnt == tree->cmax - 1);

        newroot = alloc_bnode(tree);
        newroot->leaf_p = FALSE;
        move_child(tree->root, 0, newroot);

        split_bnode(tree, 0, tree->root, newroot);

        tree->root = newroot;
}
示例#8
0
static void
split_bnode(piojo_btree_t *tree, size_t pidx, bnode_t *bnode,
            bnode_t *parent)
{
        size_t i, j, mid = bnode->ecnt / 2;
        bnode_t *rbnode;
        PIOJO_ASSERT(parent->ecnt < tree->cmax - 1);

        /* Copy children/entries greater than median to right bnode. */
        rbnode = alloc_bnode(tree);
        for (i = mid + 1; i < bnode->ecnt; ++i, ++rbnode->ecnt){
                copy_bentry(i, bnode, rbnode->ecnt, rbnode, tree);
        }
        if (! bnode->leaf_p){
                for (j = 0, i = mid + 1; i <= bnode->ecnt; ++i, ++j){
                        move_child(bnode->children[i], j, rbnode);
                }
        }
        rbnode->leaf_p = bnode->leaf_p;

        /* Expand parent bnode. */
        for (i = parent->ecnt; i > pidx; --i){
                copy_bentry(i - 1, parent, i, parent, tree);
        }
        for (i = parent->ecnt + 1; i > pidx + 1; --i){
                move_child(parent->children[i - 1], i, parent);
        }

        /* Move median to parent bnode and update children. */
        copy_bentry(mid, bnode, pidx, parent, tree);
        PIOJO_ASSERT(parent->children[pidx] == bnode);
        move_child(rbnode, pidx + 1, parent);
        ++parent->ecnt;

        bnode->ecnt = mid;
}