GHash: add BLI_ghashutil_uinthash_v4 for hashing 4 ints at once
This commit is contained in:
@@ -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);
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
@@ -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 */
|
||||||
|
Reference in New Issue
Block a user