GCC Code Coverage Report


Directory: src/
File: src/btree/array.c
Date: 2023-03-02 23:19:03
Exec Total Coverage
Lines: 122 122 100.0%
Functions: 6 6 100.0%
Branches: 49 246 19.9%

Line Branch Exec Source
1 #include <core.h>
2 #include <foreach.h>
3 #include <interface.h>
4
5
6 static gboolean
7 21 nativeBTreeFilter(gpointer key, gpointer value, gpointer data) {
8 21 BTreeNode node = (BTreeNode) value;
9 21 ForEachContext_t *ctxt = (ForEachContext_t *) data;
10 21 napi_value accumulator = (napi_value) ctxt->data;
11 21 napi_env env = ctxt->bTree->env;
12
13 napi_value esNode, esKey, esValue, esIdx, cbResult;
14
15
1/6
✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
21 NAPI_CALL(env, false,
16 napi_get_reference_value(env, node->esKeyValue, &esNode));
17
18
1/6
✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
21 NAPI_CALL(env, false,
19 napi_get_named_property(env, esNode, KEY, &esKey));
20
21
1/6
✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
21 NAPI_CALL(env, false,
22 napi_get_named_property(env, esNode, VALUE, &esValue));
23
24
1/6
✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
21 NAPI_CALL(env, false,
25 napi_create_int64(env, ctxt->idx++, &esIdx));
26
27 105 napi_value argv[] = {
28 21 esValue,
29 21 esKey,
30 21 esIdx,
31 21 ctxt->esbTree
32 };
33
34
1/6
✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
21 NAPI_CALL(env, false,
35 napi_call_function(env, ctxt->cbThis, ctxt->callback,
36 (sizeof(argv) / sizeof(napi_value)), argv, &cbResult));
37
38
1/6
✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
21 NAPI_CALL(env, false,
39 napi_coerce_to_bool(env, cbResult, &cbResult));
40
41 21 bool ok = false;
42
43
1/6
✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
21 NAPI_CALL(env, false,
44 napi_get_value_bool(env, cbResult, &ok));
45
46
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 9 times.
21 if (ok) {
47 napi_handle_scope scope;
48
49
1/6
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
9 NAPI_CALL(env, false,
50 napi_open_handle_scope(env, &scope));
51
52 napi_value box;
53
54 // Create box es object
55
1/6
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
9 NAPI_CALL(env, false,
56 napi_create_object(env, &box));
57
58 // Set key & value to box
59
1/6
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
9 NAPI_CALL(env, false,
60 napi_set_named_property(env, box, KEY, esKey));
61
1/6
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
9 NAPI_CALL(env, false,
62 napi_set_named_property(env, box, VALUE, esValue));
63
64 9 nativeInsertNode(env, accumulator, box);
65
66
1/6
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
9 NAPI_CALL(env, false,
67 napi_close_handle_scope(env, scope));
68 // ctxt->data = (void *) cbResult;
69 9 }
70
71 21 return false;
72 }
73
74 /**
75 * Native callback for es reduce()
76 */
77 static gboolean
78 15 nativeBTreeReduce(gpointer key, gpointer value, gpointer data) {
79 15 BTreeNode node = (BTreeNode) value;
80 15 ForEachContext_t *ctxt = (ForEachContext_t *) data;
81 15 napi_value accumulator = (napi_value) ctxt->data;
82 15 napi_env env = ctxt->bTree->env;
83
84 napi_value esNode, esKey, esValue, esIdx, cbResult;
85
86
1/6
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
15 NAPI_CALL(env, false,
87 napi_get_reference_value(env, node->esKeyValue, &esNode));
88
89
1/6
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
15 NAPI_CALL(env, false,
90 napi_get_named_property(env, esNode, KEY, &esKey));
91
92
1/6
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
15 NAPI_CALL(env, false,
93 napi_get_named_property(env, esNode, VALUE, &esValue));
94
95
1/6
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
15 NAPI_CALL(env, false,
96 napi_create_int64(env, ctxt->idx++, &esIdx));
97
98 90 napi_value argv[] = {
99 15 accumulator,
100 15 esValue,
101 15 esKey,
102 15 esIdx,
103 15 ctxt->esbTree
104 };
105
106
1/6
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
15 NAPI_CALL(env, false,
107 napi_call_function(env, ctxt->cbThis, ctxt->callback,
108 (sizeof(argv) / sizeof(napi_value)), argv, &cbResult));
109
110 15 ctxt->data = (void *) cbResult;
111
112 15 return false;
113 }
114
115 /**
116 * Native callback for ES map()
117 */
118 static gboolean
119 29 nativeBTreeMap(gpointer key, gpointer value, gpointer data) {
120 29 BTreeNode node = (BTreeNode) value;
121 29 ForEachContext_t *ctxt = (ForEachContext_t *) data;
122 29 napi_value array = (napi_value) ctxt->data;
123 29 napi_env env = ctxt->bTree->env;
124
125 napi_value esNode, esKey, esValue, esIdx, cbResult;
126
127
1/6
✓ Branch 0 taken 29 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
29 NAPI_CALL(env, false,
128 napi_get_reference_value(env, node->esKeyValue, &esNode));
129
130
1/6
✓ Branch 0 taken 29 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
29 NAPI_CALL(env, false,
131 napi_get_named_property(env, esNode, KEY, &esKey));
132
133
1/6
✓ Branch 0 taken 29 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
29 NAPI_CALL(env, false,
134 napi_get_named_property(env, esNode, VALUE, &esValue));
135
136
1/6
✓ Branch 0 taken 29 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
29 NAPI_CALL(env, false,
137 napi_create_int64(env, ctxt->idx, &esIdx));
138
139 145 napi_value argv[] = {
140 29 esValue,
141 29 esKey,
142 29 esIdx,
143 29 ctxt->esbTree
144 };
145
146
1/6
✓ Branch 0 taken 29 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
29 NAPI_CALL(env, false,
147 napi_call_function(env, ctxt->cbThis, ctxt->callback,
148 (sizeof(argv) / sizeof(napi_value)), argv, &cbResult));
149
150
1/6
✓ Branch 0 taken 29 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
29 NAPI_CALL(env, false,
151 napi_set_element(env, array, ctxt->idx++, cbResult));
152
153 29 return false;
154 }
155
156
157 napi_value
158 11 esMap(napi_env env, napi_callback_info cbInfo) {
159 napi_value esThis, array, callback, cbThis, argv[2];
160 BTree_t *bTree;
161 11 size_t argc = 2;
162
163 // Get es this for current btree
164
1/6
✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
11 NAPI_CALL(env, false, napi_get_cb_info(env, cbInfo, &argc, argv, &esThis, NULL));
165
166 // Extract native BTree pointer
167
1/6
✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
11 EXTRACT_BTREE(env, esThis, bTree);
168
169
3/8
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
11 CHECK_ARGC(1, msgTooFewArguments);
170 10 callback = argv[0];
171
172
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
10 if (argc > 1) {
173 2 cbThis = argv[1];
174 2 }
175 else {
176
1/6
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
8 NAPI_CALL(env, true,
177 napi_get_global(env, &cbThis));
178 }
179
180 10 gint bTreeSize = g_tree_nnodes(bTree->nativeTree);
181
182
1/6
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
10 NAPI_CALL(env, true,
183 napi_create_array_with_length(env, (size_t) bTreeSize, &array));
184
185 60 ForEachContext_t ctxt = {
186 10 esThis,
187 10 callback,
188 10 cbThis,
189 0,
190 10 bTree,
191 10 array
192 };
193
194 10 g_tree_foreach(bTree->nativeTree, nativeBTreeMap, &ctxt);
195
196 10 return array;
197 11 }
198
199 napi_value
200 6 esReduce(napi_env env, napi_callback_info cbInfo) {
201 napi_value esThis, callback, accumulator, cbThis, argv[2];
202 BTree_t *bTree;
203 6 size_t argc = 2;
204
205 // Get es this for current btree
206
1/6
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
6 NAPI_CALL(env, false,
207 napi_get_cb_info(env, cbInfo, &argc, argv, &esThis, NULL));
208
209 // Extract native BTree pointer
210
1/6
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
6 EXTRACT_BTREE(env, esThis, bTree);
211
212
3/8
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
6 CHECK_ARGC(2, msgTooFewArguments);
213 5 callback = argv[0];
214 5 accumulator = argv[1];
215
216
1/6
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
5 NAPI_CALL(env, true,
217 napi_get_global(env, &cbThis));
218
219 30 ForEachContext_t ctxt = {
220 5 esThis,
221 5 callback,
222 5 cbThis,
223 0,
224 5 bTree,
225 5 accumulator
226 };
227
228 5 g_tree_foreach(bTree->nativeTree, nativeBTreeReduce, &ctxt);
229
230 5 return (napi_value) ctxt.data;
231 6 }
232
233 napi_value
234 7 esFilter(napi_env env, napi_callback_info cbInfo) {
235 napi_value esThis, callback, accumulator, cbThis, argv[2];
236 BTree_t *bTree;
237 7 size_t argc = 2;
238
239 // Get es this for current btree
240
1/6
✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
7 NAPI_CALL(env, false,
241 napi_get_cb_info(env, cbInfo, &argc, argv, &esThis, NULL));
242
243 // Extract native BTree pointer
244
1/6
✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
7 EXTRACT_BTREE(env, esThis, bTree);
245
246
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
7 CHECK_ARGC(1, msgTooFewArguments);
247 7 callback = argv[0];
248
249
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 6 times.
7 if (argc > 1) {
250 1 cbThis = argv[1];
251 1 }
252 else {
253
1/6
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
6 NAPI_CALL(env, true,
254 napi_get_global(env, &cbThis));
255 }
256
257 napi_value esbTreeConstructor, comparatorFunc;
258
1/6
✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
7 NAPI_CALL(env, true,
259 napi_get_reference_value(env, btreeConstructorRef, &esbTreeConstructor));
260
261
1/6
✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
7 NAPI_CALL(env, true,
262 napi_get_reference_value(env, bTree->comparator, &comparatorFunc));
263
264
1/6
✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
7 NAPI_CALL(env, true,
265 napi_new_instance(env, esbTreeConstructor, 1, &comparatorFunc, &accumulator));
266
267 42 ForEachContext_t ctxt = {
268 7 esThis,
269 7 callback,
270 7 cbThis,
271 0,
272 7 bTree,
273 7 accumulator
274 };
275
276 7 g_tree_foreach(bTree->nativeTree, nativeBTreeFilter, &ctxt);
277
278 7 return (napi_value) ctxt.data;
279 7 }
280