57 if (struct_size == 0) {
128 return (node) ? node->
height : 0;
144 node->
height = ((left_height > right_height)
145 ? left_height : right_height) + 1;
201 node->
height = ((left_height > right_height)
202 ? left_height : right_height) + 1;
205 switch ((right_height - left_height)) {
208 node->
right = lexbor_avl_node_rotate_right(node->
right);
213 if (parent !=
NULL) {
214 if (parent->right == node) {
215 parent->right = lexbor_avl_node_rotate_left(node);
216 return parent->right;
219 parent->left = lexbor_avl_node_rotate_left(node);
224 return lexbor_avl_node_rotate_left(node);
228 node->
left = lexbor_avl_node_rotate_left(node->
left);
233 if (parent !=
NULL) {
234 if (parent->right == node) {
235 parent->right = lexbor_avl_node_rotate_right(node);
236 return parent->right;
239 parent->left = lexbor_avl_node_rotate_right(node);
244 return lexbor_avl_node_rotate_right(node);
278 node->
left = new_node;
292 node->
right = new_node;
306 while (node !=
NULL) {
307 node = lexbor_avl_node_balance(node,
scope);
334 if (delete_node->
left == node) {
335 balance_node = (node->
left) ? node->
left : node;
340 if (delete_node->
right)
362 if (delete_node->
parent->
left == delete_node) {
374 balance_node = delete_node->
parent;
376 if (balance_node !=
NULL) {
377 if (balance_node->
left == delete_node) {
393 while (balance_node !=
NULL) {
394 balance_node = lexbor_avl_node_balance(balance_node,
scope);
404 while (node !=
NULL) {
439 while (node !=
NULL) {
460 bool from_right =
false;
482 state = parent->left == node;
491 if (*
scope != root) {
506 else if (parent->left != node && parent->
right != node) {
508 if (parent->left !=
NULL && parent->left->right !=
NULL) {
517 if (parent->right !=
NULL) {
518 node = parent->
right;
531 if (node->
right !=
NULL && !from_right) {
541 if (parent == root->
parent) {
544 else if (node == parent->
left) {
lexbor_avl_node_t * lexbor_avl_node_destroy(lexbor_avl_t *avl, lexbor_avl_node_t *node, bool self_destroy)
lxb_inline lexbor_avl_node_t * lexbor_avl_find_min(lexbor_avl_node_t *node)
lexbor_avl_node_t * lexbor_avl_search(lexbor_avl_t *avl, lexbor_avl_node_t *node, size_t type)
void lexbor_avl_foreach_recursion(lexbor_avl_t *avl, lexbor_avl_node_t *scope, lexbor_avl_node_f callback, void *ctx)
lxb_inline void lexbor_avl_node_set_height(lexbor_avl_node_t *node)
void lexbor_avl_node_clean(lexbor_avl_node_t *node)
lxb_status_t lexbor_avl_init(lexbor_avl_t *avl, size_t chunk_len, size_t struct_size)
lxb_inline void lexbor_avl_rotate_for_delete(lexbor_avl_node_t *delete_node, lexbor_avl_node_t *node, lexbor_avl_node_t **root)
void * lexbor_avl_remove(lexbor_avl_t *avl, lexbor_avl_node_t **scope, size_t type)
lexbor_avl_t * lexbor_avl_create(void)
void lexbor_avl_clean(lexbor_avl_t *avl)
lexbor_avl_node_t * lexbor_avl_insert(lexbor_avl_t *avl, lexbor_avl_node_t **scope, size_t type, void *value)
void lexbor_avl_remove_by_node(lexbor_avl_t *avl, lexbor_avl_node_t **root, lexbor_avl_node_t *node)
lxb_inline short lexbor_avl_node_balance_factor(lexbor_avl_node_t *node)
lexbor_avl_t * lexbor_avl_destroy(lexbor_avl_t *avl, bool self_destroy)
lxb_status_t lexbor_avl_foreach(lexbor_avl_t *avl, lexbor_avl_node_t **scope, lexbor_avl_node_f cb, void *ctx)
lxb_inline short lexbor_avl_node_height(lexbor_avl_node_t *node)
lexbor_avl_node_t * lexbor_avl_node_make(lexbor_avl_t *avl, size_t type, void *value)
struct lexbor_avl_node lexbor_avl_node_t
lxb_status_t(* lexbor_avl_node_f)(lexbor_avl_t *avl, lexbor_avl_node_t **root, lexbor_avl_node_t *node, void *ctx)
struct lexbor_avl lexbor_avl_t
@ LXB_STATUS_ERROR_OBJECT_IS_NULL
@ LXB_STATUS_ERROR_WRONG_ARGS
void * lexbor_dobject_calloc(lexbor_dobject_t *dobject)
lxb_status_t lexbor_dobject_init(lexbor_dobject_t *dobject, size_t chunk_size, size_t struct_size)
void lexbor_dobject_clean(lexbor_dobject_t *dobject)
lexbor_dobject_t * lexbor_dobject_destroy(lexbor_dobject_t *dobject, bool destroy_self)
void * lexbor_dobject_free(lexbor_dobject_t *dobject, void *data)
lexbor_dobject_t * lexbor_dobject_create(void)
memset(ptr, 0, type->size)
LXB_API void * lexbor_free(void *dst)
LXB_API void * lexbor_calloc(size_t num, size_t size)
unsigned const char * pos
lexbor_avl_node_t * parent
lexbor_avl_node_t * right
lexbor_avl_node_t * last_right
unsigned int lxb_status_t
ZEND_API void(ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data)