35 #ifndef RECURSIVE_TREE 36 # define RECURSIVE_TREE 1 57 static bool zeBTree_Destroy_tree(
ZEBTREC_T *);
65 static int zeBTree_Browse_tree(
ZEBT_T *, JBT_BROWSE_T,
ZEBTREC_T *,
void *);
76 static int jlog2(
int);
85 #define JBT_LOCK(mutex) MUTEX_LOCK(mutex) 86 #define JBT_UNLOCK(mutex) MUTEX_UNLOCK(mutex) 88 #define JBT_ZERO(jbth) \ 90 jbth->signature = SIGNATURE; \ 93 jbth->reccmp = NULL; \ 95 jbth->chkCount = FALSE; \ 96 jbth->maxCount = MAX_BTNODES; \ 191 (void) zeBTree_Destroy_tree(jdbh->
root);
201 memset(jdbh, 0,
sizeof (
ZEBT_T));
228 (void) zeBTree_Destroy_tree(jdbh->
root);
287 result = zeBTree_Browse_tree(jdbh, func, jdbh->
root,
data);
317 node = zeBTree_Get_node(jdbh,
data, jdbh->
root);
369 ok = zeBTree_Add_node(jdbh,
data, &(jdbh->
root), &taller);
392 bool shorter =
FALSE;
400 root = zeBTree_Del_node(jdbh,
data, jdbh->
root, &shorter);
410 zeBTree_Destroy_tree(root)
416 zeBTree_Destroy_tree(root->left);
421 zeBTree_Destroy_tree(root->right);
433 zeBTree_Del_node(jdbh,
data, root, shorter)
478 zeBTree_Get_node(jdbh,
data, root)
492 if (root->
data == NULL)
503 return zeBTree_Get_node(jdbh,
data, root->
left);
505 return zeBTree_Get_node(jdbh,
data, root->
right);
515 zeBTree_Browse_tree(jdbh, func, root,
data)
532 if (root->
left != NULL)
533 n += zeBTree_Browse_tree(jdbh, func, root->
left,
data);
538 if (root->
right != NULL)
539 n += zeBTree_Browse_tree(jdbh, func, root->
right,
data);
559 if (dst == NULL || org == NULL)
565 result = zeBTree_Cpy_tree(dst, org->
root, getit, arg);
577 zeBTree_Cpy_tree(jdbh, root, getit, arg)
586 (void) zeBTree_Cpy_tree(jdbh, root->
left, getit, arg);
587 if (root->
data != NULL)
589 if (getit(root->
data, arg))
596 (void) zeBTree_Cpy_tree(jdbh, root->
right, getit, arg);
623 if (zeBTree_Cpy_tree(jdbh, oroot, getit, arg))
624 zeBTree_Destroy_tree(oroot);
635 zeBTree_Rotate_Left(root)
643 if (root->
right == NULL)
659 zeBTree_Rotate_Right(root)
667 if (root->
left == NULL)
683 zeBTree_Right_Balance(root)
695 root = zeBTree_Rotate_Left(root);
718 x = zeBTree_Rotate_Right(x);
720 root = zeBTree_Rotate_Left(root);
732 zeBTree_Left_Balance(root)
744 root = zeBTree_Rotate_Right(root);
768 x = zeBTree_Rotate_Left(x);
770 root = zeBTree_Rotate_Right(root);
783 zeBTree_Node_Alloc(jdbh,
data)
799 if (rec->
data == NULL)
818 zeBTree_Add_node(jdbh,
data, root, taller)
832 node = zeBTree_Node_Alloc(jdbh,
data);
841 return (node != NULL);;
862 ok = zeBTree_Add_node(jdbh,
data, &(troot->
left), taller);
864 if (ok && (taller != NULL) && *taller)
872 node = zeBTree_Left_Balance(troot);
901 ok = zeBTree_Add_node(jdbh,
data, &(troot->
right), taller);
903 if (ok && (taller != NULL) && *taller)
919 node = zeBTree_Right_Balance(troot);
953 for (x /= 2; x != 0; x /= 2)
970 return 2 * jlog2(jdbh->
count);
bool zeBTree_Set_BTree_Size(ZEBT_T *jdbh, bool chkCount, int maxCount)
bool zeBTree_Del(ZEBT_T *jdbh, void *data)
#define JBT_UNLOCK(mutex)
void * zeBTree_Get(ZEBT_T *jdbh, void *data)
int zeBTree_Max_Height(ZEBT_T *)
bool zeBTree_Add(ZEBT_T *jdbh, void *data)
#define ZE_LogMsgError(level,...)
bool zeBTree_Cleanup(ZEBT_T *jdbh, JBT_SEL_T getit, void *arg)
bool zeBTree_Destroy(ZEBT_T *jdbh)
#define ZE_LogMsgNotice(level,...)
int zeBTree_Browse(ZEBT_T *jdbh, JBT_BROWSE_T func, void *data)
int zeBTree_Count(ZEBT_T *jdbh)
bool zeBTree_Clear(ZEBT_T *jdbh)
#define ZE_MessageInfo(level,...)
#define ZE_MessageWarning(level,...)
#define ZE_LogSysError(...)
#define ZE_LogMsgWarning(level,...)
bool zeBTree_Init(ZEBT_T *jdbh, size_t size, JBT_CMP_T reccmp)
bool zeBTree_Cpy(ZEBT_T *dst, ZEBT_T *org, JBT_SEL_T getit, void *arg)