1
2
3
4
5
6
7
8
9
10 #ifndef _DICT_H_
11 #define _DICT_H_
12
13 #include <stddef.h>
14
15 #define DICT_VERSION_MAJOR 0
16 #define DICT_VERSION_MINOR 2
17 #define DICT_VERSION_PATCH 1
18
19 #ifndef __P
20 # if defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus) || \
21 defined(_MSC_VER)
22 # define __P(x) x
23 # else
24 # define __P(x)
25 # endif
26 #endif
27
28 #ifndef FALSE
29 #define FALSE 0
30 #endif
31
32 #ifndef TRUE
33 #define TRUE (!FALSE)
34 #endif
35
36 #if defined(__cplusplus) || defined(c_plusplus)
37 # define BEGIN_DECL extern "C" {
38 # define END_DECL }
39 #else
40 # define BEGIN_DECL
41 # define END_DECL
42 #endif
43
44 BEGIN_DECL
45
46 typedef void *(*dict_malloc_func)(size_t);
47 typedef void (*dict_free_func)(void *);
48
49 dict_malloc_func dict_set_malloc __P((dict_malloc_func func));
50 dict_free_func dict_set_free __P((dict_free_func func));
51
52 typedef int (*dict_cmp_func) __P((const void *, const void *));
53 typedef void (*dict_del_func) __P((void *));
54 typedef int (*dict_vis_func) __P((const void *, void *));
55 typedef unsigned (*dict_hsh_func) __P((const void *));
56
57 typedef struct dict dict;
58 typedef struct dict_itor dict_itor;
59
60 struct dict {
61 void *_object;
62 int (*_insert) __P((void *obj, void *k, void *d, int ow));
63 int (*_probe) __P((void *obj, void *key, void **dat));
64 void *(*_search) __P((void *obj, const void *k));
65 int (*_remove) __P((void *obj, const void *key, int del));
66 void (*_walk) __P((void *obj, dict_vis_func func));
67 unsigned (*_count) __P((const void *obj));
68 void (*_empty) __P((void *obj, int del));
69 void (*_destroy) __P((void *obj, int del));
70 dict_itor *(*_inew) __P((void *obj));
71 };
72
73 #define dict_private(dct) (dct)->_object
74 #define dict_insert(dct,k,d,o) (dct)->_insert((dct)->_object, (k), (d), (o))
75 #define dict_probe(dct,k,d) (dct)->_probe((dct)->_object, (k), (d))
76 #define dict_search(dct,k) (dct)->_search((dct)->_object, (k))
77 #define dict_remove(dct,k,del) (dct)->_remove((dct)->_object, (k), (del))
78 #define dict_walk(dct,f) (dct)->_walk((dct)->_object, (f))
79 #define dict_count(dct) (dct)->_count((dct)->_object)
80 #define dict_empty(dct,d) (dct)->_empty((dct)->_object, (d))
81 void dict_destroy __P((dict *dct, int del));
82 #define dict_itor_new(dct) (dct)->_inew((dct)->_object)
83
84 struct dict_itor {
85 void *_itor;
86 int (*_valid) __P((const void *itor));
87 void (*_invalid) __P((void *itor));
88 int (*_next) __P((void *itor));
89 int (*_prev) __P((void *itor));
90 int (*_nextn) __P((void *itor, unsigned count));
91 int (*_prevn) __P((void *itor, unsigned count));
92 int (*_first) __P((void *itor));
93 int (*_last) __P((void *itor));
94 int (*_search) __P((void *itor, const void *key));
95 const void *(*_key) __P((void *itor));
96 void *(*_data) __P((void *itor));
97 const void *(*_cdata) __P((const void *itor));
98 int (*_setdata) __P((void *itor, void *dat, int del));
99 int (*_remove) __P((void *itor, int del));
100 int (*_compare) __P((void *itor1, void *itor2));
101 void (*_destroy) __P((void *itor));
102 };
103
104 #define dict_itor_private(i) (i)->_itor
105 #define dict_itor_valid(i) (i)->_valid((i)->_itor)
106 #define dict_itor_invalidate(i) (i)->_invalid((i)->_itor)
107 #define dict_itor_next(i) (i)->_next((i)->_itor)
108 #define dict_itor_prev(i) (i)->_prev((i)->_itor)
109 #define dict_itor_nextn(i,n) (i)->_nextn((i)->_itor, (n))
110 #define dict_itor_prevn(i,n) (i)->_prevn((i)->_itor, (n))
111 #define dict_itor_first(i) (i)->_first((i)->_itor)
112 #define dict_itor_last(i) (i)->_last((i)->_itor)
113 #define dict_itor_search(i,k) (i)->_search((i)->_itor, (k))
114 #define dict_itor_key(i) (i)->_key((i)->_itor)
115 #define dict_itor_data(i) (i)->_data((i)->_itor)
116 #define dict_itor_cdata(i) (i)->_cdata((i)->_itor)
117 #define dict_itor_set_data(i,dat,d) (i)->_setdata((i)->_itor, (dat), (d))
118 #define dict_itor_remove(i) (i)->_remove((i)->_itor)
119 void dict_itor_destroy __P((dict_itor *itor));
120
121 int dict_int_cmp __P((const void *k1, const void *k2));
122 int dict_uint_cmp __P((const void *k1, const void *k2));
123 int dict_long_cmp __P((const void *k1, const void *k2));
124 int dict_ulong_cmp __P((const void *k1, const void *k2));
125 int dict_ptr_cmp __P((const void *k1, const void *k2));
126 int dict_str_cmp __P((const void *k1, const void *k2));
127
128 END_DECL
129
130
131 #include "hb_tree.h"
132
133
134
135
136
137
138 #endif