Return to ghash.h CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / mpd / src / contrib / libpdel / util |
1.1 misho 1: 2: /* 3: * Copyright (c) 2001-2002 Packet Design, LLC. 4: * All rights reserved. 5: * 6: * Subject to the following obligations and disclaimer of warranty, 7: * use and redistribution of this software, in source or object code 8: * forms, with or without modifications are expressly permitted by 9: * Packet Design; provided, however, that: 10: * 11: * (i) Any and all reproductions of the source or object code 12: * must include the copyright notice above and the following 13: * disclaimer of warranties; and 14: * (ii) No rights are granted, in any manner or form, to use 15: * Packet Design trademarks, including the mark "PACKET DESIGN" 16: * on advertising, endorsements, or otherwise except as such 17: * appears in the above copyright notice or in the software. 18: * 19: * THIS SOFTWARE IS BEING PROVIDED BY PACKET DESIGN "AS IS", AND 20: * TO THE MAXIMUM EXTENT PERMITTED BY LAW, PACKET DESIGN MAKES NO 21: * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING 22: * THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED 23: * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, 24: * OR NON-INFRINGEMENT. PACKET DESIGN DOES NOT WARRANT, GUARANTEE, 25: * OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS 26: * OF THE USE OF THIS SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY, 27: * RELIABILITY OR OTHERWISE. IN NO EVENT SHALL PACKET DESIGN BE 28: * LIABLE FOR ANY DAMAGES RESULTING FROM OR ARISING OUT OF ANY USE 29: * OF THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY DIRECT, 30: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE, OR CONSEQUENTIAL 31: * DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF 32: * USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY THEORY OF 33: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 34: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 35: * THE USE OF THIS SOFTWARE, EVEN IF PACKET DESIGN IS ADVISED OF 36: * THE POSSIBILITY OF SUCH DAMAGE. 37: * 38: * Author: Archie Cobbs <archie@freebsd.org> 39: */ 40: 41: #ifndef _PDEL_UTIL_GHASH_H_ 42: #define _PDEL_UTIL_GHASH_H_ 43: 44: /* 45: * General purpose hash table stuff. 46: */ 47: 48: /********************************************************************** 49: HASH TABLE FUNCTION TYPES 50: **********************************************************************/ 51: 52: struct ghash; 53: struct ghash_walk; 54: 55: /* 56: * How to compare two items for equality. 57: * 58: * If this function is not specified, then "item1 == item2" is used. 59: */ 60: typedef int ghash_equal_t(struct ghash *g, 61: const void *item1, const void *item2); 62: 63: /* 64: * How to compute the hash value for an item. 65: * 66: * If this function is not specified, then "(u_int32_t)item" is used. 67: */ 68: typedef u_int32_t ghash_hash_t(struct ghash *g, const void *item); 69: 70: /* 71: * Notification that an item is being added to the table. 72: * 73: * Supplying this function is optional. 74: */ 75: typedef void ghash_add_t(struct ghash *g, void *item); 76: 77: /* 78: * Notification that an item is being removed from the table. 79: * 80: * Supplying this function is optional. 81: */ 1.1.1.2 ! misho 82: typedef void ghash_del_t(struct ghash *g, const void *item); 1.1 misho 83: 84: /********************************************************************** 85: HASH TABLE METHODS 86: **********************************************************************/ 87: 88: __BEGIN_DECLS 89: 90: /* 91: * Create a new hash table. 92: * 93: * "isize" is the initial table size, or zero for the default. 94: * 95: * "maxload" is the maximum hash table load in percent, or zero 96: * for the default which is 75 (i.e., 75%). 97: * 98: * The "hash", "equal", "add", and "del" methods are optional (see above). 99: */ 100: extern struct ghash *ghash_create(void *arg, u_int isize, u_int maxload, 101: const char *mtype, ghash_hash_t *hash, 102: ghash_equal_t *equal, ghash_add_t *add, 103: ghash_del_t *del); 104: 105: /* 106: * Destroy a hash table. 107: * 108: * Any items remaining in the table will be removed first. 109: */ 110: extern void ghash_destroy(struct ghash **gp); 111: 112: /* 113: * Get the argument supplied to ghash_create(). 114: */ 115: extern void *ghash_arg(struct ghash *g); 116: 117: /* 118: * Get an item. 119: * 120: * Returns the item, or NULL if the item does not exist. 121: */ 1.1.1.2 ! misho 122: extern void *ghash_get(struct ghash *g, void *item); 1.1 misho 123: 124: /* 125: * Put an item. 126: * 127: * Returns 0 if the item is new, 1 if it replaces an existing 128: * item, and -1 if there was an error. 129: */ 1.1.1.2 ! misho 130: extern int ghash_put(struct ghash *g, void *item); 1.1 misho 131: 132: /* 133: * Remove an item. 134: * 135: * Returns 1 if the item was found and removed, 0 if not found. 136: */ 137: extern int ghash_remove(struct ghash *g, const void *item); 138: 139: /* 140: * Get the size of the table. 141: */ 142: extern u_int ghash_size(struct ghash *g); 143: 144: /* 145: * Get an array of all items in the table. 146: * 147: * Returns number of items in the list, or -1 if error. 148: * Caller must free the list. 149: */ 150: extern int ghash_dump(struct ghash *g, void ***listp, const char *mtype); 151: 152: /* 153: * Start a hash table walk. Caller must supply a pointer to a 154: * 'struct ghash_walk' (see below) which is used to store the 155: * position in the table for ghash_walk_next(). 156: */ 157: extern void ghash_walk_init(struct ghash *g, struct ghash_walk *walk); 158: 159: /* 160: * Get the next item in the hash table walk, or NULL if the walk 161: * is finished (ENOENT) or the table has been modified (EINVAL). 162: * 163: * This is only valid if the hash table has not been modified 164: * since the previous call to ghash_walk_init() or ghash_walk_next(). 165: */ 166: extern void *ghash_walk_next(struct ghash *g, struct ghash_walk *walk); 167: 168: __END_DECLS 169: 170: struct ghash_walk { 171: u_int mods; 172: u_int bucket; 173: struct gent *e; 174: }; 175: 176: /********************************************************************** 177: ITERATOR METHODS 178: **********************************************************************/ 179: 180: struct ghash_iter; 181: 182: __BEGIN_DECLS 183: 184: extern int ghash_iter_has_next(struct ghash_iter *iter); 185: extern void *ghash_iter_next(struct ghash_iter *iter); 186: extern int ghash_iter_remove(struct ghash_iter *iter); 187: 188: extern struct ghash_iter *ghash_iter_create(struct ghash *g); 189: extern void ghash_iter_destroy(struct ghash_iter **iterp); 190: 191: __END_DECLS 192: 193: #endif /* _PDEL_UTIL_GHASH_H_ */ 194: