79 lines
1.8 KiB
C
79 lines
1.8 KiB
C
#ifndef UC_BITEVEC_H_
|
||
#define UC_BITEVEC_H_
|
||
|
||
#include <limits.h>
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/** Backing type of the bit vector*/
|
||
typedef unsigned long uc_bv_integer;
|
||
|
||
struct UCBitVec {
|
||
//storage for the bits
|
||
uc_bv_integer *vec;
|
||
//length in bytes of the above vec.
|
||
size_t vec_len;
|
||
};
|
||
|
||
/**
|
||
* Evaluates the length required for a bitvec to store nbit bits.
|
||
*/
|
||
#define UC_BV_LEN(nbits) ((nbits/(sizeof(uc_bv_integer)*CHAR_BIT)) + (nbits % (sizeof(uc_bv_integer)*CHAR_BIT) == 0 ? 0 : 1))
|
||
|
||
/**
|
||
* Use as :
|
||
* uc_bv_integer v[10];
|
||
* struct UCBitVec v = BITVEC_STATIC_INIT(v);
|
||
*/
|
||
#define UC_BV_STATIC_INIT(vec_data)\
|
||
{\
|
||
vec_data,\
|
||
sizeof vec_data/sizeof vec_data[0]}
|
||
|
||
|
||
/**
|
||
* Returns a newly malloced bitvec, capable of storing at least nbits bits
|
||
* All bits are initially zero.
|
||
*
|
||
*/
|
||
struct UCBitVec *uc_bv_new(size_t nbits);
|
||
|
||
/** free a bitvec previously allocated by bitvec_new
|
||
*/
|
||
void uc_bv_free(struct UCBitVec *v);
|
||
|
||
//Note that accessing a bit beyond the nbits originally initialized
|
||
//for the given bitvec is undedefined
|
||
|
||
/** Sets bit no. b */
|
||
void uc_bv_set_bit(struct UCBitVec *v,int b);
|
||
|
||
/** Clears bit no. b*/
|
||
void uc_bv_clr_bit(struct UCBitVec *v,int b);
|
||
|
||
/** Gets the current value (0 or 1) of bit no. b*/
|
||
int uc_bv_get_bit(const struct UCBitVec *v,int b);
|
||
|
||
/** Sets all bits to zero */
|
||
void uc_bv_clr_all(struct UCBitVec *v);
|
||
|
||
/** Sets all bits to one */
|
||
void uc_bv_set_all(struct UCBitVec *v);
|
||
|
||
/** Initialize bits from a array of ints, each array element maps to one bit.
|
||
* The bits are initialized from the int array so zero maps to zero and non-zero maps to one.
|
||
* e..g to set the 5 first bits, to 01110:
|
||
* int a[] = {0,1,1,1,0};
|
||
* set_bits_from_array(v,a,5);
|
||
* */
|
||
void uc_bv_set_bits_from_array(struct UCBitVec *v,char *array,size_t array_len);
|
||
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif
|