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 |