xref: /php-src/ext/dom/lexbor/lexbor/core/avl.h (revision bffab33a)
1 /*
2  * Copyright (C) 2018 Alexander Borisov
3  *
4  * Author: Alexander Borisov <borisov@lexbor.com>
5  */
6 
7 #ifndef LEXBOR_AVL_H
8 #define LEXBOR_AVL_H
9 
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13 
14 #include "lexbor/core/base.h"
15 #include "lexbor/core/dobject.h"
16 
17 
18 typedef struct lexbor_avl lexbor_avl_t;
19 typedef struct lexbor_avl_node lexbor_avl_node_t;
20 
21 typedef lxb_status_t
22 (*lexbor_avl_node_f)(lexbor_avl_t *avl, lexbor_avl_node_t **root,
23                      lexbor_avl_node_t *node, void *ctx);
24 
25 struct lexbor_avl_node {
26     size_t            type;
27     short             height;
28     void              *value;
29 
30     lexbor_avl_node_t *left;
31     lexbor_avl_node_t *right;
32     lexbor_avl_node_t *parent;
33 };
34 
35 struct lexbor_avl {
36     lexbor_dobject_t  *nodes;
37     lexbor_avl_node_t *last_right;
38 };
39 
40 
41 LXB_API lexbor_avl_t *
42 lexbor_avl_create(void);
43 
44 LXB_API lxb_status_t
45 lexbor_avl_init(lexbor_avl_t *avl, size_t chunk_len, size_t struct_size);
46 
47 LXB_API void
48 lexbor_avl_clean(lexbor_avl_t *avl);
49 
50 LXB_API lexbor_avl_t *
51 lexbor_avl_destroy(lexbor_avl_t *avl, bool self_destroy);
52 
53 
54 LXB_API lexbor_avl_node_t *
55 lexbor_avl_node_make(lexbor_avl_t *avl, size_t type, void *value);
56 
57 LXB_API void
58 lexbor_avl_node_clean(lexbor_avl_node_t *node);
59 
60 LXB_API lexbor_avl_node_t *
61 lexbor_avl_node_destroy(lexbor_avl_t *avl, lexbor_avl_node_t *node,
62                         bool self_destroy);
63 
64 
65 LXB_API lexbor_avl_node_t *
66 lexbor_avl_insert(lexbor_avl_t *avl, lexbor_avl_node_t **scope,
67                   size_t type, void *value);
68 
69 LXB_API lexbor_avl_node_t *
70 lexbor_avl_search(lexbor_avl_t *avl, lexbor_avl_node_t *scope, size_t type);
71 
72 LXB_API void *
73 lexbor_avl_remove(lexbor_avl_t *avl, lexbor_avl_node_t **scope, size_t type);
74 
75 LXB_API void
76 lexbor_avl_remove_by_node(lexbor_avl_t *avl, lexbor_avl_node_t **root,
77                           lexbor_avl_node_t *node);
78 
79 LXB_API lxb_status_t
80 lexbor_avl_foreach(lexbor_avl_t *avl, lexbor_avl_node_t **scope,
81                    lexbor_avl_node_f cb, void *ctx);
82 
83 LXB_API void
84 lexbor_avl_foreach_recursion(lexbor_avl_t *avl, lexbor_avl_node_t *scope,
85                              lexbor_avl_node_f callback, void *ctx);
86 
87 
88 #ifdef __cplusplus
89 } /* extern "C" */
90 #endif
91 
92 #endif /* LEXBOR_AVL_H */
93