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.1.1.1 2003/12/23 08:09:48 jardin 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))