14#define TRAVERSE_MODE_FORWARD 0
15#define TRAVERSE_MODE_BACKWARD 1
31#define TrEntry_trie(X) ((X)->top_trie_node)
32#define TrEntry_first_data(X) ((X)->first_trie_data)
33#define TrEntry_last_data(X) ((X)->last_trie_data)
34#define TrEntry_traverse_data(X) ((X)->traverse_trie_data)
35#define TrEntry_next(X) ((X)->next)
36#define TrEntry_previous(X) ((X)->previous)
45#define TrData_trie(X) ((X)->trie)
46#define TrData_leaf(X) ((X)->leaf_trie_node)
47#define TrData_next(X) ((X)->next)
48#define TrData_previous(X) ((X)->previous)
50#define TYPE_TR_ENTRY struct trie_entry
51#define TYPE_TR_DATA struct trie_data
52#define SIZEOF_TR_ENTRY sizeof(TYPE_TR_ENTRY)
53#define SIZEOF_TR_DATA sizeof(TYPE_TR_DATA)
55#define AS_TR_ENTRY_NEXT(ADDR) (TrEntry)((YAP_UInt)(ADDR) - sizeof(struct trie_node *) - 3 * sizeof(struct trie_data *))
56#define AS_TR_DATA_NEXT(ADDR) (TrData)((YAP_UInt)(ADDR) - sizeof(struct trie_entry *) - sizeof(struct trie_node *))
64#define new_trie_entry(TR_ENTRY, TR_NODE) \
65 { new_struct(TR_ENTRY, TYPE_TR_ENTRY, SIZEOF_TR_ENTRY); \
66 TrEntry_trie(TR_ENTRY) = TR_NODE; \
67 TrEntry_first_data(TR_ENTRY) = NULL; \
68 TrEntry_last_data(TR_ENTRY) = AS_TR_DATA_NEXT(&TrEntry_first_data(TR_ENTRY)); \
69 TrEntry_traverse_data(TR_ENTRY) = NULL; \
70 TrEntry_next(TR_ENTRY) = FIRST_TRIE; \
71 TrEntry_previous(TR_ENTRY) = AS_TR_ENTRY_NEXT(&FIRST_TRIE); \
72 INCREMENT_MEMORY(TRIE_ENGINE, SIZEOF_TR_ENTRY); \
74#define new_trie_data(TR_DATA, TR_ENTRY, TR_NODE) \
75 { TrData first_data = TrEntry_first_data(TR_ENTRY); \
76 new_struct(TR_DATA, TYPE_TR_DATA, SIZEOF_TR_DATA); \
77 TrData_trie(TR_DATA) = TR_ENTRY; \
78 TrData_leaf(TR_DATA) = TR_NODE; \
79 TrData_next(TR_DATA) = NULL; \
81 TrData last_data = TrEntry_last_data(TR_ENTRY); \
82 TrData_next(last_data) = TR_DATA; \
83 TrData_previous(TR_DATA) = last_data; \
85 TrData_previous(TR_DATA) = AS_TR_DATA_NEXT(&TrEntry_first_data(TR_ENTRY)); \
86 TrEntry_first_data(TR_ENTRY) = TR_DATA; \
88 TrEntry_last_data(TR_ENTRY) = TR_DATA; \
89 INCREMENT_MEMORY(TRIE_ENGINE, SIZEOF_TR_DATA); \
94#define free_trie_entry(STR) \
96 DECREMENT_MEMORY(TRIE_ENGINE, SIZEOF_TR_ENTRY); \
98#define free_trie_data(STR) \
100 DECREMENT_MEMORY(TRIE_ENGINE, SIZEOF_TR_DATA); \
109void trie_init_module(
void);
110void trie_data_load(
TrNode node, YAP_Int depth, FILE *file);
111void trie_data_copy(
TrNode node_dest,
TrNode node_source);
112void trie_data_destruct(
TrNode node);
115void trie_close_all(
void);
116void trie_set_mode(YAP_Int mode);
117YAP_Int trie_get_mode(
void);
120YAP_Term trie_get_entry(
TrData data);
125void trie_remove_entry(
TrData data);
126void trie_remove_subtree(
TrData data);
131void trie_save(
TrEntry trie, FILE *file);
133void trie_stats(YAP_Int *memory, YAP_Int *tries, YAP_Int *entries, YAP_Int *nodes);
134void trie_max_stats(YAP_Int *memory, YAP_Int *tries, YAP_Int *entries, YAP_Int *nodes);
135void trie_usage(
TrEntry trie, YAP_Int *entries, YAP_Int *nodes, YAP_Int *virtual_nodes);
138extern void trie_data_construct(
TrNode node);
139extern void trie_set_traverse_mode(YAP_Int mode);
140extern YAP_Int trie_get_traverse_mode(
void);
143extern void trie_disable_hash_table(
void);
144extern void trie_enable_hash_table(
void);
146YAP_Term trie_to_list(
TrEntry trie);
148#include "base_dbtries.h"