GHash: add BLI_ghashutil_uinthash_v4 for hashing 4 ints at once

This commit is contained in:
2014-04-15 14:39:23 +10:00
parent cad4bfe653
commit aa10cf7f5c
3 changed files with 24 additions and 7 deletions

View File

@@ -132,6 +132,12 @@ int BLI_ghashutil_strcmp(const void *a, const void *b);
CHECK_TYPE_INLINE(key, int), \ CHECK_TYPE_INLINE(key, int), \
BLI_ghashutil_uinthash((unsigned int)key)) BLI_ghashutil_uinthash((unsigned int)key))
unsigned 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); unsigned int BLI_ghashutil_inthash_p(const void *ptr);
int BLI_ghashutil_intcmp(const void *a, const void *b); int BLI_ghashutil_intcmp(const void *a, const void *b);

View File

@@ -679,6 +679,19 @@ int BLI_ghashutil_ptrcmp(const void *a, const void *b)
return (a < b) ? -1 : 1; 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) unsigned int BLI_ghashutil_uinthash(unsigned int key)
{ {
key += ~(key << 16); key += ~(key << 16);

View File

@@ -59,16 +59,14 @@ typedef struct EdRotState {
int f1, f2; /* face vert, small -> large */ int f1, f2; /* face vert, small -> large */
} EdRotState; } EdRotState;
#if 0
/* use BLI_ghashutil_inthash_v4 direct */
static unsigned int erot_gsetutil_hash(const void *ptr) static unsigned int erot_gsetutil_hash(const void *ptr)
{ {
const EdRotState *e_state = (const EdRotState *)ptr; const EdRotState *e_state = (const EdRotState *)ptr;
unsigned int hash; return BLI_ghashutil_inthash_v4(&e_state->v1);
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;
} }
#endif
static int erot_gsetutil_cmp(const void *a, const void *b) static int erot_gsetutil_cmp(const void *a, const void *b)
{ {
const EdRotState *e_state_a = (const EdRotState *)a; 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) 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 */ /* ensure v0 is smaller */