From 988b7e03ff43a6b1d2f6d5931f167dc7cc15345c Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Wed, 8 Mar 2017 21:31:28 +0100 Subject: [PATCH] Add bitset_hash operator --- m-bitset.h | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/m-bitset.h b/m-bitset.h index 6ecbec6b..819f7d6f 100644 --- a/m-bitset.h +++ b/m-bitset.h @@ -542,6 +542,23 @@ bitset_not(bitset_t dest) BITSETI_CONTRACT(dest); } +static inline size_t +bitset_hash(const bitset_t dest) +{ + BITSETI_CONTRACT(dest); + size_t s = dest->size; + size_t n = s / BITSET_LIMB_BIT; + size_t m = s % BITSET_LIMB_BIT; + M_HASH_DECL(hash); + for(size_t i = 0 ; i < n; i++) + M_HASH_UP(hash, dest->ptr[i]); + if (m) { + size_t mask = (1UL << m) - 1; + M_HASH_UP(hash, (dest->ptr[n] & mask)); + } + return hash; +} + #define BITSET_OPLIST \ (INIT(bitset_init) \ ,INIT_SET(bitset_init_set) \ @@ -563,12 +580,13 @@ bitset_not(bitset_t dest) ,CLEAN(bitset_clean) \ ,PUSH(bitset_push_back) \ ,POP(bitset_pop_back) \ + ,HASH(bitset_hash) \ ,GET_STR(bitset_get_str) \ ,OUT_STR(bitset_out_str) \ ,IN_STR(bitset_in_str) \ ,EQUAL(bitset_equal_p) \ ) -// TODO: set_at2, insert_v, remove_v, shrink_to_fit, hash +// TODO: set_at2, insert_v, remove_v, shrink_to_fit #endif