#ifndef UC_BITEVEC_H_ #define UC_BITEVEC_H_ #ifdef __cplusplus extern "C" { #endif struct UCBitVec { //storage for the bits unsigned long *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(unsigned long)*CHAR_BIT)) + (nbits % (sizeof(unsigned long)*CHAR_BIT) == 0 ? 0 : 1)) /** * Use as : * unsigned long 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