Reformat and specify clz for bitset size = 0
This commit is contained in:
1 parent
e25e9ba29b
commit
709168652a
2 files changed
+10
-7
No files matched your search
+9
-7
@@ -385,7 +385,7 @@ bitset_swap (bitset_t v1, bitset_t v2)
|
|||||||
* Return the new carry.
|
* Return the new carry.
|
||||||
*/
|
*/
|
||||||
static inline bitset_limb_ct
|
static inline bitset_limb_ct
|
||||||
M_B1TSET_lshift(bitset_limb_ct ptr[], size_t n, bitset_limb_ct carry)
|
m_b1tset_lshift(bitset_limb_ct ptr[], size_t n, bitset_limb_ct carry)
|
||||||
{
|
{
|
||||||
for(size_t i = 0; i < n; i++) {
|
for(size_t i = 0; i < n; i++) {
|
||||||
bitset_limb_ct v = ptr[i];
|
bitset_limb_ct v = ptr[i];
|
||||||
@@ -400,7 +400,7 @@ M_B1TSET_lshift(bitset_limb_ct ptr[], size_t n, bitset_limb_ct carry)
|
|||||||
* Return the new carry.
|
* Return the new carry.
|
||||||
*/
|
*/
|
||||||
static inline bitset_limb_ct
|
static inline bitset_limb_ct
|
||||||
M_B1TSET_rshift(bitset_limb_ct ptr[], size_t n, bitset_limb_ct carry)
|
m_b1tset_rshift(bitset_limb_ct ptr[], size_t n, bitset_limb_ct carry)
|
||||||
{
|
{
|
||||||
for(size_t i = n - 1; i < n; i--) {
|
for(size_t i = n - 1; i < n; i--) {
|
||||||
bitset_limb_ct v = ptr[i];
|
bitset_limb_ct v = ptr[i];
|
||||||
@@ -430,7 +430,7 @@ bitset_push_at(bitset_t set, size_t key, bool value)
|
|||||||
set->ptr[offset] = v;
|
set->ptr[offset] = v;
|
||||||
size_t size = (set->size + M_B1TSET_LIMB_BIT - 1) / M_B1TSET_LIMB_BIT;
|
size_t size = (set->size + M_B1TSET_LIMB_BIT - 1) / M_B1TSET_LIMB_BIT;
|
||||||
M_ASSERT (size >= offset + 1);
|
M_ASSERT (size >= offset + 1);
|
||||||
v = M_B1TSET_lshift(&set->ptr[offset+1], size - offset - 1, carry);
|
v = m_b1tset_lshift(&set->ptr[offset+1], size - offset - 1, carry);
|
||||||
// v is unused.
|
// v is unused.
|
||||||
(void) v;
|
(void) v;
|
||||||
M_B1TSET_CONTRACT (set);
|
M_B1TSET_CONTRACT (set);
|
||||||
@@ -441,7 +441,7 @@ bitset_push_at(bitset_t set, size_t key, bool value)
|
|||||||
static inline void
|
static inline void
|
||||||
bitset_pop_at(bool *dest, bitset_t set, size_t key)
|
bitset_pop_at(bool *dest, bitset_t set, size_t key)
|
||||||
{
|
{
|
||||||
M_B1TSET_CONTRACT (set);
|
M_B1TSET_CONTRACT (set);
|
||||||
M_ASSERT (set->ptr != NULL);
|
M_ASSERT (set->ptr != NULL);
|
||||||
M_ASSERT_INDEX(key, set->size);
|
M_ASSERT_INDEX(key, set->size);
|
||||||
|
|
||||||
@@ -453,7 +453,7 @@ bitset_pop_at(bool *dest, bitset_t set, size_t key)
|
|||||||
size_t index = key % M_B1TSET_LIMB_BIT;
|
size_t index = key % M_B1TSET_LIMB_BIT;
|
||||||
size_t size = (set->size + M_B1TSET_LIMB_BIT - 1) / M_B1TSET_LIMB_BIT;
|
size_t size = (set->size + M_B1TSET_LIMB_BIT - 1) / M_B1TSET_LIMB_BIT;
|
||||||
bitset_limb_ct v, mask, carry;
|
bitset_limb_ct v, mask, carry;
|
||||||
carry = M_B1TSET_rshift(&set->ptr[offset+1], size - offset - 1, false);
|
carry = m_b1tset_rshift(&set->ptr[offset+1], size - offset - 1, false);
|
||||||
v = set->ptr[offset];
|
v = set->ptr[offset];
|
||||||
mask = (((bitset_limb_ct)1)<<index)-1;
|
mask = (((bitset_limb_ct)1)<<index)-1;
|
||||||
v = (v & mask) | ((v>>1) & ~mask) | (carry << (M_B1TSET_LIMB_BIT-1)) ;
|
v = (v & mask) | ((v>>1) & ~mask) | (carry << (M_B1TSET_LIMB_BIT-1)) ;
|
||||||
@@ -474,11 +474,11 @@ bitset_equal_p (const bitset_t set1, const bitset_t set2)
|
|||||||
/* We won't compare each bit individualy,
|
/* We won't compare each bit individualy,
|
||||||
but instead compare them per limb */
|
but instead compare them per limb */
|
||||||
const size_t limbSize = (set1->size) / M_B1TSET_LIMB_BIT;
|
const size_t limbSize = (set1->size) / M_B1TSET_LIMB_BIT;
|
||||||
|
const size_t index = set1->size % M_B1TSET_LIMB_BIT;
|
||||||
for(size_t i = 0 ; i < limbSize;i++)
|
for(size_t i = 0 ; i < limbSize;i++)
|
||||||
if (set1->ptr[i] != set2->ptr[i])
|
if (set1->ptr[i] != set2->ptr[i])
|
||||||
return false;
|
return false;
|
||||||
/* Compare the last limb if needed */
|
/* Compare the last limb if needed */
|
||||||
const size_t index = set1->size % M_B1TSET_LIMB_BIT;
|
|
||||||
if (index > 0) {
|
if (index > 0) {
|
||||||
const bitset_limb_ct mask = (((bitset_limb_ct)1) << index) - 1;
|
const bitset_limb_ct mask = (((bitset_limb_ct)1) << index) - 1;
|
||||||
if ((set1->ptr[limbSize] & mask) != (set2->ptr[limbSize] & mask))
|
if ((set1->ptr[limbSize] & mask) != (set2->ptr[limbSize] & mask))
|
||||||
@@ -744,7 +744,9 @@ bitset_clz(const bitset_t set)
|
|||||||
{
|
{
|
||||||
M_B1TSET_CONTRACT(set);
|
M_B1TSET_CONTRACT(set);
|
||||||
size_t s = set->size;
|
size_t s = set->size;
|
||||||
M_ASSERT_INDEX (0, s); // TBC: Special case to handle?
|
if (M_UNLIKELY (s == 0)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
size_t n = (s -1) / M_B1TSET_LIMB_BIT;
|
size_t n = (s -1) / M_B1TSET_LIMB_BIT;
|
||||||
size_t m = s % M_B1TSET_LIMB_BIT;
|
size_t m = s % M_B1TSET_LIMB_BIT;
|
||||||
bitset_limb_ct limb = set->ptr[n];
|
bitset_limb_ct limb = set->ptr[n];
|
||||||
|
|||||||
@@ -321,6 +321,7 @@ static void test_let(void)
|
|||||||
static void test_clz(void)
|
static void test_clz(void)
|
||||||
{
|
{
|
||||||
M_LET(s1, bitset_t) {
|
M_LET(s1, bitset_t) {
|
||||||
|
assert (bitset_clz(s1) == 0);
|
||||||
bitset_push_back(s1, false);
|
bitset_push_back(s1, false);
|
||||||
assert (bitset_clz(s1) == 1);
|
assert (bitset_clz(s1) == 1);
|
||||||
bitset_push_back(s1, false);
|
bitset_push_back(s1, false);
|
||||||
|
|||||||
Reference in new issue
Block a user