xref: /php-src/ext/dom/lexbor/lexbor/core/bst.h (revision bffab33a)
1 /*
2  * Copyright (C) 2018 Alexander Borisov
3  *
4  * Author: Alexander Borisov <borisov@lexbor.com>
5  */
6 
7 #ifndef LEXBOR_BST_H
8 #define LEXBOR_BST_H
9 
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13 
14 #include <string.h>
15 
16 #include "lexbor/core/base.h"
17 #include "lexbor/core/dobject.h"
18 
19 
20 #define lexbor_bst_root(bst) (bst)->root
21 #define lexbor_bst_root_ref(bst) &((bst)->root)
22 
23 
24 typedef struct lexbor_bst_entry lexbor_bst_entry_t;
25 typedef struct lexbor_bst lexbor_bst_t;
26 
27 typedef bool (*lexbor_bst_entry_f)(lexbor_bst_t *bst,
28                                    lexbor_bst_entry_t *entry, void *ctx);
29 
30 struct lexbor_bst_entry {
31     void               *value;
32 
33     lexbor_bst_entry_t *right;
34     lexbor_bst_entry_t *left;
35     lexbor_bst_entry_t *next;
36     lexbor_bst_entry_t *parent;
37 
38     size_t             size;
39 };
40 
41 struct lexbor_bst {
42     lexbor_dobject_t   *dobject;
43     lexbor_bst_entry_t *root;
44 
45     size_t             tree_length;
46 };
47 
48 
49 LXB_API lexbor_bst_t *
50 lexbor_bst_create(void);
51 
52 LXB_API lxb_status_t
53 lexbor_bst_init(lexbor_bst_t *bst, size_t size);
54 
55 LXB_API void
56 lexbor_bst_clean(lexbor_bst_t *bst);
57 
58 LXB_API lexbor_bst_t *
59 lexbor_bst_destroy(lexbor_bst_t *bst, bool self_destroy);
60 
61 LXB_API lexbor_bst_entry_t *
62 lexbor_bst_entry_make(lexbor_bst_t *bst, size_t size);
63 
64 LXB_API lexbor_bst_entry_t *
65 lexbor_bst_insert(lexbor_bst_t *bst, lexbor_bst_entry_t **scope,
66                   size_t size, void *value);
67 
68 LXB_API lexbor_bst_entry_t *
69 lexbor_bst_insert_not_exists(lexbor_bst_t *bst, lexbor_bst_entry_t **scope,
70                              size_t size);
71 
72 
73 LXB_API lexbor_bst_entry_t *
74 lexbor_bst_search(lexbor_bst_t *bst, lexbor_bst_entry_t *scope, size_t size);
75 
76 LXB_API lexbor_bst_entry_t *
77 lexbor_bst_search_close(lexbor_bst_t *bst, lexbor_bst_entry_t *scope,
78                         size_t size);
79 
80 
81 LXB_API void *
82 lexbor_bst_remove(lexbor_bst_t *bst, lexbor_bst_entry_t **root, size_t size);
83 
84 LXB_API void *
85 lexbor_bst_remove_close(lexbor_bst_t *bst, lexbor_bst_entry_t **root,
86                         size_t size, size_t *found_size);
87 
88 LXB_API void *
89 lexbor_bst_remove_by_pointer(lexbor_bst_t *bst, lexbor_bst_entry_t *entry,
90                              lexbor_bst_entry_t **root);
91 
92 
93 LXB_API void
94 lexbor_bst_serialize(lexbor_bst_t *bst, lexbor_callback_f callback, void *ctx);
95 
96 LXB_API void
97 lexbor_bst_serialize_entry(lexbor_bst_entry_t *entry,
98                            lexbor_callback_f callback, void *ctx, size_t tabs);
99 
100 
101 #ifdef __cplusplus
102 } /* extern "C" */
103 #endif
104 
105 #endif /* LEXBOR_BST_H */
106 
107 
108 
109