1*59bfda1fSAndroid Build Coastguard Worker /* 2*59bfda1fSAndroid Build Coastguard Worker * Dictionary Abstract Data Type 3*59bfda1fSAndroid Build Coastguard Worker * Copyright (C) 1997 Kaz Kylheku <[email protected]> 4*59bfda1fSAndroid Build Coastguard Worker * 5*59bfda1fSAndroid Build Coastguard Worker * Free Software License: 6*59bfda1fSAndroid Build Coastguard Worker * 7*59bfda1fSAndroid Build Coastguard Worker * All rights are reserved by the author, with the following exceptions: 8*59bfda1fSAndroid Build Coastguard Worker * Permission is granted to freely reproduce and distribute this software, 9*59bfda1fSAndroid Build Coastguard Worker * possibly in exchange for a fee, provided that this copyright notice appears 10*59bfda1fSAndroid Build Coastguard Worker * intact. Permission is also granted to adapt this software to produce 11*59bfda1fSAndroid Build Coastguard Worker * derivative works, as long as the modified versions carry this copyright 12*59bfda1fSAndroid Build Coastguard Worker * notice and additional notices stating that the work has been modified. 13*59bfda1fSAndroid Build Coastguard Worker * This source code may be translated into executable form and incorporated 14*59bfda1fSAndroid Build Coastguard Worker * into proprietary software; there is no requirement for such software to 15*59bfda1fSAndroid Build Coastguard Worker * contain a copyright notice related to this source. 16*59bfda1fSAndroid Build Coastguard Worker * 17*59bfda1fSAndroid Build Coastguard Worker * $Id: dict.h,v 1.22.2.6 2000/11/13 01:36:44 kaz Exp $ 18*59bfda1fSAndroid Build Coastguard Worker * $Name: kazlib_1_20 $ 19*59bfda1fSAndroid Build Coastguard Worker */ 20*59bfda1fSAndroid Build Coastguard Worker 21*59bfda1fSAndroid Build Coastguard Worker #ifndef DICT_H 22*59bfda1fSAndroid Build Coastguard Worker #define DICT_H 23*59bfda1fSAndroid Build Coastguard Worker 24*59bfda1fSAndroid Build Coastguard Worker #include <limits.h> 25*59bfda1fSAndroid Build Coastguard Worker #ifdef KAZLIB_SIDEEFFECT_DEBUG 26*59bfda1fSAndroid Build Coastguard Worker #include "sfx.h" 27*59bfda1fSAndroid Build Coastguard Worker #endif 28*59bfda1fSAndroid Build Coastguard Worker 29*59bfda1fSAndroid Build Coastguard Worker /* 30*59bfda1fSAndroid Build Coastguard Worker * Blurb for inclusion into C++ translation units 31*59bfda1fSAndroid Build Coastguard Worker */ 32*59bfda1fSAndroid Build Coastguard Worker 33*59bfda1fSAndroid Build Coastguard Worker #ifdef __cplusplus 34*59bfda1fSAndroid Build Coastguard Worker extern "C" { 35*59bfda1fSAndroid Build Coastguard Worker #endif 36*59bfda1fSAndroid Build Coastguard Worker 37*59bfda1fSAndroid Build Coastguard Worker typedef unsigned long dictcount_t; 38*59bfda1fSAndroid Build Coastguard Worker #define DICTCOUNT_T_MAX ULONG_MAX 39*59bfda1fSAndroid Build Coastguard Worker 40*59bfda1fSAndroid Build Coastguard Worker /* 41*59bfda1fSAndroid Build Coastguard Worker * The dictionary is implemented as a red-black tree 42*59bfda1fSAndroid Build Coastguard Worker */ 43*59bfda1fSAndroid Build Coastguard Worker 44*59bfda1fSAndroid Build Coastguard Worker typedef enum { dnode_red, dnode_black } dnode_color_t; 45*59bfda1fSAndroid Build Coastguard Worker 46*59bfda1fSAndroid Build Coastguard Worker typedef struct dnode_t { 47*59bfda1fSAndroid Build Coastguard Worker #if defined(DICT_IMPLEMENTATION) || !defined(KAZLIB_OPAQUE_DEBUG) 48*59bfda1fSAndroid Build Coastguard Worker struct dnode_t *dict_left; 49*59bfda1fSAndroid Build Coastguard Worker struct dnode_t *dict_right; 50*59bfda1fSAndroid Build Coastguard Worker struct dnode_t *dict_parent; 51*59bfda1fSAndroid Build Coastguard Worker dnode_color_t dict_color; 52*59bfda1fSAndroid Build Coastguard Worker const void *dict_key; 53*59bfda1fSAndroid Build Coastguard Worker void *dict_data; 54*59bfda1fSAndroid Build Coastguard Worker #else 55*59bfda1fSAndroid Build Coastguard Worker int dict_dummy; 56*59bfda1fSAndroid Build Coastguard Worker #endif 57*59bfda1fSAndroid Build Coastguard Worker } dnode_t; 58*59bfda1fSAndroid Build Coastguard Worker 59*59bfda1fSAndroid Build Coastguard Worker typedef int (*dict_comp_t)(const void *, const void *); 60*59bfda1fSAndroid Build Coastguard Worker typedef dnode_t *(*dnode_alloc_t)(void *); 61*59bfda1fSAndroid Build Coastguard Worker typedef void (*dnode_free_t)(dnode_t *, void *); 62*59bfda1fSAndroid Build Coastguard Worker 63*59bfda1fSAndroid Build Coastguard Worker typedef struct dict_t { 64*59bfda1fSAndroid Build Coastguard Worker #if defined(DICT_IMPLEMENTATION) || !defined(KAZLIB_OPAQUE_DEBUG) 65*59bfda1fSAndroid Build Coastguard Worker dnode_t dict_nilnode; 66*59bfda1fSAndroid Build Coastguard Worker dictcount_t dict_nodecount; 67*59bfda1fSAndroid Build Coastguard Worker dictcount_t dict_maxcount; 68*59bfda1fSAndroid Build Coastguard Worker dict_comp_t dict_compare; 69*59bfda1fSAndroid Build Coastguard Worker dnode_alloc_t dict_allocnode; 70*59bfda1fSAndroid Build Coastguard Worker dnode_free_t dict_freenode; 71*59bfda1fSAndroid Build Coastguard Worker void *dict_context; 72*59bfda1fSAndroid Build Coastguard Worker int dict_dupes; 73*59bfda1fSAndroid Build Coastguard Worker #else 74*59bfda1fSAndroid Build Coastguard Worker int dict_dummmy; 75*59bfda1fSAndroid Build Coastguard Worker #endif 76*59bfda1fSAndroid Build Coastguard Worker } dict_t; 77*59bfda1fSAndroid Build Coastguard Worker 78*59bfda1fSAndroid Build Coastguard Worker typedef void (*dnode_process_t)(dict_t *, dnode_t *, void *); 79*59bfda1fSAndroid Build Coastguard Worker 80*59bfda1fSAndroid Build Coastguard Worker typedef struct dict_load_t { 81*59bfda1fSAndroid Build Coastguard Worker #if defined(DICT_IMPLEMENTATION) || !defined(KAZLIB_OPAQUE_DEBUG) 82*59bfda1fSAndroid Build Coastguard Worker dict_t *dict_dictptr; 83*59bfda1fSAndroid Build Coastguard Worker dnode_t dict_nilnode; 84*59bfda1fSAndroid Build Coastguard Worker #else 85*59bfda1fSAndroid Build Coastguard Worker int dict_dummmy; 86*59bfda1fSAndroid Build Coastguard Worker #endif 87*59bfda1fSAndroid Build Coastguard Worker } dict_load_t; 88*59bfda1fSAndroid Build Coastguard Worker 89*59bfda1fSAndroid Build Coastguard Worker extern dict_t *dict_create(dictcount_t, dict_comp_t); 90*59bfda1fSAndroid Build Coastguard Worker extern void dict_set_allocator(dict_t *, dnode_alloc_t, dnode_free_t, void *); 91*59bfda1fSAndroid Build Coastguard Worker extern void dict_destroy(dict_t *); 92*59bfda1fSAndroid Build Coastguard Worker extern void dict_free_nodes(dict_t *); 93*59bfda1fSAndroid Build Coastguard Worker extern void dict_free(dict_t *); 94*59bfda1fSAndroid Build Coastguard Worker extern dict_t *dict_init(dict_t *, dictcount_t, dict_comp_t); 95*59bfda1fSAndroid Build Coastguard Worker extern void dict_init_like(dict_t *, const dict_t *); 96*59bfda1fSAndroid Build Coastguard Worker extern int dict_verify(dict_t *); 97*59bfda1fSAndroid Build Coastguard Worker extern int dict_similar(const dict_t *, const dict_t *); 98*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dict_lookup(dict_t *, const void *); 99*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dict_lower_bound(dict_t *, const void *); 100*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dict_upper_bound(dict_t *, const void *); 101*59bfda1fSAndroid Build Coastguard Worker extern void dict_insert(dict_t *, dnode_t *, const void *); 102*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dict_delete(dict_t *, dnode_t *); 103*59bfda1fSAndroid Build Coastguard Worker extern int dict_alloc_insert(dict_t *, const void *, void *); 104*59bfda1fSAndroid Build Coastguard Worker extern void dict_delete_free(dict_t *, dnode_t *); 105*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dict_first(dict_t *); 106*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dict_last(dict_t *); 107*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dict_next(dict_t *, dnode_t *); 108*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dict_prev(dict_t *, dnode_t *); 109*59bfda1fSAndroid Build Coastguard Worker extern dictcount_t dict_count(dict_t *); 110*59bfda1fSAndroid Build Coastguard Worker extern int dict_isempty(dict_t *); 111*59bfda1fSAndroid Build Coastguard Worker extern int dict_isfull(dict_t *); 112*59bfda1fSAndroid Build Coastguard Worker extern int dict_contains(dict_t *, dnode_t *); 113*59bfda1fSAndroid Build Coastguard Worker extern void dict_allow_dupes(dict_t *); 114*59bfda1fSAndroid Build Coastguard Worker extern int dnode_is_in_a_dict(dnode_t *); 115*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dnode_create(void *); 116*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dnode_init(dnode_t *, void *); 117*59bfda1fSAndroid Build Coastguard Worker extern void dnode_destroy(dnode_t *); 118*59bfda1fSAndroid Build Coastguard Worker extern void *dnode_get(dnode_t *); 119*59bfda1fSAndroid Build Coastguard Worker extern const void *dnode_getkey(dnode_t *); 120*59bfda1fSAndroid Build Coastguard Worker extern void dnode_put(dnode_t *, void *); 121*59bfda1fSAndroid Build Coastguard Worker extern void dict_process(dict_t *, void *, dnode_process_t); 122*59bfda1fSAndroid Build Coastguard Worker extern void dict_load_begin(dict_load_t *, dict_t *); 123*59bfda1fSAndroid Build Coastguard Worker extern void dict_load_next(dict_load_t *, dnode_t *, const void *); 124*59bfda1fSAndroid Build Coastguard Worker extern void dict_load_end(dict_load_t *); 125*59bfda1fSAndroid Build Coastguard Worker extern void dict_merge(dict_t *, dict_t *); 126*59bfda1fSAndroid Build Coastguard Worker 127*59bfda1fSAndroid Build Coastguard Worker #if defined(DICT_IMPLEMENTATION) || !defined(KAZLIB_OPAQUE_DEBUG) 128*59bfda1fSAndroid Build Coastguard Worker #ifdef KAZLIB_SIDEEFFECT_DEBUG 129*59bfda1fSAndroid Build Coastguard Worker #define dict_isfull(D) (SFX_CHECK(D)->dict_nodecount == (D)->dict_maxcount) 130*59bfda1fSAndroid Build Coastguard Worker #else 131*59bfda1fSAndroid Build Coastguard Worker #define dict_isfull(D) ((D)->dict_nodecount == (D)->dict_maxcount) 132*59bfda1fSAndroid Build Coastguard Worker #endif 133*59bfda1fSAndroid Build Coastguard Worker #define dict_count(D) ((D)->dict_nodecount) 134*59bfda1fSAndroid Build Coastguard Worker #define dict_isempty(D) ((D)->dict_nodecount == 0) 135*59bfda1fSAndroid Build Coastguard Worker #define dnode_get(N) ((N)->dict_data) 136*59bfda1fSAndroid Build Coastguard Worker #define dnode_getkey(N) ((N)->dict_key) 137*59bfda1fSAndroid Build Coastguard Worker #define dnode_put(N, X) ((N)->dict_data = (X)) 138*59bfda1fSAndroid Build Coastguard Worker #endif 139*59bfda1fSAndroid Build Coastguard Worker 140*59bfda1fSAndroid Build Coastguard Worker #ifdef __cplusplus 141*59bfda1fSAndroid Build Coastguard Worker } 142*59bfda1fSAndroid Build Coastguard Worker #endif 143*59bfda1fSAndroid Build Coastguard Worker 144*59bfda1fSAndroid Build Coastguard Worker #endif 145