doxygen: add newline after \file
[blender.git] / source / blender / blenlib / BLI_smallhash.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2008 Blender Foundation.
17  * All rights reserved.
18  */
19
20 #ifndef __BLI_SMALLHASH_H__
21 #define __BLI_SMALLHASH_H__
22
23 /** \file
24  * \ingroup bli
25  */
26
27 #include "BLI_compiler_attrs.h"
28
29 typedef struct {
30         uintptr_t key;
31         void *val;
32 } SmallHashEntry;
33
34 /* how much stack space to use before dynamically allocating memory.
35  * set to match one of the values in 'hashsizes' to avoid too many mallocs  */
36 #define SMSTACKSIZE 131
37 typedef struct SmallHash {
38         unsigned int nbuckets;
39         unsigned int nentries;
40         unsigned int cursize;
41
42         SmallHashEntry *buckets;
43         SmallHashEntry  buckets_stack[SMSTACKSIZE];
44 } SmallHash;
45
46 typedef struct {
47         const SmallHash *sh;
48         unsigned int i;
49 } SmallHashIter;
50
51 void    BLI_smallhash_init_ex(SmallHash *sh,
52                               const unsigned int nentries_reserve) ATTR_NONNULL(1);
53 void    BLI_smallhash_init(SmallHash *sh) ATTR_NONNULL(1);
54 void    BLI_smallhash_release(SmallHash *sh) ATTR_NONNULL(1);
55 void    BLI_smallhash_insert(SmallHash *sh, uintptr_t key, void *item) ATTR_NONNULL(1);
56 bool    BLI_smallhash_reinsert(SmallHash *sh, uintptr_t key, void *item) ATTR_NONNULL(1);
57 bool    BLI_smallhash_remove(SmallHash *sh, uintptr_t key) ATTR_NONNULL(1);
58 void   *BLI_smallhash_lookup(const SmallHash *sh, uintptr_t key) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
59 void  **BLI_smallhash_lookup_p(const SmallHash *sh, uintptr_t key) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
60 bool    BLI_smallhash_haskey(const SmallHash *sh, uintptr_t key) ATTR_NONNULL(1);
61 int     BLI_smallhash_len(const SmallHash *sh)  ATTR_NONNULL(1);
62 void   *BLI_smallhash_iternext(SmallHashIter *iter, uintptr_t *key)  ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
63 void  **BLI_smallhash_iternext_p(SmallHashIter *iter, uintptr_t *key)  ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
64 void   *BLI_smallhash_iternew(const SmallHash *sh, SmallHashIter *iter, uintptr_t *key) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
65 void  **BLI_smallhash_iternew_p(const SmallHash *sh, SmallHashIter *iter, uintptr_t *key) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
66 /* void BLI_smallhash_print(SmallHash *sh); */ /* UNUSED */
67
68 #ifdef DEBUG
69 double BLI_smallhash_calc_quality(SmallHash *sh);
70 #endif
71
72 #endif /* __BLI_SMALLHASH_H__ */