This repository has been archived on 2023-10-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-archive/source/blender/blenlib/BLI_smallhash.h
Campbell Barton 01f8b229c9 revert own change from 56177, game bounds can be useful to see in editmode,
also use gcc attributes for smallhash header and some style edits to recent commit.
2013-04-20 17:24:40 +00:00

86 lines
2.7 KiB
C++

/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2008 Blender Foundation.
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): Joseph Eagar.
*
* ***** END GPL LICENSE BLOCK *****
*/
#ifndef __BLI_SMALLHASH_H__
#define __BLI_SMALLHASH_H__
/** \file BLI_smallhash.h
* \ingroup bli
*/
/* a light stack-friendly hash library,
* (it uses stack space for smallish hash tables) */
/* based on a doubling non-chaining approach */
typedef struct {
uintptr_t key;
void *val;
} SmallHashEntry;
/*how much stack space to use before dynamically allocating memory*/
#define SMSTACKSIZE 521
typedef struct SmallHash {
SmallHashEntry *table;
SmallHashEntry _stacktable[SMSTACKSIZE];
SmallHashEntry _copytable[SMSTACKSIZE];
SmallHashEntry *stacktable, *copytable;
int used;
int curhash;
int size;
} SmallHash;
typedef struct {
SmallHash *hash;
int i;
} SmallHashIter;
#ifdef __GNUC__
# define ATTR_NONULL_FIRST __attribute__((nonnull(1)))
# define ATTR_UNUSED_RESULT __attribute__((warn_unused_result))
#else
# define ATTR_NONULL_FIRST
# define ATTR_UNUSED_RESULT
#endif
void BLI_smallhash_init(SmallHash *hash) ATTR_NONULL_FIRST;
void BLI_smallhash_release(SmallHash *hash) ATTR_NONULL_FIRST;
void BLI_smallhash_insert(SmallHash *hash, uintptr_t key, void *item) ATTR_NONULL_FIRST;
void BLI_smallhash_remove(SmallHash *hash, uintptr_t key) ATTR_NONULL_FIRST;
void *BLI_smallhash_lookup(SmallHash *hash, uintptr_t key) ATTR_NONULL_FIRST ATTR_UNUSED_RESULT;
int BLI_smallhash_haskey(SmallHash *hash, uintptr_t key) ATTR_NONULL_FIRST;
int BLI_smallhash_count(SmallHash *hash) ATTR_NONULL_FIRST;
void *BLI_smallhash_iternext(SmallHashIter *iter, uintptr_t *key) ATTR_NONULL_FIRST ATTR_UNUSED_RESULT;
void *BLI_smallhash_iternew(SmallHash *hash, SmallHashIter *iter, uintptr_t *key) ATTR_NONULL_FIRST ATTR_UNUSED_RESULT;
/* void BLI_smallhash_print(SmallHash *hash); */ /* UNUSED */
#undef ATTR_NONULL_FIRST
#undef ATTR_UNUSED_RESULT
#endif /* __BLI_SMALLHASH_H__ */