mirror of https://gerrit.osmocom.org/libosmocore
Add function to get uninterrupted bit run
Function bitvec_rl_curbit added to get number of uninterrupted bits run in vector starting from the current bit till max number of bits. Test case is added to check bitvec_rl_curbit. Change-Id: Iae153d3639ea6b891c1fc10d7801a435c9492e26
This commit is contained in:
parent
592fcc97c0
commit
848de8f1df
|
@ -89,6 +89,7 @@ char bit_value_to_char(enum bit_value v);
|
|||
void bitvec_to_string_r(const struct bitvec *bv, char *str);
|
||||
void bitvec_zero(struct bitvec *bv);
|
||||
unsigned bitvec_rl(const struct bitvec *bv, bool b);
|
||||
unsigned bitvec_rl_curbit(struct bitvec *bv, bool b, int max_bits);
|
||||
void bitvec_shiftl(struct bitvec *bv, unsigned int n);
|
||||
int16_t bitvec_get_int16_msb(const struct bitvec *bv, unsigned int num_bits);
|
||||
unsigned int bitvec_add_array(struct bitvec *bv, const uint32_t *array,
|
||||
|
|
45
src/bitvec.c
45
src/bitvec.c
|
@ -575,6 +575,51 @@ unsigned bitvec_rl(const struct bitvec *bv, bool b)
|
|||
return bv->cur_bit;
|
||||
}
|
||||
|
||||
/*! \brief Return number (bits) of uninterrupted bit run in vector
|
||||
* starting from the current bit
|
||||
* \param[in] bv The boolean vector to work on
|
||||
* \param[in] b The boolean, sequence of 1's or 0's to be checked
|
||||
* \param[in] max_bits Total Number of Uncmopresed bits
|
||||
* \returns Number of consecutive bits of \p b in \p bv and cur_bit will
|
||||
* \go to cur_bit + number of consecutive bit
|
||||
*/
|
||||
unsigned bitvec_rl_curbit(struct bitvec *bv, bool b, int max_bits)
|
||||
{
|
||||
unsigned i = 0;
|
||||
unsigned j = 8;
|
||||
int temp_res = 0;
|
||||
int count = 0;
|
||||
unsigned readIndex = bv->cur_bit;
|
||||
unsigned remaining_bits = max_bits % 8;
|
||||
unsigned remaining_bytes = max_bits / 8;
|
||||
unsigned byte_mask = 0xFF;
|
||||
|
||||
if (readIndex % 8) {
|
||||
for (j -= (readIndex % 8) ; j > 0 ; j--) {
|
||||
if (readIndex < max_bits && bitvec_read_field(bv, &readIndex, 1) == b)
|
||||
temp_res++;
|
||||
else {
|
||||
bv->cur_bit--;
|
||||
return temp_res;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (i = (readIndex / 8);
|
||||
i < (remaining_bits ? remaining_bytes + 1 : remaining_bytes);
|
||||
i++, count++) {
|
||||
if ((b ? byte_mask : 0) != bv->data[i]) {
|
||||
bv->cur_bit = (count * 8 +
|
||||
leading_bits(bv->data[i], b) + readIndex);
|
||||
return count * 8 +
|
||||
leading_bits(bv->data[i], b) + temp_res;
|
||||
}
|
||||
}
|
||||
bv->cur_bit = (temp_res + (count * 8)) + readIndex;
|
||||
if (bv->cur_bit > max_bits)
|
||||
bv->cur_bit = max_bits;
|
||||
return (bv->cur_bit - readIndex + temp_res);
|
||||
}
|
||||
|
||||
/*! \brief Shifts bitvec to the left, n MSB bits lost */
|
||||
void bitvec_shiftl(struct bitvec *bv, unsigned n)
|
||||
{
|
||||
|
|
|
@ -150,6 +150,18 @@ static inline void test_array_item(unsigned t, struct bitvec *b, unsigned int n,
|
|||
}
|
||||
}
|
||||
|
||||
static inline void test_bitvec_rl_curbit(struct bitvec *bv, bool b, int max_bits,
|
||||
int result )
|
||||
{
|
||||
int num = 0;
|
||||
int readIndex = bv->cur_bit;
|
||||
OSMO_ASSERT(bv->cur_bit < max_bits);
|
||||
num = bitvec_rl_curbit(bv, b, max_bits);
|
||||
readIndex += num;
|
||||
OSMO_ASSERT(bv->cur_bit == readIndex);
|
||||
OSMO_ASSERT(num == result);
|
||||
}
|
||||
|
||||
static void test_array()
|
||||
{
|
||||
struct bitvec b;
|
||||
|
@ -245,7 +257,35 @@ int main(int argc, char **argv)
|
|||
|
||||
test_array();
|
||||
|
||||
printf("\nbitvec ok.\n");
|
||||
printf("\nbitvec_runlength....\n");
|
||||
|
||||
bitvec_zero(&bv);
|
||||
bitvec_set_uint(&bv, 0xff, 8);
|
||||
bv.cur_bit -= 8;
|
||||
test_bitvec_rl_curbit(&bv, 1, 64, 8);
|
||||
|
||||
bitvec_zero(&bv);
|
||||
bitvec_set_uint(&bv, 0xfc, 8);
|
||||
bv.cur_bit -= 8;
|
||||
test_bitvec_rl_curbit(&bv, 1, 64, 6);
|
||||
|
||||
bitvec_zero(&bv);
|
||||
test_bitvec_rl_curbit(&bv, 0, 52, 52);
|
||||
|
||||
bitvec_zero(&bv);
|
||||
bitvec_set_uint(&bv, 0xfc, 8);
|
||||
bv.cur_bit -= 2;
|
||||
test_bitvec_rl_curbit(&bv, 0, 64, 58);
|
||||
|
||||
bitvec_zero(&bv);
|
||||
bitvec_set_uint(&bv, 0x07, 8);
|
||||
bitvec_set_uint(&bv, 0xf8, 8);
|
||||
bv.cur_bit -= 11;
|
||||
test_bitvec_rl_curbit(&bv, 1, 64, 8);
|
||||
|
||||
bitvec_zero(&bv);
|
||||
test_bitvec_rl_curbit(&bv, 1, 64, 0);
|
||||
|
||||
printf("\nbitvec ok.\n");
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -166,4 +166,6 @@ bits: 17, est: 1153, real: 1153, x: 0, y: 0
|
|||
........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
|
||||
........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
|
||||
........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
|
||||
bitvec_runlength....
|
||||
|
||||
bitvec ok.
|
||||
|
|
Loading…
Reference in New Issue