Files
libucore/include/ucore/bitvec.h
T
Nils O. Selåsdal 6268e6ac8e update comments
2013-06-19 18:48:27 +02:00

82 lines
2.0 KiB
C
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef BITEVEC_H_
#define 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);
// The _s ("secure") versions does boundary checking and assert() if they
// try to access a bit out of bounds.
void uc_bv_set_bit_s(struct UCBitVec *v,int b);
void uc_bv_clear_bit_s(struct UCBitVec *v,int b);
int uc_bv_get_bit_s(const struct UCBitVec *v,int b);
#ifdef __cplusplus
}
#endif
#endif