Esempio n. 1
0
// Destroy (free) node recursively. 
void Xastir_RTreeDestroyNode (struct Node *n)
{
    int i;
    //    fprintf(stderr,"  Freeing node %lx\n",(unsigned long int) n);
    if (n->level > 0) {  //it is not leaf -> destroy childs 
        for ( i = 0; i < Xastir_NODECARD; i++) {
            if ( n->branch[i].child ) {
                Xastir_RTreeDestroyNode ( n->branch[i].child );
            }
        }
    }
    
    //
    Xastir_RTreeFreeNode( n );
}
Esempio n. 2
0
// Delete a data rectangle from an index structure.
// Pass in a pointer to a Rect, the tid of the record, ptr to ptr to root node.
// Returns 1 if record not found, 0 if success.
// Xastir_RTreeDeleteRect provides for eliminating the root.
//
int Xastir_RTreeDeleteRect(struct Rect *R, void *Tid, struct Node**Nn)
{
	register struct Rect *r = R;
	register void *tid = Tid;
	register struct Node **nn = Nn;
	register int i;
	register struct Node *tmp_nptr=NULL; // Original superliminal.com
                                             // source did not initialize.
                                             // Code analysis says shouldn't
                                             // matter, but let's initialize
                                             // to shut up GCC
	struct ListNode *reInsertList = NULL;
	register struct ListNode *e;

	assert(r && nn);
	assert(*nn);
	assert(tid >= (void *)0);

	if (!Xastir_RTreeDeleteRect2(r, tid, *nn, &reInsertList))
	{
		/* found and deleted a data item */

		/* reinsert any branches from eliminated nodes */
		while (reInsertList)
		{
			tmp_nptr = reInsertList->node;
			for (i = 0; i < MAXKIDS(tmp_nptr); i++)
			{
				if (tmp_nptr->branch[i].child)
				{
					Xastir_RTreeInsertRect(
						&(tmp_nptr->branch[i].rect),
						tmp_nptr->branch[i].child,
						nn,
						tmp_nptr->level);
				}
			}
			e = reInsertList;
			reInsertList = reInsertList->next;
			Xastir_RTreeFreeNode(e->node);
			Xastir_RTreeFreeListNode(e);
		}
		
		/* check for redundant root (not leaf, 1 child) and eliminate
		*/
		if ((*nn)->count == 1 && (*nn)->level > 0)
		{
			for (i = 0; i < Xastir_NODECARD; i++)
			{
				tmp_nptr = (*nn)->branch[i].child;
				if(tmp_nptr)
					break;
			}
			assert(tmp_nptr);
			Xastir_RTreeFreeNode(*nn);
			*nn = tmp_nptr;
		}
		return 0;
	}
	else
	{
		return 1;
	}
}