📄 dict.h
字号:
/* * Dictionary Abstract Data Type * Copyright (C) 1997 Kaz Kylheku <kaz@ashi.footprints.net> * * Free Software License: * * All rights are reserved by the author, with the following exceptions: * Permission is granted to freely reproduce and distribute this software, * possibly in exchange for a fee, provided that this copyright notice appears * intact. Permission is also granted to adapt this software to produce * derivative works, as long as the modified versions carry this copyright * notice and additional notices stating that the work has been modified. * This source code may be translated into executable form and incorporated * into proprietary software; there is no requirement for such software to * contain a copyright notice related to this source. * * $Id: dict.h,v 1.22.2.6 2000/11/13 01:36:44 kaz Exp $ * $Name: kazlib_1_20 $ */#ifndef DICT_H#define DICT_H#include <limits.h>#ifdef KAZLIB_SIDEEFFECT_DEBUG#include "sfx.h"#endif/* * Blurb for inclusion into C++ translation units */#ifdef __cplusplusextern "C" {#endiftypedef unsigned long dictcount_t;#define DICTCOUNT_T_MAX ULONG_MAX/* * The dictionary is implemented as a red-black tree */typedef enum { dnode_red, dnode_black } dnode_color_t;typedef struct dnode_t { #if defined(DICT_IMPLEMENTATION) || !defined(KAZLIB_OPAQUE_DEBUG) struct dnode_t *dict_left; struct dnode_t *dict_right; struct dnode_t *dict_parent; dnode_color_t dict_color; const void *dict_key; void *dict_data; #else int dict_dummy; #endif} dnode_t;typedef int (*dict_comp_t)(const void *, const void *);typedef dnode_t *(*dnode_alloc_t)(void *);typedef void (*dnode_free_t)(dnode_t *, void *);typedef struct dict_t { #if defined(DICT_IMPLEMENTATION) || !defined(KAZLIB_OPAQUE_DEBUG) dnode_t dict_nilnode; dictcount_t dict_nodecount; dictcount_t dict_maxcount; dict_comp_t dict_compare; dnode_alloc_t dict_allocnode; dnode_free_t dict_freenode; void *dict_context; int dict_dupes; #else int dict_dummmy; #endif} dict_t;typedef void (*dnode_process_t)(dict_t *, dnode_t *, void *);typedef struct dict_load_t { #if defined(DICT_IMPLEMENTATION) || !defined(KAZLIB_OPAQUE_DEBUG) dict_t *dict_dictptr; dnode_t dict_nilnode; #else int dict_dummmy; #endif} dict_load_t;extern dict_t *dict_create(dictcount_t, dict_comp_t);extern void dict_set_allocator(dict_t *, dnode_alloc_t, dnode_free_t, void *);extern void dict_destroy(dict_t *);extern void dict_free_nodes(dict_t *);extern void dict_free(dict_t *);extern dict_t *dict_init(dict_t *, dictcount_t, dict_comp_t);extern void dict_init_like(dict_t *, const dict_t *);extern int dict_verify(dict_t *);extern int dict_similar(const dict_t *, const dict_t *);extern dnode_t *dict_lookup(dict_t *, const void *);extern dnode_t *dict_lower_bound(dict_t *, const void *);extern dnode_t *dict_upper_bound(dict_t *, const void *);extern void dict_insert(dict_t *, dnode_t *, const void *);extern dnode_t *dict_delete(dict_t *, dnode_t *);extern int dict_alloc_insert(dict_t *, const void *, void *);extern void dict_delete_free(dict_t *, dnode_t *);extern dnode_t *dict_first(dict_t *);extern dnode_t *dict_last(dict_t *);extern dnode_t *dict_next(dict_t *, dnode_t *);extern dnode_t *dict_prev(dict_t *, dnode_t *);extern dictcount_t dict_count(dict_t *);extern int dict_isempty(dict_t *);extern int dict_isfull(dict_t *);extern int dict_contains(dict_t *, dnode_t *);extern void dict_allow_dupes(dict_t *);extern int dnode_is_in_a_dict(dnode_t *);extern dnode_t *dnode_create(void *);extern dnode_t *dnode_init(dnode_t *, void *);extern void dnode_destroy(dnode_t *);extern void *dnode_get(dnode_t *);extern const void *dnode_getkey(dnode_t *);extern void dnode_put(dnode_t *, void *);extern void dict_process(dict_t *, void *, dnode_process_t);extern void dict_load_begin(dict_load_t *, dict_t *);extern void dict_load_next(dict_load_t *, dnode_t *, const void *);extern void dict_load_end(dict_load_t *);extern void dict_merge(dict_t *, dict_t *);#if defined(DICT_IMPLEMENTATION) || !defined(KAZLIB_OPAQUE_DEBUG)#ifdef KAZLIB_SIDEEFFECT_DEBUG#define dict_isfull(D) (SFX_CHECK(D)->dict_nodecount == (D)->dict_maxcount)#else#define dict_isfull(D) ((D)->dict_nodecount == (D)->dict_maxcount)#endif#define dict_count(D) ((D)->dict_nodecount)#define dict_isempty(D) ((D)->dict_nodecount == 0)#define dnode_get(N) ((N)->dict_data)#define dnode_getkey(N) ((N)->dict_key)#define dnode_put(N, X) ((N)->dict_data = (X))#endif#ifdef __cplusplus}#endif#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -