tommytrie.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2010, Andrea Mazzoleni. 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
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25  * POSSIBILITY OF SUCH DAMAGE.
26  */
27 
125 #ifndef __TOMMYTRIE_H
126 #define __TOMMYTRIE_H
127 
128 #include "tommytypes.h"
129 #include "tommyalloc.h"
130 
131 /******************************************************************************/
132 /* trie */
133 
141 #define TOMMY_TRIE_TREE_MAX (64 / sizeof(void*))
142 
147 #define TOMMY_TRIE_BLOCK_SIZE (TOMMY_TRIE_TREE_MAX * sizeof(void*))
148 
152 #define TOMMY_TRIE_TREE_BIT TOMMY_ILOG2(TOMMY_TRIE_TREE_MAX)
153 
157 #define TOMMY_TRIE_BUCKET_BIT ((TOMMY_KEY_BIT % TOMMY_TRIE_TREE_BIT) + TOMMY_TRIE_TREE_BIT)
158 
163 #define TOMMY_TRIE_BUCKET_MAX (1 << TOMMY_TRIE_BUCKET_BIT)
164 
170 
175 typedef struct tommy_trie_struct {
176  tommy_trie_node* bucket[TOMMY_TRIE_BUCKET_MAX];
180 } tommy_trie;
181 
190 void tommy_trie_init(tommy_trie* trie, tommy_allocator* alloc);
191 
200 void tommy_trie_insert(tommy_trie* trie, tommy_trie_node* node, void* data, tommy_key_t key);
201 
210 void* tommy_trie_remove(tommy_trie* trie, tommy_key_t key);
211 
220 
228 tommy_inline void* tommy_trie_search(tommy_trie* trie, tommy_key_t key)
229 {
230  tommy_trie_node* i = tommy_trie_bucket(trie, key);
231 
232  if (!i)
233  return 0;
234 
235  return i->data;
236 }
237 
244 
249 {
250  return trie->count;
251 }
252 
258 
259 #endif
260 
tommy_allocator * alloc
Allocator for internal nodes.
Definition: tommytrie.h:179
Allocator of fixed size blocks.
Definition: tommyalloc.h:51
tommy_uint32_t tommy_key_t
Key type used in indexed data structures to store the key or the hash value.
Definition: tommytypes.h:160
tommy_uint32_t tommy_count_t
Generic unsigned integer for counting objects.
Definition: tommytypes.h:67
tommy_trie_node * tommy_trie_bucket(tommy_trie *trie, tommy_key_t key)
Gets the bucket of the specified key.
tommy_node tommy_trie_node
Trie node.
Definition: tommytrie.h:169
void * tommy_trie_remove(tommy_trie *trie, tommy_key_t key)
Searches and removes the first element with the specified key.
Trie container type.
Definition: tommytrie.h:175
tommy_count_t tommy_trie_count(tommy_trie *trie)
Gets the number of elements.
Definition: tommytrie.h:248
tommy_count_t node_count
Number of nodes.
Definition: tommytrie.h:178
Allocator of fixed size blocks.
tommy_trie_node * bucket[TOMMY_TRIE_BUCKET_MAX]
First tree level.
Definition: tommytrie.h:176
tommy_count_t count
Number of elements.
Definition: tommytrie.h:177
void tommy_trie_insert(tommy_trie *trie, tommy_trie_node *node, void *data, tommy_key_t key)
Inserts an element in the trie.
tommy_size_t tommy_trie_memory_usage(tommy_trie *trie)
Gets the size of allocated memory.
Data structure node.
Definition: tommytypes.h:183
void * data
Pointer to the object containing the node.
Definition: tommytypes.h:200
void * tommy_trie_remove_existing(tommy_trie *trie, tommy_trie_node *node)
Removes an element from the trie.
void * tommy_trie_search(tommy_trie *trie, tommy_key_t key)
Searches an element in the trie.
Definition: tommytrie.h:228
size_t tommy_size_t
Generic size_t type.
Definition: tommytypes.h:50
Generic types.
void tommy_trie_init(tommy_trie *trie, tommy_allocator *alloc)
Initializes the trie.
struct tommy_trie_struct tommy_trie
Trie container type.