47 #define ENTRIES_CAPACITY(container) (uint)(1 << (container)->capacity_exp)
48 #define MAP_CAPACITY(container) (uint)(1 << ((container)->capacity_exp + 1))
49 #define CLEAR_MAP(container) \
50 memset((container)->map, 0xFF, sizeof(int32_t) * MAP_CAPACITY(container))
51 #define UPDATE_SLOT_MASK(container) \
53 (container)->slot_mask = MAP_CAPACITY(container) - 1; \
56 #define PERTURB_SHIFT 5
58 #define ITER_SLOTS(CONTAINER, EDGE, SLOT, INDEX) \
59 uint32_t hash = calc_edge_hash(EDGE); \
60 uint32_t mask = (CONTAINER)->slot_mask; \
61 uint32_t perturb = hash; \
62 int32_t *map = (CONTAINER)->map; \
63 uint32_t SLOT = mask & hash; \
64 int INDEX = map[SLOT]; \
65 for (;; SLOT = mask & ((5 * SLOT) + 1 + perturb), perturb >>= PERTURB_SHIFT, INDEX = map[SLOT])
70 #define CAPACITY_EXP_DEFAULT 3
80 return (edge.v_low << 8) ^ edge.v_high;
102 return memcmp(&e1, &e2,
sizeof(
Edge)) == 0;
108 while (reserve >>= 1) {
120 #define EH_INDEX_HAS_EDGE(eh, index, edge) \
121 ((index) >= 0 && edges_equal((edge), (eh)->entries[index].edge))
146 entry->
value = value;
200 eh->
map[slot] = new_index;
240 printf(
"Edgehash at %p:\n", eh);
243 int index = eh->
map[i];
244 printf(
" %u: %d", i, index);
251 printf(
" Entries:\n");
254 printf(
" **** below is rest capacity ****\n");
292 return entry ? entry->
value : default_value;
332 if (free_value && value) {
335 return old_length > eh->
length;
421 #define ES_INDEX_HAS_EDGE(es, index, edge) \
422 (index) >= 0 && edges_equal((edge), (es)->entries[index])
457 es->
map[slot] = (int)entry_index;
void(* EdgeHashFreeFP)(void *key)
Strict compiler flags for areas of code we want to ensure don't do conversions without us knowing abo...
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
void BLI_edgehash_free(EdgeHash *eh, EdgeHashFreeFP free_value)
EdgeHash * BLI_edgehash_new_ex(const char *info, const uint reserve)
BLI_INLINE Edge init_edge(uint v0, uint v1)
BLI_INLINE EdgeHashEntry * edgehash_insert(EdgeHash *eh, Edge edge, void *value)
#define MAP_CAPACITY(container)
BLI_INLINE void edgehash_change_index(EdgeHash *eh, Edge edge, int new_index)
void BLI_edgehash_insert(EdgeHash *eh, uint v0, uint v1, void *value)
BLI_INLINE void edgehash_insert_index(EdgeHash *eh, Edge edge, uint entry_index)
void ** BLI_edgehash_lookup_p(EdgeHash *eh, uint v0, uint v1)
void BLI_edgehash_print(EdgeHash *eh)
BLI_INLINE void edgeset_ensure_can_insert(EdgeSet *es)
static void edgeset_insert_index(EdgeSet *es, Edge edge, uint entry_index)
#define CAPACITY_EXP_DEFAULT
static void edgehash_free_values(EdgeHash *eh, EdgeHashFreeFP free_value)
bool BLI_edgehash_reinsert(EdgeHash *eh, uint v0, uint v1, void *value)
void BLI_edgesetIterator_free(EdgeSetIterator *esi)
EdgeSet * BLI_edgeset_new_ex(const char *info, const uint reserve)
bool BLI_edgehash_haskey(const EdgeHash *eh, uint v0, uint v1)
void BLI_edgehashIterator_init(EdgeHashIterator *ehi, EdgeHash *eh)
void BLI_edgeset_free(EdgeSet *es)
void * BLI_edgehash_lookup(const EdgeHash *eh, uint v0, uint v1)
void BLI_edgehash_clear(EdgeHash *eh, EdgeHashFreeFP free_value)
EdgeSet * BLI_edgeset_new(const char *info)
void BLI_edgehashIterator_free(EdgeHashIterator *ehi)
#define CLEAR_MAP(container)
bool BLI_edgeset_haskey(const EdgeSet *es, uint v0, uint v1)
#define ENTRIES_CAPACITY(container)
EdgeHashIterator * BLI_edgehashIterator_new(EdgeHash *eh)
EdgeSetIterator * BLI_edgesetIterator_new(EdgeSet *es)
void * BLI_edgehash_popkey(EdgeHash *eh, uint v0, uint v1)
int BLI_edgeset_len(const EdgeSet *es)
#define EH_INDEX_HAS_EDGE(eh, index, edge)
BLI_INLINE EdgeHashEntry * edgehash_insert_at_slot(EdgeHash *eh, uint slot, Edge edge, void *value)
bool BLI_edgehash_remove(EdgeHash *eh, uint v0, uint v1, EdgeHashFreeFP free_value)
static uint calc_capacity_exp_for_reserve(uint reserve)
BLI_INLINE EdgeHashEntry * edgehash_lookup_entry(const EdgeHash *eh, uint v0, uint v1)
#define UPDATE_SLOT_MASK(container)
#define ITER_SLOTS(CONTAINER, EDGE, SLOT, INDEX)
BLI_INLINE bool edges_equal(Edge e1, Edge e2)
bool BLI_edgehash_ensure_p(EdgeHash *eh, uint v0, uint v1, void ***r_value)
BLI_INLINE uint32_t calc_edge_hash(Edge edge)
bool BLI_edgeset_add(EdgeSet *es, uint v0, uint v1)
EdgeHash * BLI_edgehash_new(const char *info)
void BLI_edgeset_insert(EdgeSet *es, uint v0, uint v1)
BLI_INLINE void edgeset_insert_at_slot(EdgeSet *es, uint slot, Edge edge)
void BLI_edgehash_clear_ex(EdgeHash *eh, EdgeHashFreeFP free_value, const uint UNUSED(reserve))
#define ES_INDEX_HAS_EDGE(es, index, edge)
int BLI_edgehash_len(const EdgeHash *eh)
BLI_INLINE bool edgehash_ensure_can_insert(EdgeHash *eh)
void * BLI_edgehash_lookup_default(const EdgeHash *eh, uint v0, uint v1, void *default_value)
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
T length(const vec_base< T, Size > &a)
struct _EdgeHash_Entry * entries
struct _EdgeHash_Edge * edges
struct _EdgeHash_Edge edge