17#include "core_tries.h"
18#include "base_tries.h"
33static TrEntry FIRST_TRIE, CURRENT_TRIE;
35static YAP_Int CURRENT_TRAVERSE_MODE;
42void trie_init_module(
void) {
43 TRIE_ENGINE = core_trie_init_module();
45 CURRENT_TRAVERSE_MODE = TRAVERSE_MODE_FORWARD;
51void trie_data_load(
TrNode node, YAP_Int depth, FILE *file) {
54 new_trie_data(data, CURRENT_TRIE, node);
55 PUT_DATA_IN_LEAF_TRIE_NODE(node, data);
61void trie_data_copy(
TrNode node_dest,
TrNode node_source) {
64 new_trie_data(data_dest, CURRENT_TRIE, node_dest);
65 PUT_DATA_IN_LEAF_TRIE_NODE(node_dest, data_dest);
71void trie_data_destruct(
TrNode node) {
75 data = (
TrData) GET_DATA_FROM_LEAF_TRIE_NODE(node);
76 trie = TrData_trie(data);
77 if (data == TrEntry_traverse_data(trie)) {
78 if (CURRENT_TRAVERSE_MODE == TRAVERSE_MODE_FORWARD) {
79 TrEntry_traverse_data(trie) = TrData_previous(data);
81 if (TrData_next(data)) {
82 TrEntry_traverse_data(trie) = TrData_next(data);
85 new_struct(special, TYPE_TR_DATA, SIZEOF_TR_DATA);
86 TrData_next(special) = NULL;
87 TrData_previous(special) = TrData_previous(data);
88 TrData_trie(special) = NULL;
89 TrData_leaf(special) = NULL;
90 TrEntry_traverse_data(trie) = special;
94 if (TrData_next(data)) {
95 TrData_previous(TrData_next(data)) = TrData_previous(data);
96 TrData_next(TrData_previous(data)) = TrData_next(data);
98 TrEntry_last_data(trie) = TrData_previous(data);
99 TrData_next(TrData_previous(data)) = NULL;
101 free_trie_data(data);
111 node = core_trie_open(TRIE_ENGINE);
112 new_trie_entry(trie, node);
114 TrEntry_previous(FIRST_TRIE) = trie;
122 core_trie_close(TRIE_ENGINE, TrEntry_trie(trie), &trie_data_destruct);
123 if (TrEntry_next(trie)) {
124 TrEntry_previous(TrEntry_next(trie)) = TrEntry_previous(trie);
125 TrEntry_next(TrEntry_previous(trie)) = TrEntry_next(trie);
127 TrEntry_next(TrEntry_previous(trie)) = NULL;
128 free_trie_entry(trie);
134void trie_close_all(
void) {
137 core_trie_close_all(TRIE_ENGINE, &trie_data_destruct);
139 trie = TrEntry_next(FIRST_TRIE);
140 free_trie_entry(FIRST_TRIE);
148void trie_set_mode(YAP_Int mode) {
149 core_trie_set_mode(mode);
155YAP_Int trie_get_mode(
void) {
156 return core_trie_get_mode();
165 node = core_trie_put_entry(TRIE_ENGINE, TrEntry_trie(trie), entry, NULL);
166 if (!(data = (
TrData) GET_DATA_FROM_LEAF_TRIE_NODE(node))) {
167 new_trie_data(data, trie, node);
168 PUT_DATA_IN_LEAF_TRIE_NODE(node, data);
178 if (!(node = core_trie_check_entry(TrEntry_trie(trie), entry)))
180 return (
TrData) GET_DATA_FROM_LEAF_TRIE_NODE(node);
185YAP_Term trie_get_entry(
TrData data) {
186 return core_trie_get_entry(TrData_leaf(data));
194 data = TrEntry_first_data(trie);
203 data = TrEntry_last_data(trie);
204 if (data == AS_TR_DATA_NEXT(&TrEntry_first_data(trie)))
215 data = TrData_next(init_data);
217 if (CURRENT_TRAVERSE_MODE == TRAVERSE_MODE_FORWARD)
218 data = TrEntry_first_data(trie);
220 data = trie_get_last_entry(trie);
222 TrEntry_traverse_data(trie) = data;
230 data = TrEntry_traverse_data(trie);
232 if (!TrData_trie(data)) {
233 if (TrEntry_first_data(trie)) {
236 free_trie_data(data);
238 TrEntry_traverse_data(trie) = NULL;
242 if (CURRENT_TRAVERSE_MODE == TRAVERSE_MODE_FORWARD)
243 data = TrData_next(data);
245 data = TrData_previous(data);
246 if (data == TrData_previous(TrEntry_first_data(trie)))
249 TrEntry_traverse_data(trie) = data;
251 free_trie_data(temp);
258void trie_remove_entry(
TrData data) {
259 core_trie_remove_entry(TRIE_ENGINE, TrData_leaf(data), &trie_data_destruct);
265void trie_remove_subtree(
TrData data) {
266 core_trie_remove_subtree(TRIE_ENGINE, TrData_leaf(data), &trie_data_destruct);
273 CURRENT_TRIE = trie_dest;
274 core_trie_join(TRIE_ENGINE, TrEntry_trie(trie_dest), TrEntry_trie(trie_source), NULL, &trie_data_copy);
281 core_trie_intersect(TRIE_ENGINE, TrEntry_trie(trie_dest), TrEntry_trie(trie_source), NULL, &trie_data_destruct);
288 return core_trie_count_join(TrEntry_trie(trie1), TrEntry_trie(trie2));
294 return core_trie_count_intersect(TrEntry_trie(trie1), TrEntry_trie(trie2));
299void trie_save(
TrEntry trie, FILE *file) {
300 core_trie_save(TrEntry_trie(trie), file, NULL);
310 new_trie_entry(trie, NULL);
312 if (!(node = core_trie_load(TRIE_ENGINE, file, &trie_data_load))) {
313 free_trie_entry(trie);
316 TrEntry_trie(trie) = node;
318 TrEntry_previous(FIRST_TRIE) = trie;
325void trie_stats(YAP_Int *memory, YAP_Int *tries, YAP_Int *entries, YAP_Int *nodes) {
326 core_trie_stats(TRIE_ENGINE, memory, tries, entries, nodes);
332void trie_max_stats(YAP_Int *memory, YAP_Int *tries, YAP_Int *entries, YAP_Int *nodes) {
333 core_trie_max_stats(TRIE_ENGINE, memory, tries, entries, nodes);
338void trie_usage(
TrEntry trie, YAP_Int *entries, YAP_Int *nodes, YAP_Int *virtual_nodes) {
339 core_trie_usage(TrEntry_trie(trie), entries, nodes, virtual_nodes);
346 core_trie_print(TrEntry_trie(trie), NULL);
352void trie_data_construct(
TrNode node) {
354 new_trie_data(data, CURRENT_TRIE, node);
355 PUT_DATA_IN_LEAF_TRIE_NODE(node, data);
361void trie_set_traverse_mode(YAP_Int mode) {
362 CURRENT_TRAVERSE_MODE = mode;
368YAP_Int trie_get_traverse_mode(
void) {
369 return CURRENT_TRAVERSE_MODE;
376 if (CURRENT_TRAVERSE_MODE == TRAVERSE_MODE_FORWARD)
377 data = TrEntry_first_data(trie);
379 data = TrEntry_last_data(trie);
388 if (CURRENT_TRAVERSE_MODE == TRAVERSE_MODE_FORWARD)
389 data = TrData_next(cur);
391 data = TrData_previous(cur);
392 if (data == TrData_previous(TrEntry_first_data(TrData_trie(cur))))
401void trie_disable_hash_table(
void) {
402 core_disable_hash_table();
408void trie_enable_hash_table(
void) {
409 core_enable_hash_table();
420 while(!IS_LEAF_TRIE_NODE(node))
421 node = TrNode_child(node);
422 return (
TrData) GET_DATA_FROM_LEAF_TRIE_NODE(node);
427YAP_Term trie_to_list(
TrEntry trie) {
428 return core_trie_to_list(TrEntry_trie(trie));
431#include "base_dbtries.c"