BRL-CAD
|
Routines for managing efficient high-performance bit vectors of arbitrary length. More...
Files | |
file | bitv.h |
Data Structures | |
struct | bu_bitv |
Macros | |
#define | BU_BITV_SHIFT bu_bitv_shift() |
#define | BU_BITV_MASK ((1<<BU_BITV_SHIFT)-1) |
#define | BU_BITV_NULL ((struct bu_bitv *)0) |
#define | BU_CK_BITV(_bp) BU_CKMAG(_bp, BU_BITV_MAGIC, "bu_bitv") |
#define | BU_BITV_INIT(_bp) |
#define | BU_BITV_INIT_ZERO { {BU_BITV_MAGIC, BU_LIST_NULL, BU_LIST_NULL}, 0, {0, 0} } |
#define | BU_BITV_IS_INITIALIZED(_bp) (((struct bu_bitv *)(_bp) != BU_BITV_NULL) && LIKELY((_bp)->l.magic == BU_BITV_MAGIC)) |
#define | BU_WORDS2BITS(_nw) ((size_t)(_nw>0?_nw:0)*sizeof(bitv_t)*8) |
#define | BU_BITS2WORDS(_nb) (((size_t)(_nb>0?_nb:0)+BU_BITV_MASK)>>BU_BITV_SHIFT) |
#define | BU_BITS2BYTES(_nb) (BU_BITS2WORDS(_nb)*sizeof(bitv_t)) |
#define | BU_BITTEST(_bv, bit) (((_bv)->bits[(bit)>>BU_BITV_SHIFT] & (((bitv_t)1)<<((bit)&BU_BITV_MASK)))!=0) |
#define | BU_BITSET(_bv, bit) ((_bv)->bits[(bit)>>BU_BITV_SHIFT] |= (((bitv_t)1)<<((bit)&BU_BITV_MASK))) |
#define | BU_BITCLR(_bv, bit) ((_bv)->bits[(bit)>>BU_BITV_SHIFT] &= ~(((bitv_t)1)<<((bit)&BU_BITV_MASK))) |
#define | BU_BITV_ZEROALL(_bv) |
#define | BU_BITV_BITNUM_CHECK(_bv, _bit) |
#define | BU_BITV_NBITS_CHECK(_bv, _nbits) |
#define | BU_BITV_LOOP_START(_bv) |
#define | BU_BITV_LOOP_INDEX ((_wd << BU_BITV_SHIFT) | _b) |
#define | BU_BITV_LOOP_END |
Typedefs | |
typedef unsigned char | bitv_t |
typedef struct bu_bitv | bu_bitv_t |
Functions | |
size_t | bu_bitv_shift (void) |
struct bu_bitv * | bu_bitv_new (size_t nbits) |
void | bu_bitv_free (struct bu_bitv *bv) |
void | bu_bitv_clear (struct bu_bitv *bv) |
void | bu_bitv_or (struct bu_bitv *ov, const struct bu_bitv *iv) |
void | bu_bitv_and (struct bu_bitv *ov, const struct bu_bitv *iv) |
void | bu_bitv_vls (struct bu_vls *v, const struct bu_bitv *bv) |
void | bu_pr_bitv (const char *str, const struct bu_bitv *bv) |
void | bu_bitv_to_hex (struct bu_vls *v, const struct bu_bitv *bv) |
struct bu_bitv * | bu_hex_to_bitv (const char *str) |
void | bu_bitv_to_binary (struct bu_vls *v, const struct bu_bitv *bv) |
struct bu_bitv * | bu_binary_to_bitv (const char *str) |
struct bu_bitv * | bu_binary_to_bitv2 (const char *str, const int nbytes) |
int | bu_bitv_compare_equal (const struct bu_bitv *, const struct bu_bitv *) |
int | bu_bitv_compare_equal2 (const struct bu_bitv *, const struct bu_bitv *) |
struct bu_bitv * | bu_bitv_dup (const struct bu_bitv *bv) |
int | bu_hexstr_to_binstr (const char *hexstr, struct bu_vls *b) |
int | bu_binstr_to_hexstr (const char *binstr, struct bu_vls *h) |
void | bu_printb (const char *label, unsigned long bits, const char *format) |
Bit field printing implementation. More... | |
void | bu_vls_printb (struct bu_vls *vls, const char *label, unsigned long bits, const char *format) |
Routines for managing efficient high-performance bit vectors of arbitrary length.
The basic type "bitv_t" is defined in include/bu.h; it is the widest integer datatype for which efficient hardware support exists. BU_BITV_SHIFT and BU_BITV_MASK are also defined in bu.h
These bit vectors are "little endian", bit 0 is in the right hand side of the [0] word.
#define BU_BITV_SHIFT bu_bitv_shift() |
Bit vector shift size
Should equal to: log2(sizeof(bitv_t)*8.0). Using bu_bitv_shift() will return a run-time computed shift size if the size of a bitv_t changes. Performance impact is rather minimal for most models but disabled for a handful of primitives that heavily rely on bit vectors.
(8-bit type: 3, 16-bit type: 4, 32-bit type: 5, 64-bit type: 6)
#define BU_BITV_MASK ((1<<BU_BITV_SHIFT)-1) |
#define BU_CK_BITV | ( | _bp | ) | BU_CKMAG(_bp, BU_BITV_MAGIC, "bu_bitv") |
#define BU_BITV_INIT | ( | _bp | ) |
initializes a bu_bitv struct without allocating any memory. this macro is not suitable for initializing a head list node.
#define BU_BITV_INIT_ZERO { {BU_BITV_MAGIC, BU_LIST_NULL, BU_LIST_NULL}, 0, {0, 0} } |
#define BU_BITV_IS_INITIALIZED | ( | _bp | ) | (((struct bu_bitv *)(_bp) != BU_BITV_NULL) && LIKELY((_bp)->l.magic == BU_BITV_MAGIC)) |
#define BU_WORDS2BITS | ( | _nw | ) | ((size_t)(_nw>0?_nw:0)*sizeof(bitv_t)*8) |
#define BU_BITS2WORDS | ( | _nb | ) | (((size_t)(_nb>0?_nb:0)+BU_BITV_MASK)>>BU_BITV_SHIFT) |
#define BU_BITS2BYTES | ( | _nb | ) | (BU_BITS2WORDS(_nb)*sizeof(bitv_t)) |
#define BU_BITTEST | ( | _bv, | |
bit | |||
) | (((_bv)->bits[(bit)>>BU_BITV_SHIFT] & (((bitv_t)1)<<((bit)&BU_BITV_MASK)))!=0) |
#define BU_BITSET | ( | _bv, | |
bit | |||
) | ((_bv)->bits[(bit)>>BU_BITV_SHIFT] |= (((bitv_t)1)<<((bit)&BU_BITV_MASK))) |
#define BU_BITCLR | ( | _bv, | |
bit | |||
) | ((_bv)->bits[(bit)>>BU_BITV_SHIFT] &= ~(((bitv_t)1)<<((bit)&BU_BITV_MASK))) |
#define BU_BITV_ZEROALL | ( | _bv | ) |
zeros all of the internal storage bytes in a bit vector array
#define BU_BITV_BITNUM_CHECK | ( | _bv, | |
_bit | |||
) |
#define BU_BITV_NBITS_CHECK | ( | _bv, | |
_nbits | |||
) |
#define BU_BITV_LOOP_START | ( | _bv | ) |
Macros to efficiently find all the ONE bits in a bit vector. Counts words down, counts bits in words going up, for speed & portability. It does not matter if the shift causes the sign bit to smear to the right.
#define BU_BITV_LOOP_INDEX ((_wd << BU_BITV_SHIFT) | _b) |
#define BU_BITV_LOOP_END |
Paired with BU_BITV_LOOP_START()
typedef unsigned char bitv_t |
bitv_t should be a fast integer type for implementing bit vectors.
On many machines, this is a 32-bit "long", but on some machines a compiler/vendor-specific type such as "long long" or even 'char' can give access to faster integers.
THE SIZE OF bitv_t MUST MATCH BU_BITV_SHIFT.
size_t bu_bitv_shift | ( | void | ) |
returns floor(log2(sizeof(bitv_t)*8.0)), i.e. the number of bits required with base-2 encoding to index any bit in an array of length sizeof(bitv_t)*8.0 bits long. users should not call this directly, instead calling the BU_BITV_SHIFT macro instead.
struct bu_bitv * bu_bitv_new | ( | size_t | nbits | ) |
Allocate storage for a new bit vector of at least 'nbits' in length. The bit vector itself is guaranteed to be initialized to all zero.
void bu_bitv_free | ( | struct bu_bitv * | bv | ) |
Release all internal storage for this bit vector.
It is the caller's responsibility to not use the pointer 'bv' any longer. It is the caller's responsibility to dequeue from any linked list first.
void bu_bitv_clear | ( | struct bu_bitv * | bv | ) |
Set all the bits in the bit vector to zero.
Also available as a BU_BITV_ZEROALL macro if you don't desire the pointer checking.
Print the bits set in a bit vector.
void bu_pr_bitv | ( | const char * | str, |
const struct bu_bitv * | bv | ||
) |
Convert a bit vector to an ascii string of hex digits. The string is from MSB to LSB (bytes and bits).
struct bu_bitv * bu_hex_to_bitv | ( | const char * | str | ) |
Convert a string of HEX digits (as produced by bu_bitv_to_hex) into a bit vector.
Convert a bit vector to an ascii string of binary digits in the GCC format ("0bn..."). The string is from MSB to LSB (bytes and bits).
struct bu_bitv * bu_binary_to_bitv | ( | const char * | str | ) |
Convert a string of BINARY digits (as produced by bu_bitv_to_binary) into a bit vector.
struct bu_bitv * bu_binary_to_bitv2 | ( | const char * | str, |
const int | nbytes | ||
) |
Convert a string of BINARY digits (as produced by bu_bitv_to_binary) into a bit vector. The "nbytes" argument may be zero if the user has no minimum length preference.
Compare two bit vectors for equality. They are considered equal iff their lengths and each bit are equal. Returns 1 for true, zero for false.
Compare two bit vectors for equality. They are considered equal iff their non-zero bits are equal (leading zero bits are ignored so lengths are not considered explicitly). Returns 1 for true, 0 for false.
int bu_hexstr_to_binstr | ( | const char * | hexstr, |
struct bu_vls * | b | ||
) |
Convert a string of hex characters to an equivalent string of binary characters.
The input hex string may have an optional prefix of '0x' or '0X' in which case the resulting binary string will be prefixed with '0b'.
The input string is expected to represent an integral number of bytes but will have leading zeroes prepended as necessary to fulfill that requirement.
Returns BRLCAD_OK for success, BRLCAD_ERROR for errors.
int bu_binstr_to_hexstr | ( | const char * | binstr, |
struct bu_vls * | h | ||
) |
Convert a string of binary characters to an equivalent string of hex characters.
The input binary string may have an optional prefix of '0b' or '0B' in which case the resulting hex string will be prefixed with '0x'.
The input string is expected to represent an integral number of bytes but will have leading zeroes prepended as necessary to fulfill that requirement.
Returns BRLCAD_OK for success, BRLCAD_ERROR for errors.
void bu_printb | ( | const char * | label, |
unsigned long | bits, | ||
const char * | format | ||
) |
Bit field printing implementation.
Print a bit field according to a format specification via bu_log().
Line printed is of the form "String Label: x1234 <FOO,BAR,RAB,OOF>" and is commonly used by debugging code to print which debug bits are enabled.
label | string label |
bits | integer with the bits to print |
format | format specification |
The 'format' begins with a desired printing base (8 or 16), i.e., \010 means print octal and \020 for hex. Remaining string is the little endian bit position (i.e., 1 to 32 encoded in octal format) followed by a label for that bit (e.g., "\010\2Bit_one\1BIT_zero")
Note octal counting is used for the bit position label: \01 -> ... \07 -> \10 -> \11 -> ... \17 -> \20 ... etc
void bu_vls_printb | ( | struct bu_vls * | vls, |
const char * | label, | ||
unsigned long | bits, | ||
const char * | format | ||
) |
Same as bu_printb() but with output going to a vls instead of stderr