2 * Dictionary Abstract Data Type
3 * Copyright (C) 1997 Kaz Kylheku <kaz@ashi.footprints.net>
5 * Free Software License:
7 * All rights are reserved by the author, with the following exceptions:
8 * Permission is granted to freely reproduce and distribute this software,
9 * possibly in exchange for a fee, provided that this copyright notice appears
10 * intact. Permission is also granted to adapt this software to produce
11 * derivative works, as long as the modified versions carry this copyright
12 * notice and additional notices stating that the work has been modified.
13 * This source code may be translated into executable form and incorporated
14 * into proprietary software; there is no requirement for such software to
15 * contain a copyright notice related to this source.
17 * $Id: dict.h,v 1.3 2005/09/25 12:04:25 hasso Exp $
25 #ifdef KAZLIB_SIDEEFFECT_DEBUG
30 * Blurb for inclusion into C++ translation units
37 typedef unsigned long dictcount_t
;
38 #define DICTCOUNT_T_MAX ULONG_MAX
41 * The dictionary is implemented as a red-black tree
44 typedef enum { dnode_red
, dnode_black
} dnode_color_t
;
46 typedef struct dnode_t
{
47 #if defined(DICT_IMPLEMENTATION) || !defined(KAZLIB_OPAQUE_DEBUG)
48 struct dnode_t
*dict_left
;
49 struct dnode_t
*dict_right
;
50 struct dnode_t
*dict_parent
;
51 dnode_color_t dict_color
;
59 typedef int (*dict_comp_t
)(const void *, const void *);
60 typedef dnode_t
*(*dnode_alloc_t
)(void *);
61 typedef void (*dnode_free_t
)(dnode_t
*, void *);
63 typedef struct dict_t
{
64 #if defined(DICT_IMPLEMENTATION) || !defined(KAZLIB_OPAQUE_DEBUG)
66 dictcount_t dict_nodecount
;
67 dictcount_t dict_maxcount
;
68 dict_comp_t dict_compare
;
69 dnode_alloc_t dict_allocnode
;
70 dnode_free_t dict_freenode
;
78 typedef void (*dnode_process_t
)(dict_t
*, dnode_t
*, void *);
80 typedef struct dict_load_t
{
81 #if defined(DICT_IMPLEMENTATION) || !defined(KAZLIB_OPAQUE_DEBUG)
89 extern dict_t
*dict_create(dictcount_t
, dict_comp_t
);
90 extern void dict_set_allocator(dict_t
*, dnode_alloc_t
, dnode_free_t
, void *);
91 extern void dict_destroy(dict_t
*);
92 extern void dict_free_nodes(dict_t
*);
93 extern void dict_free(dict_t
*);
94 extern dict_t
*dict_init(dict_t
*, dictcount_t
, dict_comp_t
);
95 extern void dict_init_like(dict_t
*, const dict_t
*);
96 extern int dict_verify(dict_t
*);
97 extern int dict_similar(const dict_t
*, const dict_t
*);
98 extern dnode_t
*dict_lookup(dict_t
*, const void *);
99 extern dnode_t
*dict_lower_bound(dict_t
*, const void *);
100 extern dnode_t
*dict_upper_bound(dict_t
*, const void *);
101 extern void dict_insert(dict_t
*, dnode_t
*, const void *);
102 extern dnode_t
*dict_delete(dict_t
*, dnode_t
*);
103 extern int dict_alloc_insert(dict_t
*, const void *, void *);
104 extern void dict_delete_free(dict_t
*, dnode_t
*);
105 extern dnode_t
*dict_first(dict_t
*);
106 extern dnode_t
*dict_last(dict_t
*);
107 extern dnode_t
*dict_next(dict_t
*, dnode_t
*);
108 extern dnode_t
*dict_prev(dict_t
*, dnode_t
*);
109 extern dictcount_t
dict_count(dict_t
*);
110 extern int dict_isempty(dict_t
*);
111 extern int dict_isfull(dict_t
*);
112 extern int dict_contains(dict_t
*, dnode_t
*);
113 extern void dict_allow_dupes(dict_t
*);
114 extern int dnode_is_in_a_dict(dnode_t
*);
115 extern dnode_t
*dnode_create(void *);
116 extern dnode_t
*dnode_init(dnode_t
*, void *);
117 extern void dnode_destroy(dnode_t
*);
118 extern void *dnode_get(dnode_t
*);
119 extern const void *dnode_getkey(dnode_t
*);
120 extern void dnode_put(dnode_t
*, void *);
121 extern void dict_process(dict_t
*, void *, dnode_process_t
);
122 extern void dict_load_begin(dict_load_t
*, dict_t
*);
123 extern void dict_load_next(dict_load_t
*, dnode_t
*, const void *);
124 extern void dict_load_end(dict_load_t
*);
125 extern void dict_merge(dict_t
*, dict_t
*);
127 #if defined(DICT_IMPLEMENTATION) || !defined(KAZLIB_OPAQUE_DEBUG)
128 #ifdef KAZLIB_SIDEEFFECT_DEBUG
129 #define dict_isfull(D) (SFX_CHECK(D)->dict_nodecount == (D)->dict_maxcount)
131 #define dict_isfull(D) ((D)->dict_nodecount == (D)->dict_maxcount)
133 #define dict_count(D) ((D)->dict_nodecount)
134 #define dict_isempty(D) ((D)->dict_nodecount == 0)
135 #define dnode_get(N) ((N)->dict_data)
136 #define dnode_getkey(N) ((N)->dict_key)
137 #define dnode_put(N, X) ((N)->dict_data = (X))