xref: /freebsd/contrib/libucl/src/ucl_hash.h (revision a0409676)
1 /* Copyright (c) 2013, Vsevolod Stakhov
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *       * Redistributions of source code must retain the above copyright
7  *         notice, this list of conditions and the following disclaimer.
8  *       * Redistributions in binary form must reproduce the above copyright
9  *         notice, this list of conditions and the following disclaimer in the
10  *         documentation and/or other materials provided with the distribution.
11  *
12  * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY
13  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
14  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
15  * DISCLAIMED. IN NO EVENT SHALL AUTHOR BE LIABLE FOR ANY
16  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
17  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
18  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
19  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
20  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
21  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22  */
23 
24 #ifndef __UCL_HASH_H
25 #define __UCL_HASH_H
26 
27 #include "ucl.h"
28 
29 /******************************************************************************/
30 
31 struct ucl_hash_node_s;
32 typedef struct ucl_hash_node_s ucl_hash_node_t;
33 
34 typedef int (*ucl_hash_cmp_func) (const void* void_a, const void* void_b);
35 typedef void (*ucl_hash_free_func) (void *ptr);
36 typedef void* ucl_hash_iter_t;
37 
38 
39 /**
40  * Linear chained hashtable.
41  */
42 struct ucl_hash_struct;
43 typedef struct ucl_hash_struct ucl_hash_t;
44 
45 
46 /**
47  * Initializes the hashtable.
48  */
49 ucl_hash_t* ucl_hash_create (bool ignore_case);
50 
51 /**
52  * Deinitializes the hashtable.
53  */
54 void ucl_hash_destroy (ucl_hash_t* hashlin, ucl_hash_free_func func);
55 
56 /**
57  * Inserts an element in the the hashtable.
58  * @return true on success, false on failure (i.e. ENOMEM)
59  */
60 bool ucl_hash_insert (ucl_hash_t* hashlin, const ucl_object_t *obj, const char *key,
61 		unsigned keylen);
62 
63 /**
64  * Replace element in the hash
65  */
66 void ucl_hash_replace (ucl_hash_t* hashlin, const ucl_object_t *old,
67 		const ucl_object_t *new);
68 
69 /**
70  * Delete an element from the the hashtable.
71  */
72 void ucl_hash_delete (ucl_hash_t* hashlin, const ucl_object_t *obj);
73 
74 /**
75  * Searches an element in the hashtable.
76  */
77 const ucl_object_t* ucl_hash_search (ucl_hash_t* hashlin, const char *key,
78 		unsigned keylen);
79 
80 
81 /**
82  * Iterate over hash table
83  * @param hashlin hash
84  * @param iter iterator (must be NULL on first iteration)
85  * @param ep pointer record exception (such as ENOMEM), could be NULL
86  * @return the next object
87  */
88 const void* ucl_hash_iterate2 (ucl_hash_t *hashlin, ucl_hash_iter_t *iter, int *ep);
89 
90 /**
91  * Helper macro to support older code
92  */
93 #define ucl_hash_iterate(hl, ip) ucl_hash_iterate2((hl), (ip), NULL)
94 
95 /**
96  * Check whether an iterator has next element
97  */
98 bool ucl_hash_iter_has_next (ucl_hash_t *hashlin, ucl_hash_iter_t iter);
99 
100 /**
101  * Reserves space in hash
102  * @return true on sucess, false on failure (e.g. ENOMEM)
103  * @param hashlin
104  */
105 bool ucl_hash_reserve (ucl_hash_t *hashlin, size_t sz);
106 
107 void ucl_hash_sort (ucl_hash_t *hashlin, enum ucl_object_keys_sort_flags fl);
108 
109 #endif
110