/* Please see LICENSE for licensing information. */ #ifndef BITVECTOR_H_ #define BITVECTOR_H_ #include <assert.h> #include <stdlib.h> #include <stdint.h> #ifndef BOOL #define BOOL char #endif typedef struct BitVector { /** The data storage for the bitvector. */ uint32_t* data_; /** How many blocks of data we have for the bitvector. */ size_t numBlocks_; /** The number of bits in the bitvector. */ size_t numBits_; } BitVector; /** Create a new bitvector of size numBits. * All bits will be initialized to false. */ BitVector* bv_new(size_t numBits); /** Create a full copy of a bitvector. * The resulting bitvector will have the same number of bits, * each with the same truth value. */ BitVector* bv_copy(const BitVector* other); /** Delete a bitvector and associated memory. */ void bv_delete(BitVector* bv); /** Assign one bitvector's value to another. * * Only works on bitvectors of equal size. */ void bv_assign(BitVector* dst, const BitVector* other); /** Return true if a bit is set in a bitvector. * whichBit must be less than the bitvector's size. */ BOOL bv_is_set(const BitVector* bv, size_t whichBit); /** Set or clear a bit in a bitvector. * whichBit must be less than the bitvector's size. */ void bv_set_bit(BitVector* bv, size_t whichBit, BOOL toWhat); /** Set a bit in a bitvector. */ void bv_set(BitVector* bv, size_t whichBit); /** Clear a bit in a bitvector. */ void bv_unset(BitVector* bv, size_t whichBit); /** Clear all bits in a bitvector. */ void bv_clear(BitVector* bv); /** Test if a bitvector is a subset of another bitvector. * That is, if the other bitvector has at least the same bits set. * * Only works on bitvectors of equal size. */ BOOL bv_is_subset(const BitVector* subset, const BitVector* superset); /** Intersect one bitvector with another bitvector. * (In-place modification.) * * Only works on bitvectors of equal size. */ void bv_intersect(BitVector* bv, const BitVector* other); /** Union one bitvector with another bitvector. * (In-place modification.) * * Only works on bitvectors of equal size. */ void bv_union(BitVector* bv, const BitVector* other); /** Return true if two bitvectors are equal. * Bitvectors are equal if they have the same bits. */ BOOL bv_equal(const BitVector* bv1, const BitVector* bv2); /** Return the number of set (i.e. true) bits in the bitvector. */ size_t bv_num_set(const BitVector* bv); /** Return the total number of bits (set or not) in the bitvector. */ size_t bv_size(const BitVector* bv); #endif