Ejemplo n.º 1
0
//Default order is 5 and then split the node.
void bPlusTree::split(int key, bPlusTreeNode *c, bPlusTreeNode *n,
	int k, int *y, bPlusTreeNode **newnode)
{
	int i, mid;

	if (k <= MIN)
		mid = MIN;
	else
		mid = MIN + 1;

	*newnode = new bPlusTreeNode;

	for (i = mid + 1; i <= MAX; i++)
	{
		(*newnode)->value[i - mid] = n->value[i];
		(*newnode)->child[i - mid] = n->child[i];
	}

	(*newnode)->count = MAX - mid;
	n->count = mid;

	if (k <= MIN)
		fillnode(key, c, n, k);
	else
		fillnode(key, c, *newnode, k - mid);

	*y = n->value[n->count];
	(*newnode)->child[0] = n->child[n->count];
	n->count--;
}
Ejemplo n.º 2
0
/**
 * @brief Btree::split
 * @param Ipointer
 * @param temp
 * @param node
 * @param kposition
 * @param ypos
 * @param newnode
 *separate the tree in the childrens
 */
void Btree ::split(int Ipointer, Node *temp, Node *node, int kposition, int *ypos, Node **newnode)
{
    int i, mid ;

    if ( kposition <= MIN )
        mid = MIN ;
    else
        mid = MIN + 1 ;

    *newnode = new Node ;

    for ( i = mid + 1 ; i <= MAX ; i++ )
    {
        ( *newnode ) -> value[i - mid] = node -> value[i] ;
        ( *newnode ) -> child[i - mid] = node -> child[i] ;
    }

    ( *newnode ) -> count = MAX - mid ;
    node -> count = mid ;

    if ( kposition <= MIN )
        fillnode ( Ipointer, temp, node, kposition ) ;
    else
        fillnode ( Ipointer, temp, *newnode, kposition - mid ) ;

    *ypos = node -> value[node -> count] ;
    ( *newnode ) -> child[0] = node -> child[node -> count] ;
    node -> count-- ;
}
Ejemplo n.º 3
0
//Check whether the key exists or not.
int bPlusTree::setkey(int val, bPlusTreeNode *n, int *p, bPlusTreeNode **ch)
{
	int key;
	if (n == NULL)
	{
		*p = val;
		*ch = NULL;
		return 1;
	}
	else
	{
		if (searchnode(val, n, &key))
			cout << endl << "Key value already exists." << endl;
		else if (setkey(val, n->child[key], p, ch))
		{
			if (n->count < MAX)
			{
				fillnode(*p, *ch, n, key);
				return 0;
			}
			else
			{
				split(*p, *ch, n, key, p, ch);
				return 1;
			}
		}
		return 0;
	}
}
Ejemplo n.º 4
0
int Btree ::setIpointer(int Ipointer, Node *node, int *point, Node **temp)
{
    int pos ;
    if ( node == NULL )
    {
        *point = Ipointer ;
        *temp = NULL ;
        return 1 ;
    }
    else
    {
        if ( searchnode ( Ipointer, node, &pos ) )
            cout <<  "Ya existe" << endl ;
        if ( setIpointer( Ipointer, node -> child[pos], point, temp) )
        {
            if ( node -> count < MAX )
            {
                fillnode ( *point, *temp, node, pos ) ;
                return 0 ;
            }
            else
            {
                split ( *point, *temp, node, pos, point, temp ) ;
                return 1 ;
            }
        }
        return 0 ;
    }
}
Ejemplo n.º 5
0
/* update is called only for TXT_FULL tables */
static void update (txtnode_t *pnode, long ptim) {
    txtnode_t *cnode, *seennode;
    long ctim;
    int i;

    Gawsetmode (&Gwidgets[pnode->u.f.t.mwi], TRUE);
    if (!pnode->u.f.t.list)
        buildlist (pnode);
    else if (ptim < Tgettime (pnode->vo))
        rebuildlist (pnode);
    for (
        i = 0, cnode = &pnode->u.f.t.list[0]; i < pnode->u.f.t.n;
        i++, cnode++
    ) {
        ctim = cnode->time;
        if (txtvo2toggle == cnode->vo) {
            switch (cnode->mode) {
            case TXT_SEEN:
                break;
            case TXT_ABSTRACT:
                unfillnode (cnode);
                cnode->mode = TXT_FULL;
                fillnode (pnode, cnode);
                break;
            case TXT_FULL:
                unfillnode (cnode);
                cnode->mode = TXT_ABSTRACT;
                fillnode (pnode, cnode);
                break;
            }
        }
        if (!(seennode = findseen (cnode)))
            add2seen (cnode);
        if (
            seennode && cnode->mode == TXT_SEEN && seennode->ko != cnode->u.s.ko
        ) {
            unfillnode (cnode);
            cnode->u.s.txtnode = seennode;
            cnode->u.s.ko = seennode->ko;
            fillnode (pnode, cnode);
        } else if (seennode && cnode->mode != TXT_SEEN) {
            unfillnode (cnode);
            cnode->mode = TXT_SEEN;
            cnode->u.s.txtnode = seennode;
            cnode->u.s.ko = seennode->ko;
            fillnode (pnode, cnode);
        } else if (!seennode && cnode->mode == TXT_SEEN) {
            unfillnode (cnode);
            cnode->mode = TXT_ABSTRACT;
            fillnode (pnode, cnode);
        } else if (cnode->time == -1) {
            unfillnode (cnode);
            if (seennode)
                cnode->u.s.txtnode = seennode;
            fillnode (pnode, cnode);
        }
        if (cnode->ttype == T_TABLE && cnode->mode == TXT_FULL)
            update (cnode, ctim);
    }
    Gaworder (&Gwidgets[pnode->u.f.t.mwi], pnode, orderfunc);
    Gawsetmode (&Gwidgets[pnode->u.f.t.mwi], FALSE);
}