xref: /freebsd/contrib/libucl/src/ucl_hash.h (revision 907b59d76938e654f0d040a888e8dfca3de1e222)
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  */
59 void ucl_hash_insert (ucl_hash_t* hashlin, const ucl_object_t *obj, const char *key,
60 		unsigned keylen);
61 
62 /**
63  * Replace element in the hash
64  */
65 void ucl_hash_replace (ucl_hash_t* hashlin, const ucl_object_t *old,
66 		const ucl_object_t *new);
67 
68 /**
69  * Delete an element from the the hashtable.
70  */
71 void ucl_hash_delete (ucl_hash_t* hashlin, const ucl_object_t *obj);
72 
73 /**
74  * Searches an element in the hashtable.
75  */
76 const ucl_object_t* ucl_hash_search (ucl_hash_t* hashlin, const char *key,
77 		unsigned keylen);
78 
79 
80 /**
81  * Iterate over hash table
82  * @param hashlin hash
83  * @param iter iterator (must be NULL on first iteration)
84  * @return the next object
85  */
86 const void* ucl_hash_iterate (ucl_hash_t *hashlin, ucl_hash_iter_t *iter);
87 
88 /**
89  * Check whether an iterator has next element
90  */
91 bool ucl_hash_iter_has_next (ucl_hash_t *hashlin, ucl_hash_iter_t iter);
92 
93 #endif
94