2f313d36a367752cb1925bf3b514cc5c11ce343b tdreszer Mon Jan 28 11:45:16 2013 -0800 Added local memeory support for bits and a couple of routines to query lm size. diff --git src/inc/bits.h src/inc/bits.h index 7450097..16df498 100644 --- src/inc/bits.h +++ src/inc/bits.h @@ -1,76 +1,99 @@ /* bits - handle operations on arrays of bits. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef BITS_H #define BITS_H +#include "localmem.h" + typedef unsigned char Bits; #define bitToByteSize(bitSize) ((bitSize+7)/8) /* Convert number of bits to number of bytes needed to store bits. */ Bits *bitAlloc(int bitCount); /* Allocate bits. */ Bits *bitRealloc(Bits *b, int bitCount, int newBitCount); /* Resize a bit array. If b is null, allocate a new array */ Bits *bitClone(Bits* orig, int bitCount); /* Clone bits. */ void bitFree(Bits **pB); /* Free bits. */ +Bits *lmBitAlloc(struct lm *lm,int bitCount); +// Allocate bits. Optionally supply local memory. + +Bits *lmBitRealloc(struct lm *lm, Bits *b, int bitCount, int newBitCount); +// Resize a bit array. If b is null, allocate a new array. Optionally use local memory. + +Bits *lmBitClone(struct lm *lm, Bits* orig, int bitCount); +// Clone bits. Optionally use local memory. + +void lmBitFree(struct lm *lm, Bits **pB); +// Free bits. If allocated from local memory, this does nothing. + void bitSetOne(Bits *b, int bitIx); /* Set a single bit. */ void bitClearOne(Bits *b, int bitIx); /* Clear a single bit. */ void bitSetRange(Bits *b, int startIx, int bitCount); /* Set a range of bits. */ boolean bitReadOne(Bits *b, int bitIx); /* Read a single bit. */ int bitCountRange(Bits *b, int startIx, int bitCount); /* Count number of bits set in range. */ int bitFindSet(Bits *b, int startIx, int bitCount); /* Find the index of the the next set bit. */ int bitFindClear(Bits *b, int startIx, int bitCount); /* Find the index of the the next clear bit. */ void bitClear(Bits *b, int bitCount); /* Clear many bits (possibly up to 7 beyond bitCount). */ void bitClearRange(Bits *b, int startIx, int bitCount); /* Clear a range of bits. */ void bitAnd(Bits *a, Bits *b, int bitCount); /* And two bitmaps. Put result in a. */ +int bitAndCount(Bits *a, Bits *b, int bitCount); +// Without altering 2 bitmaps, count the AND bits. + void bitOr(Bits *a, Bits *b, int bitCount); /* Or two bitmaps. Put result in a. */ +int bitOrCount(Bits *a, Bits *b, int bitCount); +// Without altering 2 bitmaps, count the OR'd bits. + void bitXor(Bits *a, Bits *b, int bitCount); /* Xor two bitmaps. Put result in a. */ +int bitXorCount(Bits *a, Bits *b, int bitCount); +// Without altering 2 bitmaps, count the XOR'd bits. + void bitNot(Bits *a, int bitCount); /* Flip all bits in a. */ void bitPrint(Bits *a, int startIx, int bitCount, FILE* out); /* Print part or all of bit map as a string of 0s and 1s. Mostly useful for * debugging */ extern int bitsInByte[256]; /* Lookup table for how many bits are set in a byte. */ void bitsInByteInit(); /* Initialize bitsInByte array. */ #endif /* BITS_H */