1 /* 2 * 3 * Thread-safe Dictionary Using String Identifiers 4 * Copyright 1998-2000 Scott Shambarger (scott (at) shambarger.net) 5 * 6 * This software is open source. Permission to use, copy, modify, and 7 * distribute this software for any purpose and without fee is hereby granted, 8 * provided that the above copyright notice appear in all copies. No 9 * warranty of any kind is expressed or implied. Use at your own risk. 10 * 11 */ 12 13 14 #ifndef __DICT_H_ 15 #define __DICT_H_ 16 17 __BEGIN_DECLS 18 19 typedef struct _dictCtx *dictCtx; 20 typedef BOOL (*dictCleanupFunc)(char *id, void *value, void *rock); 21 typedef void (*dictFreeValueFunc)(void *value, void *rock); 22 23 NEOERR *dictCreate(dictCtx *dict, BOOL threaded, UINT32 root, UINT32 maxLevel, 24 UINT32 flushLimit, BOOL useCase, 25 dictFreeValueFunc freeValue, void *freeRock); 26 /* 27 * Function: dictCreate - create new dictionary. 28 * Description: Returns a dictionary. If <threaded> is true, list is 29 * multi-thread safe. <root>, <maxLevel>, and <flushLimit> 30 * act as for skipNewList() (see skiplist.h) 31 * Input: threaded - true if list should be thread-safe. 32 * root - performance parameter (see above). 33 * maxLevel - performance parameter (see above). 34 * flushLimit - max deleted items to keep cached before 35 * forcing a flush. 36 * useCase - true to be case sensitive in identifiers 37 * freeValue - callback when freeing a value 38 * freeRock - context for freeValue callback 39 * Output: None. 40 * Return: New dictionary, NULL on error. 41 * MT-Level: Safe. 42 */ 43 44 void dictDestroy(dictCtx dict); 45 /* 46 * Function: dictDestroy - destroy dictionary. 47 * Description: Release all resources used by <dict>. 48 * Input: dict - dictionary to destroy 49 * Output: None. 50 * Return: None. 51 * MT-Level: Safe for unique <dict>. 52 */ 53 54 BOOL dictRemove(dictCtx dict, const char *id); 55 /* 56 * Function: dictRemove - remove item from dictionary. 57 * Description: Removes item identified by <id> from <dict>. 58 * Input: dict - dictionary to search in. 59 * id - identifier of item to remove. 60 * Output: None. 61 * Return: true if item found, false if not. 62 * MT-Level: Safe if <dict> thread-safe. 63 */ 64 65 void *dictSearch(dictCtx dict, const char *id, void **plock); 66 /* 67 * Function: dictSearch - search for value in dictionary. 68 * Description: Searches for <id> in <dict>, and returns value if 69 * found, or NULL if not. If <plock> is non-NULL, then 70 * the lock returned in <plock> will be associated with 71 * the returned value. Until this lock is passed to 72 * dictReleaseLock(), the value will not be passed to the 73 * dictCleanupFunc callback (see dictCleanup()). 74 * Input: dict - dictionary to search in. 75 * id - identifier of item to find. 76 * plock - place for value lock (or NULL). 77 * Output: plock - set to value lock. 78 * Return: Value associated with <id>, or NULL if <id> not found. 79 * MT-Level: Safe if <dict> thread-safe. 80 */ 81 82 void *dictNext(dictCtx dict, char **id, void **plock); 83 /* 84 * Function: dictNext - search for next value in dictionary. 85 * Description: Can be used to iterate through values in the dictionary. 86 * The order is the order of the hash of the ids, which 87 * isn't usefully externally. Will return the value if 88 * found, or NULL if not. If <plock> is non-NULL, then 89 * the lock returned in <plock> will be associated with 90 * the returned value. Until this lock is passed to 91 * dictReleaseLock(), the value will not be passed to the 92 * dictCleanupFunc callback (see dictCleanup()). 93 * Input: dict - dictionary to iterate over. 94 * id - pointer to identifier of last item found, or 95 * pointer to NULL to retrieve first. 96 * plock - place for value lock (or NULL). 97 * Output: plock - set to value lock. 98 * id - pointer to id of found value 99 * Return: Value associated with <id>, or NULL if <id> not found. 100 * MT-Level: Safe if <dict> thread-safe. 101 */ 102 103 void dictReleaseLock(dictCtx dict, void *lock); 104 /* 105 * Function: dictReleaseLock - release lock on value. 106 * Description: Releases the lock on the value associated with <lock>. Once 107 * the lock is released, the dictCleanupFunc callback can 108 * be called for the value (see dictCleanup()). 109 * Input: dict - dictionary containing value to release. 110 * lock - lock to release. 111 * Output: None. 112 * Return: None. 113 * MT-Level: Safe if <dict> thread-safe. 114 */ 115 116 NEOERR *dictSetValue(dictCtx dict, const char *id, void *value); 117 /* 118 * Function: dictSetValue - set/reset an items value. 119 * Description: Updates the <id>/<value> pair into <dict>. 120 * If <id> is not in <dict>, it is created. 121 * Input: dict - dictionary to add pair to. 122 * id - identifier to insert/update 123 * value - value to store (may NOT be NULL) 124 * Output: None. 125 * Return: true if inserted/updated, false if error 126 * MT-Level: Safe if <dict> thread-safe. 127 */ 128 129 typedef NEOERR *(*dictNewValueCB)(const char *id, void *rock, void **new_val); 130 typedef NEOERR *(*dictUpdateValueCB)(const char *id, void *value, void *rock); 131 132 NEOERR *dictModifyValue(dictCtx dict, const char *id, dictNewValueCB new_cb, 133 dictUpdateValueCB update, void *rock); 134 /* 135 * Function: dictModifyValue - create/modify an item. 136 * Description: Finds <id>'s value and calls <update>. If <id> is 137 * not in <dict>, calls <new> to obtain a new value. 138 * Input: dict - dictionary to add pair to. 139 * id - identifier of value 140 * new - function to call to create new value (may be NULL) 141 * update - function to call to modify value (if NULL, the old 142 * value is freed, and <new> is used) 143 * rock - context to pass to <new> or <update>. 144 * Output: None. 145 * Return: true if inserted/updated, false if error 146 * MT-Level: Safe if <dict> thread-safe. 147 */ 148 149 void dictCleanup(dictCtx dict, dictCleanupFunc cleanup, void *rock); 150 /* 151 * Function: dictCleanup - cleanup dictionary 152 * Description: Calls <cleanup> for every item in <dict>. If <cleanup> 153 * returns true, then item is removed from <dict>. 154 * Input: dict - dictionary to cleanup 155 * cleanup - cleanup callback 156 * rock - to pass to <cleanup> 157 * Output: None. 158 * Return: None. 159 * MT-Level: Safe if <dict> thread-safe. 160 */ 161 162 __END_DECLS 163 164 #endif /* __DICT_H_ */ 165