| Index: source/libvpx/vpx_mem/memory_manager/include/cavl_impl.h
|
| ===================================================================
|
| --- source/libvpx/vpx_mem/memory_manager/include/cavl_impl.h (revision 172621)
|
| +++ source/libvpx/vpx_mem/memory_manager/include/cavl_impl.h (working copy)
|
| @@ -110,16 +110,16 @@
|
| #define L_BIT_ARR_DEFN(NAME) unsigned long NAME[L_BIT_ARR_LONGS];
|
|
|
| #define L_BIT_ARR_VAL(BIT_ARR, BIT_NUM) \
|
| - ((BIT_ARR)[(BIT_NUM) / L_LONG_BIT] & (1L << ((BIT_NUM) % L_LONG_BIT)))
|
| + ((BIT_ARR)[(BIT_NUM) / L_LONG_BIT] & (1L << ((BIT_NUM) % L_LONG_BIT)))
|
|
|
| #define L_BIT_ARR_0(BIT_ARR, BIT_NUM) \
|
| - (BIT_ARR)[(BIT_NUM) / L_LONG_BIT] &= ~(1L << ((BIT_NUM) % L_LONG_BIT));
|
| + (BIT_ARR)[(BIT_NUM) / L_LONG_BIT] &= ~(1L << ((BIT_NUM) % L_LONG_BIT));
|
|
|
| #define L_BIT_ARR_1(BIT_ARR, BIT_NUM) \
|
| - (BIT_ARR)[(BIT_NUM) / L_LONG_BIT] |= 1L << ((BIT_NUM) % L_LONG_BIT);
|
| + (BIT_ARR)[(BIT_NUM) / L_LONG_BIT] |= 1L << ((BIT_NUM) % L_LONG_BIT);
|
|
|
| #define L_BIT_ARR_ALL(BIT_ARR, BIT_VAL) \
|
| - { int i = L_BIT_ARR_LONGS; do (BIT_ARR)[--i] = 0L - (BIT_VAL); while(i); }
|
| + { int i = L_BIT_ARR_LONGS; do (BIT_ARR)[--i] = 0L - (BIT_VAL); while(i); }
|
|
|
| #else /* The bit array can definitely fit in one long */
|
|
|
| @@ -138,7 +138,7 @@
|
| #ifdef AVL_READ_ERRORS_HAPPEN
|
|
|
| #define L_CHECK_READ_ERROR(ERROR_RETURN) \
|
| - { if (AVL_READ_ERROR) return(ERROR_RETURN); }
|
| + { if (AVL_READ_ERROR) return(ERROR_RETURN); }
|
|
|
| #else
|
|
|
| @@ -179,18 +179,16 @@
|
|
|
| #if (L_IMPL_MASK & AVL_IMPL_INIT)
|
|
|
| -L_SC void L_(init)(L_(avl) *l_tree)
|
| -{
|
| - l_tree->root = AVL_NULL;
|
| +L_SC void L_(init)(L_(avl) *l_tree) {
|
| + l_tree->root = AVL_NULL;
|
| }
|
|
|
| #endif
|
|
|
| #if (L_IMPL_MASK & AVL_IMPL_IS_EMPTY)
|
|
|
| -L_SC int L_(is_empty)(L_(avl) *l_tree)
|
| -{
|
| - return(l_tree->root == AVL_NULL);
|
| +L_SC int L_(is_empty)(L_(avl) *l_tree) {
|
| + return(l_tree->root == AVL_NULL);
|
| }
|
|
|
| #endif
|
| @@ -201,358 +199,305 @@
|
|
|
| /* Balances subtree, returns handle of root node of subtree after balancing.
|
| */
|
| -L_SC AVL_HANDLE L_(balance)(L_BALANCE_PARAM_DECL_PREFIX AVL_HANDLE bal_h)
|
| -{
|
| - AVL_HANDLE deep_h;
|
| +L_SC AVL_HANDLE L_(balance)(L_BALANCE_PARAM_DECL_PREFIX AVL_HANDLE bal_h) {
|
| + AVL_HANDLE deep_h;
|
|
|
| - /* Either the "greater than" or the "less than" subtree of
|
| - ** this node has to be 2 levels deeper (or else it wouldn't
|
| - ** need balancing).
|
| - */
|
| - if (AVL_GET_BALANCE_FACTOR(bal_h) > 0)
|
| - {
|
| - /* "Greater than" subtree is deeper. */
|
| + /* Either the "greater than" or the "less than" subtree of
|
| + ** this node has to be 2 levels deeper (or else it wouldn't
|
| + ** need balancing).
|
| + */
|
| + if (AVL_GET_BALANCE_FACTOR(bal_h) > 0) {
|
| + /* "Greater than" subtree is deeper. */
|
|
|
| - deep_h = AVL_GET_GREATER(bal_h, 1);
|
| + deep_h = AVL_GET_GREATER(bal_h, 1);
|
|
|
| - L_CHECK_READ_ERROR(AVL_NULL)
|
| + L_CHECK_READ_ERROR(AVL_NULL)
|
|
|
| - if (AVL_GET_BALANCE_FACTOR(deep_h) < 0)
|
| - {
|
| - int bf;
|
| + if (AVL_GET_BALANCE_FACTOR(deep_h) < 0) {
|
| + int bf;
|
|
|
| - AVL_HANDLE old_h = bal_h;
|
| - bal_h = AVL_GET_LESS(deep_h, 1);
|
| - L_CHECK_READ_ERROR(AVL_NULL)
|
| - AVL_SET_GREATER(old_h, AVL_GET_LESS(bal_h, 1))
|
| - AVL_SET_LESS(deep_h, AVL_GET_GREATER(bal_h, 1))
|
| - AVL_SET_LESS(bal_h, old_h)
|
| - AVL_SET_GREATER(bal_h, deep_h)
|
| + AVL_HANDLE old_h = bal_h;
|
| + bal_h = AVL_GET_LESS(deep_h, 1);
|
| + L_CHECK_READ_ERROR(AVL_NULL)
|
| + AVL_SET_GREATER(old_h, AVL_GET_LESS(bal_h, 1))
|
| + AVL_SET_LESS(deep_h, AVL_GET_GREATER(bal_h, 1))
|
| + AVL_SET_LESS(bal_h, old_h)
|
| + AVL_SET_GREATER(bal_h, deep_h)
|
|
|
| - bf = AVL_GET_BALANCE_FACTOR(bal_h);
|
| + bf = AVL_GET_BALANCE_FACTOR(bal_h);
|
|
|
| - if (bf != 0)
|
| - {
|
| - if (bf > 0)
|
| - {
|
| - AVL_SET_BALANCE_FACTOR(old_h, -1)
|
| - AVL_SET_BALANCE_FACTOR(deep_h, 0)
|
| - }
|
| - else
|
| - {
|
| - AVL_SET_BALANCE_FACTOR(deep_h, 1)
|
| - AVL_SET_BALANCE_FACTOR(old_h, 0)
|
| - }
|
| -
|
| - AVL_SET_BALANCE_FACTOR(bal_h, 0)
|
| - }
|
| - else
|
| - {
|
| - AVL_SET_BALANCE_FACTOR(old_h, 0)
|
| - AVL_SET_BALANCE_FACTOR(deep_h, 0)
|
| - }
|
| + if (bf != 0) {
|
| + if (bf > 0) {
|
| + AVL_SET_BALANCE_FACTOR(old_h, -1)
|
| + AVL_SET_BALANCE_FACTOR(deep_h, 0)
|
| + } else {
|
| + AVL_SET_BALANCE_FACTOR(deep_h, 1)
|
| + AVL_SET_BALANCE_FACTOR(old_h, 0)
|
| }
|
| - else
|
| - {
|
| - AVL_SET_GREATER(bal_h, AVL_GET_LESS(deep_h, 0))
|
| - AVL_SET_LESS(deep_h, bal_h)
|
|
|
| - if (AVL_GET_BALANCE_FACTOR(deep_h) == 0)
|
| - {
|
| - AVL_SET_BALANCE_FACTOR(deep_h, -1)
|
| - AVL_SET_BALANCE_FACTOR(bal_h, 1)
|
| - }
|
| - else
|
| - {
|
| - AVL_SET_BALANCE_FACTOR(deep_h, 0)
|
| - AVL_SET_BALANCE_FACTOR(bal_h, 0)
|
| - }
|
| + AVL_SET_BALANCE_FACTOR(bal_h, 0)
|
| + } else {
|
| + AVL_SET_BALANCE_FACTOR(old_h, 0)
|
| + AVL_SET_BALANCE_FACTOR(deep_h, 0)
|
| + }
|
| + } else {
|
| + AVL_SET_GREATER(bal_h, AVL_GET_LESS(deep_h, 0))
|
| + AVL_SET_LESS(deep_h, bal_h)
|
|
|
| - bal_h = deep_h;
|
| - }
|
| + if (AVL_GET_BALANCE_FACTOR(deep_h) == 0) {
|
| + AVL_SET_BALANCE_FACTOR(deep_h, -1)
|
| + AVL_SET_BALANCE_FACTOR(bal_h, 1)
|
| + } else {
|
| + AVL_SET_BALANCE_FACTOR(deep_h, 0)
|
| + AVL_SET_BALANCE_FACTOR(bal_h, 0)
|
| + }
|
| +
|
| + bal_h = deep_h;
|
| }
|
| - else
|
| - {
|
| - /* "Less than" subtree is deeper. */
|
| + } else {
|
| + /* "Less than" subtree is deeper. */
|
|
|
| - deep_h = AVL_GET_LESS(bal_h, 1);
|
| - L_CHECK_READ_ERROR(AVL_NULL)
|
| + deep_h = AVL_GET_LESS(bal_h, 1);
|
| + L_CHECK_READ_ERROR(AVL_NULL)
|
|
|
| - if (AVL_GET_BALANCE_FACTOR(deep_h) > 0)
|
| - {
|
| - int bf;
|
| - AVL_HANDLE old_h = bal_h;
|
| - bal_h = AVL_GET_GREATER(deep_h, 1);
|
| - L_CHECK_READ_ERROR(AVL_NULL)
|
| - AVL_SET_LESS(old_h, AVL_GET_GREATER(bal_h, 0))
|
| - AVL_SET_GREATER(deep_h, AVL_GET_LESS(bal_h, 0))
|
| - AVL_SET_GREATER(bal_h, old_h)
|
| - AVL_SET_LESS(bal_h, deep_h)
|
| + if (AVL_GET_BALANCE_FACTOR(deep_h) > 0) {
|
| + int bf;
|
| + AVL_HANDLE old_h = bal_h;
|
| + bal_h = AVL_GET_GREATER(deep_h, 1);
|
| + L_CHECK_READ_ERROR(AVL_NULL)
|
| + AVL_SET_LESS(old_h, AVL_GET_GREATER(bal_h, 0))
|
| + AVL_SET_GREATER(deep_h, AVL_GET_LESS(bal_h, 0))
|
| + AVL_SET_GREATER(bal_h, old_h)
|
| + AVL_SET_LESS(bal_h, deep_h)
|
|
|
| - bf = AVL_GET_BALANCE_FACTOR(bal_h);
|
| + bf = AVL_GET_BALANCE_FACTOR(bal_h);
|
|
|
| - if (bf != 0)
|
| - {
|
| - if (bf < 0)
|
| - {
|
| - AVL_SET_BALANCE_FACTOR(old_h, 1)
|
| - AVL_SET_BALANCE_FACTOR(deep_h, 0)
|
| - }
|
| - else
|
| - {
|
| - AVL_SET_BALANCE_FACTOR(deep_h, -1)
|
| - AVL_SET_BALANCE_FACTOR(old_h, 0)
|
| - }
|
| -
|
| - AVL_SET_BALANCE_FACTOR(bal_h, 0)
|
| - }
|
| - else
|
| - {
|
| - AVL_SET_BALANCE_FACTOR(old_h, 0)
|
| - AVL_SET_BALANCE_FACTOR(deep_h, 0)
|
| - }
|
| + if (bf != 0) {
|
| + if (bf < 0) {
|
| + AVL_SET_BALANCE_FACTOR(old_h, 1)
|
| + AVL_SET_BALANCE_FACTOR(deep_h, 0)
|
| + } else {
|
| + AVL_SET_BALANCE_FACTOR(deep_h, -1)
|
| + AVL_SET_BALANCE_FACTOR(old_h, 0)
|
| }
|
| - else
|
| - {
|
| - AVL_SET_LESS(bal_h, AVL_GET_GREATER(deep_h, 0))
|
| - AVL_SET_GREATER(deep_h, bal_h)
|
|
|
| - if (AVL_GET_BALANCE_FACTOR(deep_h) == 0)
|
| - {
|
| - AVL_SET_BALANCE_FACTOR(deep_h, 1)
|
| - AVL_SET_BALANCE_FACTOR(bal_h, -1)
|
| - }
|
| - else
|
| - {
|
| - AVL_SET_BALANCE_FACTOR(deep_h, 0)
|
| - AVL_SET_BALANCE_FACTOR(bal_h, 0)
|
| - }
|
| + AVL_SET_BALANCE_FACTOR(bal_h, 0)
|
| + } else {
|
| + AVL_SET_BALANCE_FACTOR(old_h, 0)
|
| + AVL_SET_BALANCE_FACTOR(deep_h, 0)
|
| + }
|
| + } else {
|
| + AVL_SET_LESS(bal_h, AVL_GET_GREATER(deep_h, 0))
|
| + AVL_SET_GREATER(deep_h, bal_h)
|
|
|
| - bal_h = deep_h;
|
| - }
|
| + if (AVL_GET_BALANCE_FACTOR(deep_h) == 0) {
|
| + AVL_SET_BALANCE_FACTOR(deep_h, 1)
|
| + AVL_SET_BALANCE_FACTOR(bal_h, -1)
|
| + } else {
|
| + AVL_SET_BALANCE_FACTOR(deep_h, 0)
|
| + AVL_SET_BALANCE_FACTOR(bal_h, 0)
|
| + }
|
| +
|
| + bal_h = deep_h;
|
| }
|
| + }
|
|
|
| - return(bal_h);
|
| + return(bal_h);
|
| }
|
|
|
| -L_SC AVL_HANDLE L_(insert)(L_(avl) *l_tree, AVL_HANDLE h)
|
| -{
|
| - AVL_SET_LESS(h, AVL_NULL)
|
| - AVL_SET_GREATER(h, AVL_NULL)
|
| - AVL_SET_BALANCE_FACTOR(h, 0)
|
| +L_SC AVL_HANDLE L_(insert)(L_(avl) *l_tree, AVL_HANDLE h) {
|
| + AVL_SET_LESS(h, AVL_NULL)
|
| + AVL_SET_GREATER(h, AVL_NULL)
|
| + AVL_SET_BALANCE_FACTOR(h, 0)
|
|
|
| - if (l_tree->root == AVL_NULL)
|
| - l_tree->root = h;
|
| - else
|
| - {
|
| - /* Last unbalanced node encountered in search for insertion point. */
|
| - AVL_HANDLE unbal = AVL_NULL;
|
| - /* Parent of last unbalanced node. */
|
| - AVL_HANDLE parent_unbal = AVL_NULL;
|
| - /* Balance factor of last unbalanced node. */
|
| - int unbal_bf;
|
| + if (l_tree->root == AVL_NULL)
|
| + l_tree->root = h;
|
| + else {
|
| + /* Last unbalanced node encountered in search for insertion point. */
|
| + AVL_HANDLE unbal = AVL_NULL;
|
| + /* Parent of last unbalanced node. */
|
| + AVL_HANDLE parent_unbal = AVL_NULL;
|
| + /* Balance factor of last unbalanced node. */
|
| + int unbal_bf;
|
|
|
| - /* Zero-based depth in tree. */
|
| - unsigned depth = 0, unbal_depth = 0;
|
| + /* Zero-based depth in tree. */
|
| + unsigned depth = 0, unbal_depth = 0;
|
|
|
| - /* Records a path into the tree. If bit n is true, indicates
|
| - ** take greater branch from the nth node in the path, otherwise
|
| - ** take the less branch. bit 0 gives branch from root, and
|
| - ** so on. */
|
| - L_BIT_ARR_DEFN(branch)
|
| + /* Records a path into the tree. If bit n is true, indicates
|
| + ** take greater branch from the nth node in the path, otherwise
|
| + ** take the less branch. bit 0 gives branch from root, and
|
| + ** so on. */
|
| + L_BIT_ARR_DEFN(branch)
|
|
|
| - AVL_HANDLE hh = l_tree->root;
|
| - AVL_HANDLE parent = AVL_NULL;
|
| - int cmp;
|
| + AVL_HANDLE hh = l_tree->root;
|
| + AVL_HANDLE parent = AVL_NULL;
|
| + int cmp;
|
|
|
| - do
|
| - {
|
| - if (AVL_GET_BALANCE_FACTOR(hh) != 0)
|
| - {
|
| - unbal = hh;
|
| - parent_unbal = parent;
|
| - unbal_depth = depth;
|
| - }
|
| + do {
|
| + if (AVL_GET_BALANCE_FACTOR(hh) != 0) {
|
| + unbal = hh;
|
| + parent_unbal = parent;
|
| + unbal_depth = depth;
|
| + }
|
|
|
| - cmp = AVL_COMPARE_NODE_NODE(h, hh);
|
| + cmp = AVL_COMPARE_NODE_NODE(h, hh);
|
|
|
| - if (cmp == 0)
|
| - /* Duplicate key. */
|
| - return(hh);
|
| + if (cmp == 0)
|
| + /* Duplicate key. */
|
| + return(hh);
|
|
|
| - parent = hh;
|
| + parent = hh;
|
|
|
| - if (cmp > 0)
|
| - {
|
| - hh = AVL_GET_GREATER(hh, 1);
|
| - L_BIT_ARR_1(branch, depth)
|
| - }
|
| - else
|
| - {
|
| - hh = AVL_GET_LESS(hh, 1);
|
| - L_BIT_ARR_0(branch, depth)
|
| - }
|
| + if (cmp > 0) {
|
| + hh = AVL_GET_GREATER(hh, 1);
|
| + L_BIT_ARR_1(branch, depth)
|
| + } else {
|
| + hh = AVL_GET_LESS(hh, 1);
|
| + L_BIT_ARR_0(branch, depth)
|
| + }
|
|
|
| - L_CHECK_READ_ERROR(AVL_NULL)
|
| - depth++;
|
| - }
|
| - while (hh != AVL_NULL);
|
| + L_CHECK_READ_ERROR(AVL_NULL)
|
| + depth++;
|
| + } while (hh != AVL_NULL);
|
|
|
| - /* Add node to insert as leaf of tree. */
|
| - if (cmp < 0)
|
| - AVL_SET_LESS(parent, h)
|
| - else
|
| - AVL_SET_GREATER(parent, h)
|
| + /* Add node to insert as leaf of tree. */
|
| + if (cmp < 0)
|
| + AVL_SET_LESS(parent, h)
|
| + else
|
| + AVL_SET_GREATER(parent, h)
|
|
|
| - depth = unbal_depth;
|
| + depth = unbal_depth;
|
|
|
| - if (unbal == AVL_NULL)
|
| - hh = l_tree->root;
|
| - else
|
| - {
|
| - cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
|
| - depth++;
|
| - unbal_bf = AVL_GET_BALANCE_FACTOR(unbal);
|
| + if (unbal == AVL_NULL)
|
| + hh = l_tree->root;
|
| + else {
|
| + cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
|
| + depth++;
|
| + unbal_bf = AVL_GET_BALANCE_FACTOR(unbal);
|
|
|
| - if (cmp < 0)
|
| - unbal_bf--;
|
| - else /* cmp > 0 */
|
| - unbal_bf++;
|
| + if (cmp < 0)
|
| + unbal_bf--;
|
| + else /* cmp > 0 */
|
| + unbal_bf++;
|
|
|
| - hh = cmp < 0 ? AVL_GET_LESS(unbal, 1) : AVL_GET_GREATER(unbal, 1);
|
| - L_CHECK_READ_ERROR(AVL_NULL)
|
| + hh = cmp < 0 ? AVL_GET_LESS(unbal, 1) : AVL_GET_GREATER(unbal, 1);
|
| + L_CHECK_READ_ERROR(AVL_NULL)
|
|
|
| - if ((unbal_bf != -2) && (unbal_bf != 2))
|
| - {
|
| - /* No rebalancing of tree is necessary. */
|
| - AVL_SET_BALANCE_FACTOR(unbal, unbal_bf)
|
| - unbal = AVL_NULL;
|
| - }
|
| - }
|
| + if ((unbal_bf != -2) && (unbal_bf != 2)) {
|
| + /* No rebalancing of tree is necessary. */
|
| + AVL_SET_BALANCE_FACTOR(unbal, unbal_bf)
|
| + unbal = AVL_NULL;
|
| + }
|
| + }
|
|
|
| - if (hh != AVL_NULL)
|
| - while (h != hh)
|
| - {
|
| - cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
|
| - depth++;
|
| + if (hh != AVL_NULL)
|
| + while (h != hh) {
|
| + cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
|
| + depth++;
|
|
|
| - if (cmp < 0)
|
| - {
|
| - AVL_SET_BALANCE_FACTOR(hh, -1)
|
| - hh = AVL_GET_LESS(hh, 1);
|
| - }
|
| - else /* cmp > 0 */
|
| - {
|
| - AVL_SET_BALANCE_FACTOR(hh, 1)
|
| - hh = AVL_GET_GREATER(hh, 1);
|
| - }
|
| + if (cmp < 0) {
|
| + AVL_SET_BALANCE_FACTOR(hh, -1)
|
| + hh = AVL_GET_LESS(hh, 1);
|
| + } else { /* cmp > 0 */
|
| + AVL_SET_BALANCE_FACTOR(hh, 1)
|
| + hh = AVL_GET_GREATER(hh, 1);
|
| + }
|
|
|
| - L_CHECK_READ_ERROR(AVL_NULL)
|
| - }
|
| + L_CHECK_READ_ERROR(AVL_NULL)
|
| + }
|
|
|
| - if (unbal != AVL_NULL)
|
| - {
|
| - unbal = L_(balance)(L_BALANCE_PARAM_CALL_PREFIX unbal);
|
| - L_CHECK_READ_ERROR(AVL_NULL)
|
| + if (unbal != AVL_NULL) {
|
| + unbal = L_(balance)(L_BALANCE_PARAM_CALL_PREFIX unbal);
|
| + L_CHECK_READ_ERROR(AVL_NULL)
|
|
|
| - if (parent_unbal == AVL_NULL)
|
| - l_tree->root = unbal;
|
| - else
|
| - {
|
| - depth = unbal_depth - 1;
|
| - cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
|
| + if (parent_unbal == AVL_NULL)
|
| + l_tree->root = unbal;
|
| + else {
|
| + depth = unbal_depth - 1;
|
| + cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
|
|
|
| - if (cmp < 0)
|
| - AVL_SET_LESS(parent_unbal, unbal)
|
| - else /* cmp > 0 */
|
| - AVL_SET_GREATER(parent_unbal, unbal)
|
| - }
|
| - }
|
| -
|
| + if (cmp < 0)
|
| + AVL_SET_LESS(parent_unbal, unbal)
|
| + else /* cmp > 0 */
|
| + AVL_SET_GREATER(parent_unbal, unbal)
|
| + }
|
| }
|
|
|
| - return(h);
|
| + }
|
| +
|
| + return(h);
|
| }
|
|
|
| #endif
|
|
|
| #if (L_IMPL_MASK & AVL_IMPL_SEARCH)
|
|
|
| -L_SC AVL_HANDLE L_(search)(L_(avl) *l_tree, AVL_KEY k, avl_search_type st)
|
| -{
|
| - int cmp, target_cmp;
|
| - AVL_HANDLE match_h = AVL_NULL;
|
| - AVL_HANDLE h = l_tree->root;
|
| +L_SC AVL_HANDLE L_(search)(L_(avl) *l_tree, AVL_KEY k, avl_search_type st) {
|
| + int cmp, target_cmp;
|
| + AVL_HANDLE match_h = AVL_NULL;
|
| + AVL_HANDLE h = l_tree->root;
|
|
|
| - if (st & AVL_LESS)
|
| - target_cmp = 1;
|
| - else if (st & AVL_GREATER)
|
| - target_cmp = -1;
|
| - else
|
| - target_cmp = 0;
|
| + if (st & AVL_LESS)
|
| + target_cmp = 1;
|
| + else if (st & AVL_GREATER)
|
| + target_cmp = -1;
|
| + else
|
| + target_cmp = 0;
|
|
|
| - while (h != AVL_NULL)
|
| - {
|
| - cmp = AVL_COMPARE_KEY_NODE(k, h);
|
| + while (h != AVL_NULL) {
|
| + cmp = AVL_COMPARE_KEY_NODE(k, h);
|
|
|
| - if (cmp == 0)
|
| - {
|
| - if (st & AVL_EQUAL)
|
| - {
|
| - match_h = h;
|
| - break;
|
| - }
|
| + if (cmp == 0) {
|
| + if (st & AVL_EQUAL) {
|
| + match_h = h;
|
| + break;
|
| + }
|
|
|
| - cmp = -target_cmp;
|
| - }
|
| - else if (target_cmp != 0)
|
| - if (!((cmp ^ target_cmp) & L_MASK_HIGH_BIT))
|
| - /* cmp and target_cmp are both positive or both negative. */
|
| - match_h = h;
|
| + cmp = -target_cmp;
|
| + } else if (target_cmp != 0)
|
| + if (!((cmp ^ target_cmp) & L_MASK_HIGH_BIT))
|
| + /* cmp and target_cmp are both positive or both negative. */
|
| + match_h = h;
|
|
|
| - h = cmp < 0 ? AVL_GET_LESS(h, 1) : AVL_GET_GREATER(h, 1);
|
| - L_CHECK_READ_ERROR(AVL_NULL)
|
| - }
|
| + h = cmp < 0 ? AVL_GET_LESS(h, 1) : AVL_GET_GREATER(h, 1);
|
| + L_CHECK_READ_ERROR(AVL_NULL)
|
| + }
|
|
|
| - return(match_h);
|
| + return(match_h);
|
| }
|
|
|
| #endif
|
|
|
| #if (L_IMPL_MASK & AVL_IMPL_SEARCH_LEAST)
|
|
|
| -L_SC AVL_HANDLE L_(search_least)(L_(avl) *l_tree)
|
| -{
|
| - AVL_HANDLE h = l_tree->root;
|
| - AVL_HANDLE parent = AVL_NULL;
|
| +L_SC AVL_HANDLE L_(search_least)(L_(avl) *l_tree) {
|
| + AVL_HANDLE h = l_tree->root;
|
| + AVL_HANDLE parent = AVL_NULL;
|
|
|
| - while (h != AVL_NULL)
|
| - {
|
| - parent = h;
|
| - h = AVL_GET_LESS(h, 1);
|
| - L_CHECK_READ_ERROR(AVL_NULL)
|
| - }
|
| + while (h != AVL_NULL) {
|
| + parent = h;
|
| + h = AVL_GET_LESS(h, 1);
|
| + L_CHECK_READ_ERROR(AVL_NULL)
|
| + }
|
|
|
| - return(parent);
|
| + return(parent);
|
| }
|
|
|
| #endif
|
|
|
| #if (L_IMPL_MASK & AVL_IMPL_SEARCH_GREATEST)
|
|
|
| -L_SC AVL_HANDLE L_(search_greatest)(L_(avl) *l_tree)
|
| -{
|
| - AVL_HANDLE h = l_tree->root;
|
| - AVL_HANDLE parent = AVL_NULL;
|
| +L_SC AVL_HANDLE L_(search_greatest)(L_(avl) *l_tree) {
|
| + AVL_HANDLE h = l_tree->root;
|
| + AVL_HANDLE parent = AVL_NULL;
|
|
|
| - while (h != AVL_NULL)
|
| - {
|
| - parent = h;
|
| - h = AVL_GET_GREATER(h, 1);
|
| - L_CHECK_READ_ERROR(AVL_NULL)
|
| - }
|
| + while (h != AVL_NULL) {
|
| + parent = h;
|
| + h = AVL_GET_GREATER(h, 1);
|
| + L_CHECK_READ_ERROR(AVL_NULL)
|
| + }
|
|
|
| - return(parent);
|
| + return(parent);
|
| }
|
|
|
| #endif
|
| @@ -564,284 +509,253 @@
|
| */
|
| L_SC AVL_HANDLE L_(balance)(L_BALANCE_PARAM_DECL_PREFIX AVL_HANDLE bal_h);
|
|
|
| -L_SC AVL_HANDLE L_(remove)(L_(avl) *l_tree, AVL_KEY k)
|
| -{
|
| - /* Zero-based depth in tree. */
|
| - unsigned depth = 0, rm_depth;
|
| +L_SC AVL_HANDLE L_(remove)(L_(avl) *l_tree, AVL_KEY k) {
|
| + /* Zero-based depth in tree. */
|
| + unsigned depth = 0, rm_depth;
|
|
|
| - /* Records a path into the tree. If bit n is true, indicates
|
| - ** take greater branch from the nth node in the path, otherwise
|
| - ** take the less branch. bit 0 gives branch from root, and
|
| - ** so on. */
|
| - L_BIT_ARR_DEFN(branch)
|
| + /* Records a path into the tree. If bit n is true, indicates
|
| + ** take greater branch from the nth node in the path, otherwise
|
| + ** take the less branch. bit 0 gives branch from root, and
|
| + ** so on. */
|
| + L_BIT_ARR_DEFN(branch)
|
|
|
| - AVL_HANDLE h = l_tree->root;
|
| - AVL_HANDLE parent = AVL_NULL;
|
| - AVL_HANDLE child;
|
| - AVL_HANDLE path;
|
| - int cmp, cmp_shortened_sub_with_path;
|
| - int reduced_depth;
|
| - int bf;
|
| - AVL_HANDLE rm;
|
| - AVL_HANDLE parent_rm;
|
| + AVL_HANDLE h = l_tree->root;
|
| + AVL_HANDLE parent = AVL_NULL;
|
| + AVL_HANDLE child;
|
| + AVL_HANDLE path;
|
| + int cmp, cmp_shortened_sub_with_path;
|
| + int reduced_depth;
|
| + int bf;
|
| + AVL_HANDLE rm;
|
| + AVL_HANDLE parent_rm;
|
|
|
| - for (; ;)
|
| - {
|
| - if (h == AVL_NULL)
|
| - /* No node in tree with given key. */
|
| - return(AVL_NULL);
|
| + for (;;) {
|
| + if (h == AVL_NULL)
|
| + /* No node in tree with given key. */
|
| + return(AVL_NULL);
|
|
|
| - cmp = AVL_COMPARE_KEY_NODE(k, h);
|
| + cmp = AVL_COMPARE_KEY_NODE(k, h);
|
|
|
| - if (cmp == 0)
|
| - /* Found node to remove. */
|
| - break;
|
| + if (cmp == 0)
|
| + /* Found node to remove. */
|
| + break;
|
|
|
| - parent = h;
|
| + parent = h;
|
|
|
| - if (cmp > 0)
|
| - {
|
| - h = AVL_GET_GREATER(h, 1);
|
| - L_BIT_ARR_1(branch, depth)
|
| - }
|
| - else
|
| - {
|
| - h = AVL_GET_LESS(h, 1);
|
| - L_BIT_ARR_0(branch, depth)
|
| - }
|
| -
|
| - L_CHECK_READ_ERROR(AVL_NULL)
|
| - depth++;
|
| - cmp_shortened_sub_with_path = cmp;
|
| + if (cmp > 0) {
|
| + h = AVL_GET_GREATER(h, 1);
|
| + L_BIT_ARR_1(branch, depth)
|
| + } else {
|
| + h = AVL_GET_LESS(h, 1);
|
| + L_BIT_ARR_0(branch, depth)
|
| }
|
|
|
| - rm = h;
|
| - parent_rm = parent;
|
| - rm_depth = depth;
|
| + L_CHECK_READ_ERROR(AVL_NULL)
|
| + depth++;
|
| + cmp_shortened_sub_with_path = cmp;
|
| + }
|
|
|
| - /* If the node to remove is not a leaf node, we need to get a
|
| - ** leaf node, or a node with a single leaf as its child, to put
|
| - ** in the place of the node to remove. We will get the greatest
|
| - ** node in the less subtree (of the node to remove), or the least
|
| - ** node in the greater subtree. We take the leaf node from the
|
| - ** deeper subtree, if there is one. */
|
| + rm = h;
|
| + parent_rm = parent;
|
| + rm_depth = depth;
|
|
|
| - if (AVL_GET_BALANCE_FACTOR(h) < 0)
|
| - {
|
| + /* If the node to remove is not a leaf node, we need to get a
|
| + ** leaf node, or a node with a single leaf as its child, to put
|
| + ** in the place of the node to remove. We will get the greatest
|
| + ** node in the less subtree (of the node to remove), or the least
|
| + ** node in the greater subtree. We take the leaf node from the
|
| + ** deeper subtree, if there is one. */
|
| +
|
| + if (AVL_GET_BALANCE_FACTOR(h) < 0) {
|
| + child = AVL_GET_LESS(h, 1);
|
| + L_BIT_ARR_0(branch, depth)
|
| + cmp = -1;
|
| + } else {
|
| + child = AVL_GET_GREATER(h, 1);
|
| + L_BIT_ARR_1(branch, depth)
|
| + cmp = 1;
|
| + }
|
| +
|
| + L_CHECK_READ_ERROR(AVL_NULL)
|
| + depth++;
|
| +
|
| + if (child != AVL_NULL) {
|
| + cmp = -cmp;
|
| +
|
| + do {
|
| + parent = h;
|
| + h = child;
|
| +
|
| + if (cmp < 0) {
|
| child = AVL_GET_LESS(h, 1);
|
| L_BIT_ARR_0(branch, depth)
|
| - cmp = -1;
|
| - }
|
| - else
|
| - {
|
| + } else {
|
| child = AVL_GET_GREATER(h, 1);
|
| L_BIT_ARR_1(branch, depth)
|
| - cmp = 1;
|
| - }
|
| + }
|
|
|
| - L_CHECK_READ_ERROR(AVL_NULL)
|
| - depth++;
|
| + L_CHECK_READ_ERROR(AVL_NULL)
|
| + depth++;
|
| + } while (child != AVL_NULL);
|
|
|
| - if (child != AVL_NULL)
|
| - {
|
| - cmp = -cmp;
|
| + if (parent == rm)
|
| + /* Only went through do loop once. Deleted node will be replaced
|
| + ** in the tree structure by one of its immediate children. */
|
| + cmp_shortened_sub_with_path = -cmp;
|
| + else
|
| + cmp_shortened_sub_with_path = cmp;
|
|
|
| - do
|
| - {
|
| - parent = h;
|
| - h = child;
|
| + /* Get the handle of the opposite child, which may not be null. */
|
| + child = cmp > 0 ? AVL_GET_LESS(h, 0) : AVL_GET_GREATER(h, 0);
|
| + }
|
|
|
| - if (cmp < 0)
|
| - {
|
| - child = AVL_GET_LESS(h, 1);
|
| - L_BIT_ARR_0(branch, depth)
|
| - }
|
| - else
|
| - {
|
| - child = AVL_GET_GREATER(h, 1);
|
| - L_BIT_ARR_1(branch, depth)
|
| - }
|
| + if (parent == AVL_NULL)
|
| + /* There were only 1 or 2 nodes in this tree. */
|
| + l_tree->root = child;
|
| + else if (cmp_shortened_sub_with_path < 0)
|
| + AVL_SET_LESS(parent, child)
|
| + else
|
| + AVL_SET_GREATER(parent, child)
|
|
|
| - L_CHECK_READ_ERROR(AVL_NULL)
|
| - depth++;
|
| - }
|
| - while (child != AVL_NULL);
|
| + /* "path" is the parent of the subtree being eliminated or reduced
|
| + ** from a depth of 2 to 1. If "path" is the node to be removed, we
|
| + ** set path to the node we're about to poke into the position of the
|
| + ** node to be removed. */
|
| + path = parent == rm ? h : parent;
|
|
|
| - if (parent == rm)
|
| - /* Only went through do loop once. Deleted node will be replaced
|
| - ** in the tree structure by one of its immediate children. */
|
| - cmp_shortened_sub_with_path = -cmp;
|
| - else
|
| - cmp_shortened_sub_with_path = cmp;
|
| + if (h != rm) {
|
| + /* Poke in the replacement for the node to be removed. */
|
| + AVL_SET_LESS(h, AVL_GET_LESS(rm, 0))
|
| + AVL_SET_GREATER(h, AVL_GET_GREATER(rm, 0))
|
| + AVL_SET_BALANCE_FACTOR(h, AVL_GET_BALANCE_FACTOR(rm))
|
|
|
| - /* Get the handle of the opposite child, which may not be null. */
|
| - child = cmp > 0 ? AVL_GET_LESS(h, 0) : AVL_GET_GREATER(h, 0);
|
| - }
|
| + if (parent_rm == AVL_NULL)
|
| + l_tree->root = h;
|
| + else {
|
| + depth = rm_depth - 1;
|
|
|
| - if (parent == AVL_NULL)
|
| - /* There were only 1 or 2 nodes in this tree. */
|
| - l_tree->root = child;
|
| - else if (cmp_shortened_sub_with_path < 0)
|
| - AVL_SET_LESS(parent, child)
|
| + if (L_BIT_ARR_VAL(branch, depth))
|
| + AVL_SET_GREATER(parent_rm, h)
|
| else
|
| - AVL_SET_GREATER(parent, child)
|
| + AVL_SET_LESS(parent_rm, h)
|
| + }
|
| + }
|
|
|
| - /* "path" is the parent of the subtree being eliminated or reduced
|
| - ** from a depth of 2 to 1. If "path" is the node to be removed, we
|
| - ** set path to the node we're about to poke into the position of the
|
| - ** node to be removed. */
|
| - path = parent == rm ? h : parent;
|
| + if (path != AVL_NULL) {
|
| + /* Create a temporary linked list from the parent of the path node
|
| + ** to the root node. */
|
| + h = l_tree->root;
|
| + parent = AVL_NULL;
|
| + depth = 0;
|
|
|
| - if (h != rm)
|
| - {
|
| - /* Poke in the replacement for the node to be removed. */
|
| - AVL_SET_LESS(h, AVL_GET_LESS(rm, 0))
|
| - AVL_SET_GREATER(h, AVL_GET_GREATER(rm, 0))
|
| - AVL_SET_BALANCE_FACTOR(h, AVL_GET_BALANCE_FACTOR(rm))
|
| + while (h != path) {
|
| + if (L_BIT_ARR_VAL(branch, depth)) {
|
| + child = AVL_GET_GREATER(h, 1);
|
| + AVL_SET_GREATER(h, parent)
|
| + } else {
|
| + child = AVL_GET_LESS(h, 1);
|
| + AVL_SET_LESS(h, parent)
|
| + }
|
|
|
| - if (parent_rm == AVL_NULL)
|
| - l_tree->root = h;
|
| - else
|
| - {
|
| - depth = rm_depth - 1;
|
| -
|
| - if (L_BIT_ARR_VAL(branch, depth))
|
| - AVL_SET_GREATER(parent_rm, h)
|
| - else
|
| - AVL_SET_LESS(parent_rm, h)
|
| - }
|
| + L_CHECK_READ_ERROR(AVL_NULL)
|
| + depth++;
|
| + parent = h;
|
| + h = child;
|
| }
|
|
|
| - if (path != AVL_NULL)
|
| - {
|
| - /* Create a temporary linked list from the parent of the path node
|
| - ** to the root node. */
|
| - h = l_tree->root;
|
| - parent = AVL_NULL;
|
| - depth = 0;
|
| + /* Climb from the path node to the root node using the linked
|
| + ** list, restoring the tree structure and rebalancing as necessary.
|
| + */
|
| + reduced_depth = 1;
|
| + cmp = cmp_shortened_sub_with_path;
|
|
|
| - while (h != path)
|
| - {
|
| - if (L_BIT_ARR_VAL(branch, depth))
|
| - {
|
| - child = AVL_GET_GREATER(h, 1);
|
| - AVL_SET_GREATER(h, parent)
|
| - }
|
| - else
|
| - {
|
| - child = AVL_GET_LESS(h, 1);
|
| - AVL_SET_LESS(h, parent)
|
| - }
|
| + for (;;) {
|
| + if (reduced_depth) {
|
| + bf = AVL_GET_BALANCE_FACTOR(h);
|
|
|
| - L_CHECK_READ_ERROR(AVL_NULL)
|
| - depth++;
|
| - parent = h;
|
| - h = child;
|
| - }
|
| + if (cmp < 0)
|
| + bf++;
|
| + else /* cmp > 0 */
|
| + bf--;
|
|
|
| - /* Climb from the path node to the root node using the linked
|
| - ** list, restoring the tree structure and rebalancing as necessary.
|
| - */
|
| - reduced_depth = 1;
|
| - cmp = cmp_shortened_sub_with_path;
|
| + if ((bf == -2) || (bf == 2)) {
|
| + h = L_(balance)(L_BALANCE_PARAM_CALL_PREFIX h);
|
| + L_CHECK_READ_ERROR(AVL_NULL)
|
| + bf = AVL_GET_BALANCE_FACTOR(h);
|
| + } else
|
| + AVL_SET_BALANCE_FACTOR(h, bf)
|
| + reduced_depth = (bf == 0);
|
| + }
|
|
|
| - for (; ;)
|
| - {
|
| - if (reduced_depth)
|
| - {
|
| - bf = AVL_GET_BALANCE_FACTOR(h);
|
| + if (parent == AVL_NULL)
|
| + break;
|
|
|
| - if (cmp < 0)
|
| - bf++;
|
| - else /* cmp > 0 */
|
| - bf--;
|
| + child = h;
|
| + h = parent;
|
| + depth--;
|
| + cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
|
|
|
| - if ((bf == -2) || (bf == 2))
|
| - {
|
| - h = L_(balance)(L_BALANCE_PARAM_CALL_PREFIX h);
|
| - L_CHECK_READ_ERROR(AVL_NULL)
|
| - bf = AVL_GET_BALANCE_FACTOR(h);
|
| - }
|
| - else
|
| - AVL_SET_BALANCE_FACTOR(h, bf)
|
| - reduced_depth = (bf == 0);
|
| - }
|
| + if (cmp < 0) {
|
| + parent = AVL_GET_LESS(h, 1);
|
| + AVL_SET_LESS(h, child)
|
| + } else {
|
| + parent = AVL_GET_GREATER(h, 1);
|
| + AVL_SET_GREATER(h, child)
|
| + }
|
|
|
| - if (parent == AVL_NULL)
|
| - break;
|
| -
|
| - child = h;
|
| - h = parent;
|
| - depth--;
|
| - cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
|
| -
|
| - if (cmp < 0)
|
| - {
|
| - parent = AVL_GET_LESS(h, 1);
|
| - AVL_SET_LESS(h, child)
|
| - }
|
| - else
|
| - {
|
| - parent = AVL_GET_GREATER(h, 1);
|
| - AVL_SET_GREATER(h, child)
|
| - }
|
| -
|
| - L_CHECK_READ_ERROR(AVL_NULL)
|
| - }
|
| -
|
| - l_tree->root = h;
|
| + L_CHECK_READ_ERROR(AVL_NULL)
|
| }
|
|
|
| - return(rm);
|
| + l_tree->root = h;
|
| + }
|
| +
|
| + return(rm);
|
| }
|
|
|
| #endif
|
|
|
| #if (L_IMPL_MASK & AVL_IMPL_SUBST)
|
|
|
| -L_SC AVL_HANDLE L_(subst)(L_(avl) *l_tree, AVL_HANDLE new_node)
|
| -{
|
| - AVL_HANDLE h = l_tree->root;
|
| - AVL_HANDLE parent = AVL_NULL;
|
| - int cmp, last_cmp;
|
| +L_SC AVL_HANDLE L_(subst)(L_(avl) *l_tree, AVL_HANDLE new_node) {
|
| + AVL_HANDLE h = l_tree->root;
|
| + AVL_HANDLE parent = AVL_NULL;
|
| + int cmp, last_cmp;
|
|
|
| - /* Search for node already in tree with same key. */
|
| - for (; ;)
|
| - {
|
| - if (h == AVL_NULL)
|
| - /* No node in tree with same key as new node. */
|
| - return(AVL_NULL);
|
| + /* Search for node already in tree with same key. */
|
| + for (;;) {
|
| + if (h == AVL_NULL)
|
| + /* No node in tree with same key as new node. */
|
| + return(AVL_NULL);
|
|
|
| - cmp = AVL_COMPARE_NODE_NODE(new_node, h);
|
| + cmp = AVL_COMPARE_NODE_NODE(new_node, h);
|
|
|
| - if (cmp == 0)
|
| - /* Found the node to substitute new one for. */
|
| - break;
|
| + if (cmp == 0)
|
| + /* Found the node to substitute new one for. */
|
| + break;
|
|
|
| - last_cmp = cmp;
|
| - parent = h;
|
| - h = cmp < 0 ? AVL_GET_LESS(h, 1) : AVL_GET_GREATER(h, 1);
|
| - L_CHECK_READ_ERROR(AVL_NULL)
|
| - }
|
| + last_cmp = cmp;
|
| + parent = h;
|
| + h = cmp < 0 ? AVL_GET_LESS(h, 1) : AVL_GET_GREATER(h, 1);
|
| + L_CHECK_READ_ERROR(AVL_NULL)
|
| + }
|
|
|
| - /* Copy tree housekeeping fields from node in tree to new node. */
|
| - AVL_SET_LESS(new_node, AVL_GET_LESS(h, 0))
|
| - AVL_SET_GREATER(new_node, AVL_GET_GREATER(h, 0))
|
| - AVL_SET_BALANCE_FACTOR(new_node, AVL_GET_BALANCE_FACTOR(h))
|
| + /* Copy tree housekeeping fields from node in tree to new node. */
|
| + AVL_SET_LESS(new_node, AVL_GET_LESS(h, 0))
|
| + AVL_SET_GREATER(new_node, AVL_GET_GREATER(h, 0))
|
| + AVL_SET_BALANCE_FACTOR(new_node, AVL_GET_BALANCE_FACTOR(h))
|
|
|
| - if (parent == AVL_NULL)
|
| - /* New node is also new root. */
|
| - l_tree->root = new_node;
|
| - else
|
| - {
|
| - /* Make parent point to new node. */
|
| - if (last_cmp < 0)
|
| - AVL_SET_LESS(parent, new_node)
|
| - else
|
| - AVL_SET_GREATER(parent, new_node)
|
| - }
|
| + if (parent == AVL_NULL)
|
| + /* New node is also new root. */
|
| + l_tree->root = new_node;
|
| + else {
|
| + /* Make parent point to new node. */
|
| + if (last_cmp < 0)
|
| + AVL_SET_LESS(parent, new_node)
|
| + else
|
| + AVL_SET_GREATER(parent, new_node)
|
| + }
|
|
|
| - return(h);
|
| + return(h);
|
| }
|
|
|
| #endif
|
| @@ -851,144 +765,136 @@
|
| #if (L_IMPL_MASK & AVL_IMPL_BUILD)
|
|
|
| L_SC int L_(build)(
|
| - L_(avl) *l_tree, AVL_BUILD_ITER_TYPE p, L_SIZE num_nodes)
|
| -{
|
| - /* Gives path to subtree being built. If bit n is false, branch
|
| - ** less from the node at depth n, if true branch greater. */
|
| - L_BIT_ARR_DEFN(branch)
|
| + L_(avl) *l_tree, AVL_BUILD_ITER_TYPE p, L_SIZE num_nodes) {
|
| + /* Gives path to subtree being built. If bit n is false, branch
|
| + ** less from the node at depth n, if true branch greater. */
|
| + L_BIT_ARR_DEFN(branch)
|
|
|
| - /* If bit n is true, then for the current subtree at depth n, its
|
| - ** greater subtree has one more node than its less subtree. */
|
| - L_BIT_ARR_DEFN(rem)
|
| + /* If bit n is true, then for the current subtree at depth n, its
|
| + ** greater subtree has one more node than its less subtree. */
|
| + L_BIT_ARR_DEFN(rem)
|
|
|
| - /* Depth of root node of current subtree. */
|
| - unsigned depth = 0;
|
| + /* Depth of root node of current subtree. */
|
| + unsigned depth = 0;
|
|
|
| - /* Number of nodes in current subtree. */
|
| - L_SIZE num_sub = num_nodes;
|
| + /* Number of nodes in current subtree. */
|
| + L_SIZE num_sub = num_nodes;
|
|
|
| - /* The algorithm relies on a stack of nodes whose less subtree has
|
| - ** been built, but whose greater subtree has not yet been built.
|
| - ** The stack is implemented as linked list. The nodes are linked
|
| - ** together by having the "greater" handle of a node set to the
|
| - ** next node in the list. "less_parent" is the handle of the first
|
| - ** node in the list. */
|
| - AVL_HANDLE less_parent = AVL_NULL;
|
| + /* The algorithm relies on a stack of nodes whose less subtree has
|
| + ** been built, but whose greater subtree has not yet been built.
|
| + ** The stack is implemented as linked list. The nodes are linked
|
| + ** together by having the "greater" handle of a node set to the
|
| + ** next node in the list. "less_parent" is the handle of the first
|
| + ** node in the list. */
|
| + AVL_HANDLE less_parent = AVL_NULL;
|
|
|
| - /* h is root of current subtree, child is one of its children. */
|
| - AVL_HANDLE h;
|
| - AVL_HANDLE child;
|
| + /* h is root of current subtree, child is one of its children. */
|
| + AVL_HANDLE h;
|
| + AVL_HANDLE child;
|
|
|
| - if (num_nodes == 0)
|
| - {
|
| - l_tree->root = AVL_NULL;
|
| - return(1);
|
| - }
|
| + if (num_nodes == 0) {
|
| + l_tree->root = AVL_NULL;
|
| + return(1);
|
| + }
|
|
|
| - for (; ;)
|
| - {
|
| - while (num_sub > 2)
|
| - {
|
| - /* Subtract one for root of subtree. */
|
| - num_sub--;
|
| + for (;;) {
|
| + while (num_sub > 2) {
|
| + /* Subtract one for root of subtree. */
|
| + num_sub--;
|
|
|
| - if (num_sub & 1)
|
| - L_BIT_ARR_1(rem, depth)
|
| - else
|
| - L_BIT_ARR_0(rem, depth)
|
| - L_BIT_ARR_0(branch, depth)
|
| - depth++;
|
| + if (num_sub & 1)
|
| + L_BIT_ARR_1(rem, depth)
|
| + else
|
| + L_BIT_ARR_0(rem, depth)
|
| + L_BIT_ARR_0(branch, depth)
|
| + depth++;
|
|
|
| - num_sub >>= 1;
|
| - }
|
| + num_sub >>= 1;
|
| + }
|
|
|
| - if (num_sub == 2)
|
| - {
|
| - /* Build a subtree with two nodes, slanting to greater.
|
| - ** I arbitrarily chose to always have the extra node in the
|
| - ** greater subtree when there is an odd number of nodes to
|
| - ** split between the two subtrees. */
|
| + if (num_sub == 2) {
|
| + /* Build a subtree with two nodes, slanting to greater.
|
| + ** I arbitrarily chose to always have the extra node in the
|
| + ** greater subtree when there is an odd number of nodes to
|
| + ** split between the two subtrees. */
|
|
|
| - h = AVL_BUILD_ITER_VAL(p);
|
| - L_CHECK_READ_ERROR(0)
|
| - AVL_BUILD_ITER_INCR(p)
|
| - child = AVL_BUILD_ITER_VAL(p);
|
| - L_CHECK_READ_ERROR(0)
|
| - AVL_BUILD_ITER_INCR(p)
|
| - AVL_SET_LESS(child, AVL_NULL)
|
| - AVL_SET_GREATER(child, AVL_NULL)
|
| - AVL_SET_BALANCE_FACTOR(child, 0)
|
| - AVL_SET_GREATER(h, child)
|
| - AVL_SET_LESS(h, AVL_NULL)
|
| - AVL_SET_BALANCE_FACTOR(h, 1)
|
| - }
|
| - else /* num_sub == 1 */
|
| - {
|
| - /* Build a subtree with one node. */
|
| + h = AVL_BUILD_ITER_VAL(p);
|
| + L_CHECK_READ_ERROR(0)
|
| + AVL_BUILD_ITER_INCR(p)
|
| + child = AVL_BUILD_ITER_VAL(p);
|
| + L_CHECK_READ_ERROR(0)
|
| + AVL_BUILD_ITER_INCR(p)
|
| + AVL_SET_LESS(child, AVL_NULL)
|
| + AVL_SET_GREATER(child, AVL_NULL)
|
| + AVL_SET_BALANCE_FACTOR(child, 0)
|
| + AVL_SET_GREATER(h, child)
|
| + AVL_SET_LESS(h, AVL_NULL)
|
| + AVL_SET_BALANCE_FACTOR(h, 1)
|
| + } else { /* num_sub == 1 */
|
| + /* Build a subtree with one node. */
|
|
|
| - h = AVL_BUILD_ITER_VAL(p);
|
| - L_CHECK_READ_ERROR(0)
|
| - AVL_BUILD_ITER_INCR(p)
|
| - AVL_SET_LESS(h, AVL_NULL)
|
| - AVL_SET_GREATER(h, AVL_NULL)
|
| - AVL_SET_BALANCE_FACTOR(h, 0)
|
| - }
|
| + h = AVL_BUILD_ITER_VAL(p);
|
| + L_CHECK_READ_ERROR(0)
|
| + AVL_BUILD_ITER_INCR(p)
|
| + AVL_SET_LESS(h, AVL_NULL)
|
| + AVL_SET_GREATER(h, AVL_NULL)
|
| + AVL_SET_BALANCE_FACTOR(h, 0)
|
| + }
|
|
|
| - while (depth)
|
| - {
|
| - depth--;
|
| + while (depth) {
|
| + depth--;
|
|
|
| - if (!L_BIT_ARR_VAL(branch, depth))
|
| - /* We've completed a less subtree. */
|
| - break;
|
| + if (!L_BIT_ARR_VAL(branch, depth))
|
| + /* We've completed a less subtree. */
|
| + break;
|
|
|
| - /* We've completed a greater subtree, so attach it to
|
| - ** its parent (that is less than it). We pop the parent
|
| - ** off the stack of less parents. */
|
| - child = h;
|
| - h = less_parent;
|
| - less_parent = AVL_GET_GREATER(h, 1);
|
| - L_CHECK_READ_ERROR(0)
|
| - AVL_SET_GREATER(h, child)
|
| - /* num_sub = 2 * (num_sub - rem[depth]) + rem[depth] + 1 */
|
| - num_sub <<= 1;
|
| - num_sub += L_BIT_ARR_VAL(rem, depth) ? 0 : 1;
|
| + /* We've completed a greater subtree, so attach it to
|
| + ** its parent (that is less than it). We pop the parent
|
| + ** off the stack of less parents. */
|
| + child = h;
|
| + h = less_parent;
|
| + less_parent = AVL_GET_GREATER(h, 1);
|
| + L_CHECK_READ_ERROR(0)
|
| + AVL_SET_GREATER(h, child)
|
| + /* num_sub = 2 * (num_sub - rem[depth]) + rem[depth] + 1 */
|
| + num_sub <<= 1;
|
| + num_sub += L_BIT_ARR_VAL(rem, depth) ? 0 : 1;
|
|
|
| - if (num_sub & (num_sub - 1))
|
| - /* num_sub is not a power of 2. */
|
| - AVL_SET_BALANCE_FACTOR(h, 0)
|
| - else
|
| - /* num_sub is a power of 2. */
|
| - AVL_SET_BALANCE_FACTOR(h, 1)
|
| - }
|
| + if (num_sub & (num_sub - 1))
|
| + /* num_sub is not a power of 2. */
|
| + AVL_SET_BALANCE_FACTOR(h, 0)
|
| + else
|
| + /* num_sub is a power of 2. */
|
| + AVL_SET_BALANCE_FACTOR(h, 1)
|
| + }
|
|
|
| - if (num_sub == num_nodes)
|
| - /* We've completed the full tree. */
|
| - break;
|
| + if (num_sub == num_nodes)
|
| + /* We've completed the full tree. */
|
| + break;
|
|
|
| - /* The subtree we've completed is the less subtree of the
|
| - ** next node in the sequence. */
|
| + /* The subtree we've completed is the less subtree of the
|
| + ** next node in the sequence. */
|
|
|
| - child = h;
|
| - h = AVL_BUILD_ITER_VAL(p);
|
| - L_CHECK_READ_ERROR(0)
|
| - AVL_BUILD_ITER_INCR(p)
|
| - AVL_SET_LESS(h, child)
|
| + child = h;
|
| + h = AVL_BUILD_ITER_VAL(p);
|
| + L_CHECK_READ_ERROR(0)
|
| + AVL_BUILD_ITER_INCR(p)
|
| + AVL_SET_LESS(h, child)
|
|
|
| - /* Put h into stack of less parents. */
|
| - AVL_SET_GREATER(h, less_parent)
|
| - less_parent = h;
|
| + /* Put h into stack of less parents. */
|
| + AVL_SET_GREATER(h, less_parent)
|
| + less_parent = h;
|
|
|
| - /* Proceed to creating greater than subtree of h. */
|
| - L_BIT_ARR_1(branch, depth)
|
| - num_sub += L_BIT_ARR_VAL(rem, depth) ? 1 : 0;
|
| - depth++;
|
| + /* Proceed to creating greater than subtree of h. */
|
| + L_BIT_ARR_1(branch, depth)
|
| + num_sub += L_BIT_ARR_VAL(rem, depth) ? 1 : 0;
|
| + depth++;
|
|
|
| - } /* end for ( ; ; ) */
|
| + } /* end for (;; ) */
|
|
|
| - l_tree->root = h;
|
| + l_tree->root = h;
|
|
|
| - return(1);
|
| + return(1);
|
| }
|
|
|
| #endif
|
| @@ -1001,9 +907,8 @@
|
| ** invalid. (Depth is zero-base.) It's not necessary to initialize
|
| ** iterators prior to passing them to the "start" function.
|
| */
|
| -L_SC void L_(init_iter)(L_(iter) *iter)
|
| -{
|
| - iter->depth = ~0;
|
| +L_SC void L_(init_iter)(L_(iter) *iter) {
|
| + iter->depth = ~0;
|
| }
|
|
|
| #endif
|
| @@ -1011,7 +916,7 @@
|
| #ifdef AVL_READ_ERRORS_HAPPEN
|
|
|
| #define L_CHECK_READ_ERROR_INV_DEPTH \
|
| - { if (AVL_READ_ERROR) { iter->depth = ~0; return; } }
|
| + { if (AVL_READ_ERROR) { iter->depth = ~0; return; } }
|
|
|
| #else
|
|
|
| @@ -1022,174 +927,157 @@
|
| #if (L_IMPL_MASK & AVL_IMPL_START_ITER)
|
|
|
| L_SC void L_(start_iter)(
|
| - L_(avl) *l_tree, L_(iter) *iter, AVL_KEY k, avl_search_type st)
|
| -{
|
| - AVL_HANDLE h = l_tree->root;
|
| - unsigned d = 0;
|
| - int cmp, target_cmp;
|
| + L_(avl) *l_tree, L_(iter) *iter, AVL_KEY k, avl_search_type st) {
|
| + AVL_HANDLE h = l_tree->root;
|
| + unsigned d = 0;
|
| + int cmp, target_cmp;
|
|
|
| - /* Save the tree that we're going to iterate through in a
|
| - ** member variable. */
|
| - iter->tree_ = l_tree;
|
| + /* Save the tree that we're going to iterate through in a
|
| + ** member variable. */
|
| + iter->tree_ = l_tree;
|
|
|
| - iter->depth = ~0;
|
| + iter->depth = ~0;
|
|
|
| - if (h == AVL_NULL)
|
| - /* Tree is empty. */
|
| - return;
|
| + if (h == AVL_NULL)
|
| + /* Tree is empty. */
|
| + return;
|
|
|
| - if (st & AVL_LESS)
|
| - /* Key can be greater than key of starting node. */
|
| - target_cmp = 1;
|
| - else if (st & AVL_GREATER)
|
| - /* Key can be less than key of starting node. */
|
| - target_cmp = -1;
|
| - else
|
| - /* Key must be same as key of starting node. */
|
| - target_cmp = 0;
|
| + if (st & AVL_LESS)
|
| + /* Key can be greater than key of starting node. */
|
| + target_cmp = 1;
|
| + else if (st & AVL_GREATER)
|
| + /* Key can be less than key of starting node. */
|
| + target_cmp = -1;
|
| + else
|
| + /* Key must be same as key of starting node. */
|
| + target_cmp = 0;
|
|
|
| - for (; ;)
|
| - {
|
| - cmp = AVL_COMPARE_KEY_NODE(k, h);
|
| + for (;;) {
|
| + cmp = AVL_COMPARE_KEY_NODE(k, h);
|
|
|
| - if (cmp == 0)
|
| - {
|
| - if (st & AVL_EQUAL)
|
| - {
|
| - /* Equal node was sought and found as starting node. */
|
| - iter->depth = d;
|
| - break;
|
| - }
|
| + if (cmp == 0) {
|
| + if (st & AVL_EQUAL) {
|
| + /* Equal node was sought and found as starting node. */
|
| + iter->depth = d;
|
| + break;
|
| + }
|
|
|
| - cmp = -target_cmp;
|
| - }
|
| - else if (target_cmp != 0)
|
| - if (!((cmp ^ target_cmp) & L_MASK_HIGH_BIT))
|
| - /* cmp and target_cmp are both negative or both positive. */
|
| - iter->depth = d;
|
| + cmp = -target_cmp;
|
| + } else if (target_cmp != 0)
|
| + if (!((cmp ^ target_cmp) & L_MASK_HIGH_BIT))
|
| + /* cmp and target_cmp are both negative or both positive. */
|
| + iter->depth = d;
|
|
|
| - h = cmp < 0 ? AVL_GET_LESS(h, 1) : AVL_GET_GREATER(h, 1);
|
| - L_CHECK_READ_ERROR_INV_DEPTH
|
| + h = cmp < 0 ? AVL_GET_LESS(h, 1) : AVL_GET_GREATER(h, 1);
|
| + L_CHECK_READ_ERROR_INV_DEPTH
|
|
|
| - if (h == AVL_NULL)
|
| - break;
|
| + if (h == AVL_NULL)
|
| + break;
|
|
|
| - if (cmp > 0)
|
| - L_BIT_ARR_1(iter->branch, d)
|
| - else
|
| - L_BIT_ARR_0(iter->branch, d)
|
| - iter->path_h[d++] = h;
|
| - }
|
| + if (cmp > 0)
|
| + L_BIT_ARR_1(iter->branch, d)
|
| + else
|
| + L_BIT_ARR_0(iter->branch, d)
|
| + iter->path_h[d++] = h;
|
| + }
|
| }
|
|
|
| #endif
|
|
|
| #if (L_IMPL_MASK & AVL_IMPL_START_ITER_LEAST)
|
|
|
| -L_SC void L_(start_iter_least)(L_(avl) *l_tree, L_(iter) *iter)
|
| -{
|
| - AVL_HANDLE h = l_tree->root;
|
| +L_SC void L_(start_iter_least)(L_(avl) *l_tree, L_(iter) *iter) {
|
| + AVL_HANDLE h = l_tree->root;
|
|
|
| - iter->tree_ = l_tree;
|
| + iter->tree_ = l_tree;
|
|
|
| - iter->depth = ~0;
|
| + iter->depth = ~0;
|
|
|
| - L_BIT_ARR_ALL(iter->branch, 0)
|
| + L_BIT_ARR_ALL(iter->branch, 0)
|
|
|
| - while (h != AVL_NULL)
|
| - {
|
| - if (iter->depth != ~0)
|
| - iter->path_h[iter->depth] = h;
|
| + while (h != AVL_NULL) {
|
| + if (iter->depth != ~0)
|
| + iter->path_h[iter->depth] = h;
|
|
|
| - iter->depth++;
|
| - h = AVL_GET_LESS(h, 1);
|
| - L_CHECK_READ_ERROR_INV_DEPTH
|
| - }
|
| + iter->depth++;
|
| + h = AVL_GET_LESS(h, 1);
|
| + L_CHECK_READ_ERROR_INV_DEPTH
|
| + }
|
| }
|
|
|
| #endif
|
|
|
| #if (L_IMPL_MASK & AVL_IMPL_START_ITER_GREATEST)
|
|
|
| -L_SC void L_(start_iter_greatest)(L_(avl) *l_tree, L_(iter) *iter)
|
| -{
|
| - AVL_HANDLE h = l_tree->root;
|
| +L_SC void L_(start_iter_greatest)(L_(avl) *l_tree, L_(iter) *iter) {
|
| + AVL_HANDLE h = l_tree->root;
|
|
|
| - iter->tree_ = l_tree;
|
| + iter->tree_ = l_tree;
|
|
|
| - iter->depth = ~0;
|
| + iter->depth = ~0;
|
|
|
| - L_BIT_ARR_ALL(iter->branch, 1)
|
| + L_BIT_ARR_ALL(iter->branch, 1)
|
|
|
| - while (h != AVL_NULL)
|
| - {
|
| - if (iter->depth != ~0)
|
| - iter->path_h[iter->depth] = h;
|
| + while (h != AVL_NULL) {
|
| + if (iter->depth != ~0)
|
| + iter->path_h[iter->depth] = h;
|
|
|
| - iter->depth++;
|
| - h = AVL_GET_GREATER(h, 1);
|
| - L_CHECK_READ_ERROR_INV_DEPTH
|
| - }
|
| + iter->depth++;
|
| + h = AVL_GET_GREATER(h, 1);
|
| + L_CHECK_READ_ERROR_INV_DEPTH
|
| + }
|
| }
|
|
|
| #endif
|
|
|
| #if (L_IMPL_MASK & AVL_IMPL_GET_ITER)
|
|
|
| -L_SC AVL_HANDLE L_(get_iter)(L_(iter) *iter)
|
| -{
|
| - if (iter->depth == ~0)
|
| - return(AVL_NULL);
|
| +L_SC AVL_HANDLE L_(get_iter)(L_(iter) *iter) {
|
| + if (iter->depth == ~0)
|
| + return(AVL_NULL);
|
|
|
| - return(iter->depth == 0 ?
|
| - iter->tree_->root : iter->path_h[iter->depth - 1]);
|
| + return(iter->depth == 0 ?
|
| + iter->tree_->root : iter->path_h[iter->depth - 1]);
|
| }
|
|
|
| #endif
|
|
|
| #if (L_IMPL_MASK & AVL_IMPL_INCR_ITER)
|
|
|
| -L_SC void L_(incr_iter)(L_(iter) *iter)
|
| -{
|
| +L_SC void L_(incr_iter)(L_(iter) *iter) {
|
| #define l_tree (iter->tree_)
|
|
|
| - if (iter->depth != ~0)
|
| - {
|
| - AVL_HANDLE h =
|
| - AVL_GET_GREATER((iter->depth == 0 ?
|
| - iter->tree_->root : iter->path_h[iter->depth - 1]), 1);
|
| - L_CHECK_READ_ERROR_INV_DEPTH
|
| + if (iter->depth != ~0) {
|
| + AVL_HANDLE h =
|
| + AVL_GET_GREATER((iter->depth == 0 ?
|
| + iter->tree_->root : iter->path_h[iter->depth - 1]), 1);
|
| + L_CHECK_READ_ERROR_INV_DEPTH
|
|
|
| - if (h == AVL_NULL)
|
| - do
|
| - {
|
| - if (iter->depth == 0)
|
| - {
|
| - iter->depth = ~0;
|
| - break;
|
| - }
|
| + if (h == AVL_NULL)
|
| + do {
|
| + if (iter->depth == 0) {
|
| + iter->depth = ~0;
|
| + break;
|
| + }
|
|
|
| - iter->depth--;
|
| - }
|
| - while (L_BIT_ARR_VAL(iter->branch, iter->depth));
|
| - else
|
| - {
|
| - L_BIT_ARR_1(iter->branch, iter->depth)
|
| - iter->path_h[iter->depth++] = h;
|
| + iter->depth--;
|
| + } while (L_BIT_ARR_VAL(iter->branch, iter->depth));
|
| + else {
|
| + L_BIT_ARR_1(iter->branch, iter->depth)
|
| + iter->path_h[iter->depth++] = h;
|
|
|
| - for (; ;)
|
| - {
|
| - h = AVL_GET_LESS(h, 1);
|
| - L_CHECK_READ_ERROR_INV_DEPTH
|
| + for (;;) {
|
| + h = AVL_GET_LESS(h, 1);
|
| + L_CHECK_READ_ERROR_INV_DEPTH
|
|
|
| - if (h == AVL_NULL)
|
| - break;
|
| + if (h == AVL_NULL)
|
| + break;
|
|
|
| - L_BIT_ARR_0(iter->branch, iter->depth)
|
| - iter->path_h[iter->depth++] = h;
|
| - }
|
| - }
|
| + L_BIT_ARR_0(iter->branch, iter->depth)
|
| + iter->path_h[iter->depth++] = h;
|
| + }
|
| }
|
| + }
|
|
|
| #undef l_tree
|
| }
|
| @@ -1198,47 +1086,40 @@
|
|
|
| #if (L_IMPL_MASK & AVL_IMPL_DECR_ITER)
|
|
|
| -L_SC void L_(decr_iter)(L_(iter) *iter)
|
| -{
|
| +L_SC void L_(decr_iter)(L_(iter) *iter) {
|
| #define l_tree (iter->tree_)
|
|
|
| - if (iter->depth != ~0)
|
| - {
|
| - AVL_HANDLE h =
|
| - AVL_GET_LESS((iter->depth == 0 ?
|
| - iter->tree_->root : iter->path_h[iter->depth - 1]), 1);
|
| - L_CHECK_READ_ERROR_INV_DEPTH
|
| + if (iter->depth != ~0) {
|
| + AVL_HANDLE h =
|
| + AVL_GET_LESS((iter->depth == 0 ?
|
| + iter->tree_->root : iter->path_h[iter->depth - 1]), 1);
|
| + L_CHECK_READ_ERROR_INV_DEPTH
|
|
|
| - if (h == AVL_NULL)
|
| - do
|
| - {
|
| - if (iter->depth == 0)
|
| - {
|
| - iter->depth = ~0;
|
| - break;
|
| - }
|
| + if (h == AVL_NULL)
|
| + do {
|
| + if (iter->depth == 0) {
|
| + iter->depth = ~0;
|
| + break;
|
| + }
|
|
|
| - iter->depth--;
|
| - }
|
| - while (!L_BIT_ARR_VAL(iter->branch, iter->depth));
|
| - else
|
| - {
|
| - L_BIT_ARR_0(iter->branch, iter->depth)
|
| - iter->path_h[iter->depth++] = h;
|
| + iter->depth--;
|
| + } while (!L_BIT_ARR_VAL(iter->branch, iter->depth));
|
| + else {
|
| + L_BIT_ARR_0(iter->branch, iter->depth)
|
| + iter->path_h[iter->depth++] = h;
|
|
|
| - for (; ;)
|
| - {
|
| - h = AVL_GET_GREATER(h, 1);
|
| - L_CHECK_READ_ERROR_INV_DEPTH
|
| + for (;;) {
|
| + h = AVL_GET_GREATER(h, 1);
|
| + L_CHECK_READ_ERROR_INV_DEPTH
|
|
|
| - if (h == AVL_NULL)
|
| - break;
|
| + if (h == AVL_NULL)
|
| + break;
|
|
|
| - L_BIT_ARR_1(iter->branch, iter->depth)
|
| - iter->path_h[iter->depth++] = h;
|
| - }
|
| - }
|
| + L_BIT_ARR_1(iter->branch, iter->depth)
|
| + iter->path_h[iter->depth++] = h;
|
| + }
|
| }
|
| + }
|
|
|
| #undef l_tree
|
| }
|
|
|