added RedBlackTree::remove()
partially added RedBlackTree::getIterator()
This commit is contained in:
		| @ -95,7 +95,7 @@ QSE_INLINE pair_t* qse_rbt_allocpair ( | ||||
| 		KPTR(n) = n + 1; | ||||
| 		if (kptr) QSE_MEMCPY (KPTR(n), kptr, KTOB(rbt,klen)); | ||||
| 	} | ||||
| 	else  | ||||
| 	else | ||||
| 	{ | ||||
| 		KPTR(n) = kcop (rbt, kptr, klen); | ||||
| 		if (KPTR(n) == QSE_NULL) | ||||
| @ -113,11 +113,11 @@ QSE_INLINE pair_t* qse_rbt_allocpair ( | ||||
| 	else if (vcop == QSE_RBT_COPIER_INLINE) | ||||
| 	{ | ||||
| 		VPTR(n) = n + 1; | ||||
| 		if (kcop == QSE_RBT_COPIER_INLINE)  | ||||
| 		if (kcop == QSE_RBT_COPIER_INLINE) | ||||
| 			VPTR(n) = (byte_t*)VPTR(n) + KTOB(rbt,klen); | ||||
| 		if (vptr) QSE_MEMCPY (VPTR(n), vptr, VTOB(rbt,vlen)); | ||||
| 	} | ||||
| 	else  | ||||
| 	else | ||||
| 	{ | ||||
| 		VPTR(n) = vcop (rbt, vptr, vlen); | ||||
| 		if (VPTR(n) != QSE_NULL) | ||||
| @ -134,7 +134,7 @@ QSE_INLINE pair_t* qse_rbt_allocpair ( | ||||
|  | ||||
| QSE_INLINE void qse_rbt_freepair (rbt_t* rbt, pair_t* pair) | ||||
| { | ||||
| 	if (rbt->style->freeer[QSE_RBT_KEY] != QSE_NULL)  | ||||
| 	if (rbt->style->freeer[QSE_RBT_KEY] != QSE_NULL) | ||||
| 		rbt->style->freeer[QSE_RBT_KEY] (rbt, KPTR(pair), KLEN(pair)); | ||||
| 	if (rbt->style->freeer[QSE_RBT_VAL] != QSE_NULL) | ||||
| 		rbt->style->freeer[QSE_RBT_VAL] (rbt, VPTR(pair), VLEN(pair)); | ||||
| @ -235,7 +235,7 @@ int qse_rbt_init (rbt_t* rbt, mmgr_t* mmgr, int kscale, int vscale) | ||||
| 	rbt->size = 0; | ||||
|  | ||||
| 	rbt->style = &style[0]; | ||||
| 	 | ||||
|  | ||||
| 	/* self-initializing nil */ | ||||
| 	QSE_MEMSET(&rbt->xnil, 0, QSE_SIZEOF(rbt->xnil)); | ||||
| 	rbt->xnil.color = QSE_RBT_BLACK; | ||||
| @ -299,11 +299,11 @@ static void rotate (rbt_t* rbt, pair_t* pivot, int leftwise) | ||||
| { | ||||
| 	/* | ||||
| 	 * == leftwise rotation | ||||
| 	 * move the pivot pair down to the poistion of the pivot's original  | ||||
| 	 * left child(x). move the pivot's right child(y) to the pivot's original  | ||||
| 	 * position. as 'c1' is between 'y' and 'pivot', move it to the right  | ||||
| 	 * move the pivot pair down to the poistion of the pivot's original | ||||
| 	 * left child(x). move the pivot's right child(y) to the pivot's original | ||||
| 	 * position. as 'c1' is between 'y' and 'pivot', move it to the right | ||||
| 	 * of the new pivot position. | ||||
| 	 *       parent                   parent  | ||||
| 	 *       parent                   parent | ||||
| 	 *        | | (left or right?)      | | | ||||
| 	 *       pivot                      y | ||||
| 	 *       /  \                     /  \ | ||||
| @ -312,23 +312,23 @@ static void rotate (rbt_t* rbt, pair_t* pivot, int leftwise) | ||||
| 	 *         c1  c2            x   c1 | ||||
| 	 * | ||||
| 	 * == rightwise rotation | ||||
| 	 * move the pivot pair down to the poistion of the pivot's original  | ||||
| 	 * right child(y). move the pivot's left child(x) to the pivot's original  | ||||
| 	 * position. as 'c2' is between 'x' and 'pivot', move it to the left  | ||||
| 	 * move the pivot pair down to the poistion of the pivot's original | ||||
| 	 * right child(y). move the pivot's left child(x) to the pivot's original | ||||
| 	 * position. as 'c2' is between 'x' and 'pivot', move it to the left | ||||
| 	 * of the new pivot position. | ||||
| 	 * | ||||
| 	 *       parent                   parent  | ||||
| 	 *       parent                   parent | ||||
| 	 *        | | (left or right?)      | | | ||||
| 	 *       pivot                      x | ||||
| 	 *       /  \                     /  \ | ||||
| 	 *     x     y    =====>        c1   pivot           | ||||
| 	 *     x     y    =====>        c1   pivot | ||||
| 	 *    / \                            /  \ | ||||
| 	 *   c1  c2                         c2   y | ||||
| 	 * | ||||
| 	 * | ||||
| 	 * the actual implementation here resolves the pivot's relationship to | ||||
| 	 * its parent by comparaing pointers as it is not known if the pivot pair | ||||
| 	 * is the left child or the right child of its parent,  | ||||
| 	 * is the left child or the right child of its parent, | ||||
| 	 */ | ||||
|  | ||||
| 	pair_t* parent, * z, * c; | ||||
| @ -349,9 +349,9 @@ static void rotate (rbt_t* rbt, pair_t* pivot, int leftwise) | ||||
|  | ||||
| 	parent = pivot->parent; | ||||
| 	/* y for leftwise rotation, x for rightwise rotation */ | ||||
| 	z = pivot->child[cid1];  | ||||
| 	z = pivot->child[cid1]; | ||||
| 	/* c1 for leftwise rotation, c2 for rightwise rotation */ | ||||
| 	c = z->child[cid2];  | ||||
| 	c = z->child[cid2]; | ||||
|  | ||||
| 	z->parent = parent; | ||||
| 	if (parent) | ||||
| @ -391,7 +391,7 @@ static void adjust (rbt_t* rbt, pair_t* pair) | ||||
|  | ||||
| 		QSE_ASSERT (x_par->parent != QSE_NULL); | ||||
|  | ||||
| 		if (x_par == x_par->parent->child[LEFT])  | ||||
| 		if (x_par == x_par->parent->child[LEFT]) | ||||
| 		{ | ||||
| 			tmp = x_par->parent->child[RIGHT]; | ||||
| 			tmp2 = x_par->child[RIGHT]; | ||||
| @ -430,10 +430,10 @@ static void adjust (rbt_t* rbt, pair_t* pair) | ||||
| static pair_t* change_pair_val ( | ||||
| 	rbt_t* rbt, pair_t* pair, void* vptr, size_t vlen) | ||||
| { | ||||
| 	if (VPTR(pair) == vptr && VLEN(pair) == vlen)  | ||||
| 	if (VPTR(pair) == vptr && VLEN(pair) == vlen) | ||||
| 	{ | ||||
| 		/* if the old value and the new value are the same, | ||||
| 		 * it just calls the handler for this condition.  | ||||
| 		 * it just calls the handler for this condition. | ||||
| 		 * No value replacement occurs. */ | ||||
| 		if (rbt->style->keeper != QSE_NULL) | ||||
| 		{ | ||||
| @ -461,7 +461,7 @@ static pair_t* change_pair_val ( | ||||
| 			else | ||||
| 			{ | ||||
| 				/* need to reconstruct the pair */ | ||||
| 				pair_t* p = qse_rbt_allocpair (rbt,  | ||||
| 				pair_t* p = qse_rbt_allocpair (rbt, | ||||
| 					KPTR(pair), KLEN(pair), | ||||
| 					vptr, vlen); | ||||
| 				if (p == QSE_NULL) return QSE_NULL; | ||||
| @ -477,7 +477,7 @@ static pair_t* change_pair_val ( | ||||
| 					{ | ||||
| 						pair->parent->left = p; | ||||
| 					} | ||||
| 					else  | ||||
| 					else | ||||
| 					{ | ||||
| 						QSE_ASSERT (pair->parent->right == pair); | ||||
| 						pair->parent->right = p; | ||||
| @ -492,7 +492,7 @@ static pair_t* change_pair_val ( | ||||
| 				return p; | ||||
| 			} | ||||
| 		} | ||||
| 		else  | ||||
| 		else | ||||
| 		{ | ||||
| 			void* nvptr = vcop (rbt, vptr, vlen); | ||||
| 			if (nvptr == QSE_NULL) return QSE_NULL; | ||||
| @ -501,7 +501,7 @@ static pair_t* change_pair_val ( | ||||
| 		} | ||||
|  | ||||
| 		/* free up the old value */ | ||||
| 		if (rbt->style->freeer[QSE_RBT_VAL] != QSE_NULL)  | ||||
| 		if (rbt->style->freeer[QSE_RBT_VAL] != QSE_NULL) | ||||
| 		{ | ||||
| 			rbt->style->freeer[QSE_RBT_VAL] (rbt, ovptr, ovlen); | ||||
| 		} | ||||
| @ -515,12 +515,12 @@ static pair_t* insert ( | ||||
| { | ||||
| 	pair_t* x_cur = rbt->root; | ||||
| 	pair_t* x_par = QSE_NULL; | ||||
| 	pair_t* x_new;  | ||||
| 	pair_t* x_new; | ||||
|  | ||||
| 	while (!IS_NIL(rbt,x_cur)) | ||||
| 	{ | ||||
| 		int n = rbt->style->comper (rbt, kptr, klen, KPTR(x_cur), KLEN(x_cur)); | ||||
| 		if (n == 0)  | ||||
| 		if (n == 0) | ||||
| 		{ | ||||
| 			switch (opt) | ||||
| 			{ | ||||
| @ -530,7 +530,7 @@ static pair_t* insert ( | ||||
|  | ||||
| 				case ENSERT: | ||||
| 					/* return existing pair */ | ||||
| 					return x_cur;  | ||||
| 					return x_cur; | ||||
|  | ||||
| 				case INSERT: | ||||
| 					/* return failure */ | ||||
| @ -609,18 +609,18 @@ pair_t* qse_rbt_cbsert ( | ||||
| { | ||||
| 	pair_t* x_cur = rbt->root; | ||||
| 	pair_t* x_par = QSE_NULL; | ||||
| 	pair_t* x_new;  | ||||
| 	pair_t* x_new; | ||||
|  | ||||
| 	while (!IS_NIL(rbt,x_cur)) | ||||
| 	{ | ||||
| 		int n = rbt->style->comper (rbt, kptr, klen, KPTR(x_cur), KLEN(x_cur)); | ||||
| 		if (n == 0)  | ||||
| 		if (n == 0) | ||||
| 		{ | ||||
| 			/* back up the contents of the current pair  | ||||
| 			/* back up the contents of the current pair | ||||
| 			 * in case it is reallocated */ | ||||
| 			pair_t tmp; | ||||
|  | ||||
| 			tmp = *x_cur;	  | ||||
| 			tmp = *x_cur; | ||||
|  | ||||
| 			/* call the callback function to manipulate the pair */ | ||||
| 			x_new = cbserter (rbt, x_cur, kptr, klen, ctx); | ||||
| @ -647,7 +647,7 @@ pair_t* qse_rbt_cbsert ( | ||||
| 					{ | ||||
| 						tmp.parent->left = x_new; | ||||
| 					} | ||||
| 					else  | ||||
| 					else | ||||
| 					{ | ||||
| 						QSE_ASSERT (tmp.parent->right == x_cur); | ||||
| 						tmp.parent->right = x_new; | ||||
| @ -730,7 +730,7 @@ static void adjust_for_delete (rbt_t* rbt, pair_t* pair, pair_t* par) | ||||
| 			{ | ||||
| 				if (tmp->right->color == QSE_RBT_BLACK) | ||||
| 				{ | ||||
| 					if (!IS_NIL(rbt,tmp->left))  | ||||
| 					if (!IS_NIL(rbt,tmp->left)) | ||||
| 						tmp->left->color = QSE_RBT_BLACK; | ||||
| 					tmp->color = QSE_RBT_RED; | ||||
| 					rotate_right (rbt, tmp); | ||||
| @ -946,7 +946,7 @@ static QSE_INLINE void walk ( | ||||
| 				{ | ||||
| 					/* otherwise, move up to the parent */ | ||||
| 					prev = x_cur; | ||||
| 					x_cur = x_cur->parent;	 | ||||
| 					x_cur = x_cur->parent; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| @ -958,15 +958,15 @@ static QSE_INLINE void walk ( | ||||
|  | ||||
| 			if (!IS_NIL(rbt,x_cur->child[r])) | ||||
| 			{ | ||||
| 				/* go down to the right node if it exists */  | ||||
| 				/* go down to the right node if it exists */ | ||||
| 				prev = x_cur; | ||||
| 				x_cur = x_cur->child[r];	 | ||||
| 				x_cur = x_cur->child[r]; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				/* otherwise, move up to the parent */ | ||||
| 				prev = x_cur; | ||||
| 				x_cur = x_cur->parent;	 | ||||
| 				x_cur = x_cur->parent; | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
|  | ||||
		Reference in New Issue
	
	Block a user