Annotation of embedaddon/quagga/isisd/dict.h, revision 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>