Annotation of embedaddon/quagga/isisd/dict.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Dictionary Abstract Data Type
                      3:  * Copyright (C) 1997 Kaz Kylheku <kaz@ashi.footprints.net>
                      4:  *
                      5:  * Free Software License:
                      6:  *
                      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.
                     16:  *
                     17:  * $Id: dict.h,v 1.3 2005/09/25 12:04:25 hasso Exp $
                     18:  * $Name:  $
                     19:  */
                     20: 
                     21: #ifndef DICT_H
                     22: #define DICT_H
                     23: 
                     24: #include <limits.h>
                     25: #ifdef KAZLIB_SIDEEFFECT_DEBUG
                     26: #include "sfx.h"
                     27: #endif
                     28: 
                     29: /*
                     30:  * Blurb for inclusion into C++ translation units
                     31:  */
                     32: 
                     33: #ifdef __cplusplus
                     34: extern "C" {
                     35: #endif
                     36: 
                     37: typedef unsigned long dictcount_t;
                     38: #define DICTCOUNT_T_MAX ULONG_MAX
                     39: 
                     40: /*
                     41:  * The dictionary is implemented as a red-black tree
                     42:  */
                     43: 
                     44: typedef enum { dnode_red, dnode_black } dnode_color_t;
                     45: 
                     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;
                     52:     const void *dict_key;
                     53:     void *dict_data;
                     54:     #else
                     55:     int dict_dummy;
                     56:     #endif
                     57: } dnode_t;
                     58: 
                     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 *);
                     62: 
                     63: typedef struct dict_t {
                     64:     #if defined(DICT_IMPLEMENTATION) || !defined(KAZLIB_OPAQUE_DEBUG)
                     65:     dnode_t dict_nilnode;
                     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;
                     71:     void *dict_context;
                     72:     int dict_dupes;
                     73:     #else
                     74:     int dict_dummmy;
                     75:     #endif
                     76: } dict_t;
                     77: 
                     78: typedef void (*dnode_process_t)(dict_t *, dnode_t *, void *);
                     79: 
                     80: typedef struct dict_load_t {
                     81:     #if defined(DICT_IMPLEMENTATION) || !defined(KAZLIB_OPAQUE_DEBUG)
                     82:     dict_t *dict_dictptr;
                     83:     dnode_t dict_nilnode;
                     84:     #else
                     85:     int dict_dummmy;
                     86:     #endif
                     87: } dict_load_t;
                     88: 
                     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 *);
                    126: 
                    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)
                    130: #else
                    131: #define dict_isfull(D) ((D)->dict_nodecount == (D)->dict_maxcount)
                    132: #endif
                    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))
                    138: #endif
                    139: 
                    140: #ifdef __cplusplus
                    141: }
                    142: #endif
                    143: 
                    144: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>