From aa10cf7f5cc3b2acdc0fd79b0eecccae029afcfa Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 15 Apr 2014 14:39:23 +1000 Subject: GHash: add BLI_ghashutil_uinthash_v4 for hashing 4 ints at once --- source/blender/blenlib/BLI_ghash.h | 6 ++++++ source/blender/blenlib/intern/BLI_ghash.c | 13 +++++++++++++ source/blender/bmesh/tools/bmesh_beautify.c | 12 +++++------- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/source/blender/blenlib/BLI_ghash.h b/source/blender/blenlib/BLI_ghash.h index 1e51bd9afea..d762876a55a 100644 --- a/source/blender/blenlib/BLI_ghash.h +++ b/source/blender/blenlib/BLI_ghash.h @@ -132,6 +132,12 @@ int BLI_ghashutil_strcmp(const void *a, const void *b); CHECK_TYPE_INLINE(key, int), \ BLI_ghashutil_uinthash((unsigned int)key)) unsigned int BLI_ghashutil_uinthash(unsigned int key); +#define BLI_ghashutil_inthash_v4(key) ( \ + CHECK_TYPE_INLINE(key, int *), \ + BLI_ghashutil_uinthash_v4((const unsigned int *)key)) +unsigned int BLI_ghashutil_uinthash_v4(const unsigned int key[4]); +#define BLI_ghashutil_inthash_v4_p \ + ((GSetHashFP)BLI_ghashutil_uinthash_v4) unsigned int BLI_ghashutil_inthash_p(const void *ptr); int BLI_ghashutil_intcmp(const void *a, const void *b); diff --git a/source/blender/blenlib/intern/BLI_ghash.c b/source/blender/blenlib/intern/BLI_ghash.c index 33a3ba30e4b..4849ef3e958 100644 --- a/source/blender/blenlib/intern/BLI_ghash.c +++ b/source/blender/blenlib/intern/BLI_ghash.c @@ -679,6 +679,19 @@ int BLI_ghashutil_ptrcmp(const void *a, const void *b) return (a < b) ? -1 : 1; } +unsigned int BLI_ghashutil_uinthash_v4(const unsigned int key[4]) +{ + unsigned int hash; + hash = key[0]; + hash *= 37; + hash += key[1]; + hash *= 37; + hash += key[2]; + hash *= 37; + hash += key[3]; + return hash; +} + unsigned int BLI_ghashutil_uinthash(unsigned int key) { key += ~(key << 16); diff --git a/source/blender/bmesh/tools/bmesh_beautify.c b/source/blender/bmesh/tools/bmesh_beautify.c index b19a7d0e9b6..8223a122e2b 100644 --- a/source/blender/bmesh/tools/bmesh_beautify.c +++ b/source/blender/bmesh/tools/bmesh_beautify.c @@ -59,16 +59,14 @@ typedef struct EdRotState { int f1, f2; /* face vert, small -> large */ } EdRotState; +#if 0 +/* use BLI_ghashutil_inthash_v4 direct */ static unsigned int erot_gsetutil_hash(const void *ptr) { const EdRotState *e_state = (const EdRotState *)ptr; - unsigned int hash; - hash = BLI_ghashutil_inthash(e_state->v1); - hash ^= BLI_ghashutil_inthash(e_state->v2); - hash ^= BLI_ghashutil_inthash(e_state->f1); - hash ^= BLI_ghashutil_inthash(e_state->f2); - return hash; + return BLI_ghashutil_inthash_v4(&e_state->v1); } +#endif static int erot_gsetutil_cmp(const void *a, const void *b) { const EdRotState *e_state_a = (const EdRotState *)a; @@ -86,7 +84,7 @@ static int erot_gsetutil_cmp(const void *a, const void *b) static GSet *erot_gset_new(void) { - return BLI_gset_new(erot_gsetutil_hash, erot_gsetutil_cmp, __func__); + return BLI_gset_new(BLI_ghashutil_inthash_v4_p, erot_gsetutil_cmp, __func__); } /* ensure v0 is smaller */ -- cgit v1.2.3