ValidateBitVec

Table of Contents

ValidateBitVec

Description

Validate whether a given BitVec object is valid. Not foolproof but will work most of the time. Aborts if provided BitVec is not valid.

Parameters

NameDirectionDescription
bvinPointer to BitVec object to validate.

Success

Continue execution, meaning given BitVec object is most probably valid.

Failure

abort

Usage example (Cross-references)

    #define BitVecForeachIdx(bv, var, idx, body)                                                                           \
    do {                                                                                                               \
    ValidateBitVec(bv);                                                                                            \
    u64 idx = 0;                                                                                                   \
    if ((bv)->length > 0) {                                                                                        \
    #define BitVecForeachReverseIdx(bv, var, idx, body)                                                                    \
    do {                                                                                                               \
    ValidateBitVec(bv);                                                                                            \
    u64 idx = 0;                                                                                                   \
    if ((bv)->length > 0) {                                                                                        \
    #define BitVecForeachInRangeIdx(bv, var, idx, start, end, body)                                                        \
    do {                                                                                                               \
    ValidateBitVec(bv);                                                                                            \
    u64 idx = 0;                                                                                                   \
    u64 _s  = start;                                                                                               \
    
    ValidateStr(o);
    ValidateBitVec(bv);
    
    // Store original length to calculate content size later
    }
    
    ValidateBitVec(bv);
    
    // Skip leading whitespace
    
    void BitVecDeinit(BitVec *bitvec) {
    ValidateBitVec(bitvec);
    if (bitvec->data) {
    free(bitvec->data);
    
    void BitVecClear(BitVec *bitvec) {
    ValidateBitVec(bitvec);
    bitvec->length = 0;
    if (bitvec->data && bitvec->byte_size > 0) {
    
    void BitVecResize(BitVec *bitvec, u64 new_size) {
    ValidateBitVec(bitvec);
    if (new_size > bitvec->capacity) {
    BitVecReserve(bitvec, new_size);
    
    void BitVecReserve(BitVec *bitvec, u64 n) {
    ValidateBitVec(bitvec);
    if (n <= bitvec->capacity)
    return;
    
    void BitVecShrinkToFit(BitVec *bv) {
    ValidateBitVec(bv);
    if (bv->length == 0) {
    // Free all memory if empty
    
    void BitVecSwap(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    void BitVecSwap(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    
    // Swap all fields
    
    BitVec BitVecClone(BitVec *bv) {
    ValidateBitVec(bv);
    
    BitVec clone = BitVecInit();
    
    bool BitVecGet(BitVec *bitvec, u64 idx) {
    ValidateBitVec(bitvec);
    if (idx >= bitvec->length) {
    LOG_FATAL("Index {} exceeds bitvector length {}", idx, bitvec->length);
    
    void BitVecSet(BitVec *bitvec, u64 idx, bool value) {
    ValidateBitVec(bitvec);
    if (idx >= bitvec->length) {
    LOG_FATAL("Index {} exceeds bitvector length {}", idx, bitvec->length);
    
    void BitVecFlip(BitVec *bitvec, u64 idx) {
    ValidateBitVec(bitvec);
    if (idx >= bitvec->length) {
    LOG_FATAL("Index {} exceeds bitvector length {}", idx, bitvec->length);
    
    void BitVecPush(BitVec *bitvec, bool value) {
    ValidateBitVec(bitvec);
    if (bitvec->length >= bitvec->capacity) {
    u64 new_capacity = bitvec->capacity == 0 ? 8 : bitvec->capacity * 2;
    
    bool BitVecPop(BitVec *bitvec) {
    ValidateBitVec(bitvec);
    if (bitvec->length == 0) {
    LOG_FATAL("Cannot pop from empty bitvector");
    
    void BitVecInsert(BitVec *bitvec, u64 idx, bool value) {
    ValidateBitVec(bitvec);
    if (idx > bitvec->length) {
    LOG_FATAL("Index {} exceeds bitvector length {}", idx, bitvec->length);
    
    void BitVecInsertRange(BitVec *bv, u64 idx, u64 count, bool value) {
    ValidateBitVec(bv);
    if (idx > bv->length) {
    LOG_FATAL("Index {} exceeds bitvector length {}", idx, bv->length);
    
    void BitVecInsertMultiple(BitVec *bv, u64 idx, BitVec *other) {
    ValidateBitVec(bv);
    ValidateBitVec(other);
    if (idx > bv->length) {
    void BitVecInsertMultiple(BitVec *bv, u64 idx, BitVec *other) {
    ValidateBitVec(bv);
    ValidateBitVec(other);
    if (idx > bv->length) {
    LOG_FATAL("Index {} exceeds bitvector length {}", idx, bv->length);
    
    void BitVecInsertPattern(BitVec *bv, u64 idx, u8 pattern, u64 pattern_bits) {
    ValidateBitVec(bv);
    if (idx > bv->length) {
    LOG_FATAL("Index {} exceeds bitvector length {}", idx, bv->length);
    
    bool BitVecRemove(BitVec *bv, u64 idx) {
    ValidateBitVec(bv);
    if (idx >= bv->length) {
    LOG_FATAL("Index {} exceeds bitvector length {}", idx, bv->length);
    
    void BitVecRemoveRange(BitVec *bv, u64 idx, u64 count) {
    ValidateBitVec(bv);
    if (idx >= bv->length) {
    LOG_FATAL("Index {} exceeds bitvector length {}", idx, bv->length);
    
    bool BitVecRemoveFirst(BitVec *bv, bool value) {
    ValidateBitVec(bv);
    
    u64 pos = BitVecFind(bv, value);
    
    bool BitVecRemoveLast(BitVec *bv, bool value) {
    ValidateBitVec(bv);
    
    u64 pos = BitVecFindLast(bv, value);
    
    u64 BitVecRemoveAll(BitVec *bv, bool value) {
    ValidateBitVec(bv);
    
    u64 removed_count = 0;
    
    u64 BitVecCountOnes(BitVec *bitvec) {
    ValidateBitVec(bitvec);
    if (!bitvec->data)
    return 0;
    
    u64 BitVecCountZeros(BitVec *bitvec) {
    ValidateBitVec(bitvec);
    return bitvec->length - BitVecCountOnes(bitvec);
    }
    
    void BitVecAnd(BitVec *result, BitVec *a, BitVec *b) {
    ValidateBitVec(result);
    ValidateBitVec(a);
    ValidateBitVec(b);
    void BitVecAnd(BitVec *result, BitVec *a, BitVec *b) {
    ValidateBitVec(result);
    ValidateBitVec(a);
    ValidateBitVec(b);
    ValidateBitVec(result);
    ValidateBitVec(a);
    ValidateBitVec(b);
    
    u64 min_len = MIN2(a->length, b->length);
    
    void BitVecOr(BitVec *result, BitVec *a, BitVec *b) {
    ValidateBitVec(result);
    ValidateBitVec(a);
    ValidateBitVec(b);
    void BitVecOr(BitVec *result, BitVec *a, BitVec *b) {
    ValidateBitVec(result);
    ValidateBitVec(a);
    ValidateBitVec(b);
    ValidateBitVec(result);
    ValidateBitVec(a);
    ValidateBitVec(b);
    
    u64 max_len = MAX2(a->length, b->length);
    
    void BitVecXor(BitVec *result, BitVec *a, BitVec *b) {
    ValidateBitVec(result);
    ValidateBitVec(a);
    ValidateBitVec(b);
    void BitVecXor(BitVec *result, BitVec *a, BitVec *b) {
    ValidateBitVec(result);
    ValidateBitVec(a);
    ValidateBitVec(b);
    ValidateBitVec(result);
    ValidateBitVec(a);
    ValidateBitVec(b);
    
    u64 max_len = MAX2(a->length, b->length);
    
    void BitVecNot(BitVec *result, BitVec *bitvec) {
    ValidateBitVec(result);
    ValidateBitVec(bitvec);
    void BitVecNot(BitVec *result, BitVec *bitvec) {
    ValidateBitVec(result);
    ValidateBitVec(bitvec);
    
    BitVecResize(result, bitvec->length);
    // Comparison functions
    bool BitVecEquals(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    bool BitVecEquals(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    
    if (bv1->length != bv2->length) {
    
    bool BitVecEqualsRange(BitVec *bv1, u64 start1, BitVec *bv2, u64 start2, u64 len) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    bool BitVecEqualsRange(BitVec *bv1, u64 start1, BitVec *bv2, u64 start2, u64 len) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    
    if (start1 + len > bv1->length) {
    
    int BitVecCompare(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    int BitVecCompare(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    
    u64 min_len = MIN2(bv1->length, bv2->length);
    
    int BitVecCompareRange(BitVec *bv1, u64 start1, BitVec *bv2, u64 start2, u64 len) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    int BitVecCompareRange(BitVec *bv1, u64 start1, BitVec *bv2, u64 start2, u64 len) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    
    if (start1 + len > bv1->length) {
    
    int BitVecNumericalCompare(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    int BitVecNumericalCompare(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    
    // Compare as unsigned integers (LSB first)
    
    int BitVecWeightCompare(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    int BitVecWeightCompare(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    
    u64 weight1 = BitVecCountOnes(bv1);
    
    int BitVecSignedCompare(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    int BitVecSignedCompare(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    
    if (bv1->length == 0 && bv2->length == 0) {
    
    bool BitVecIsSubset(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    bool BitVecIsSubset(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    
    // bv1 is subset of bv2 if all 1-bits in bv1 are also 1-bits in bv2
    
    bool BitVecDisjoint(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    bool BitVecDisjoint(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    
    // Disjoint if no common 1-bits
    
    bool BitVecIsSorted(BitVec *bv) {
    ValidateBitVec(bv);
    
    // Sorted means all 0s come before all 1s
    // Conversion functions
    Str BitVecToStr(BitVec *bv) {
    ValidateBitVec(bv);
    
    Str result = StrInit();
    
    u64 BitVecToBytes(BitVec *bv, u8 *bytes, u64 max_len) {
    ValidateBitVec(bv);
    if (!bytes) {
    LOG_FATAL("bytes is NULL");
    
    u64 BitVecToInteger(BitVec *bv) {
    ValidateBitVec(bv);
    if (bv->length == 0) {
    return 0;
    // Shift operations
    void BitVecShiftLeft(BitVec *bv, u64 positions) {
    ValidateBitVec(bv);
    if (positions == 0 || bv->length == 0) {
    return;
    
    void BitVecShiftRight(BitVec *bv, u64 positions) {
    ValidateBitVec(bv);
    if (positions == 0 || bv->length == 0) {
    return;
    
    void BitVecRotateLeft(BitVec *bv, u64 positions) {
    ValidateBitVec(bv);
    if (positions == 0 || bv->length == 0) {
    return;
    
    void BitVecRotateRight(BitVec *bv, u64 positions) {
    ValidateBitVec(bv);
    if (positions == 0 || bv->length == 0) {
    return;
    
    void BitVecReverse(BitVec *bv) {
    ValidateBitVec(bv);
    if (bv->length <= 1) {
    return;
    
    u64 BitVecFind(BitVec *bv, bool value) {
    ValidateBitVec(bv);
    
    for (u64 i = 0; i < bv->length; i++) {
    
    u64 BitVecFindLast(BitVec *bv, bool value) {
    ValidateBitVec(bv);
    
    if (bv->length == 0) {
    
    bool BitVecAll(BitVec *bv, bool value) {
    ValidateBitVec(bv);
    
    for (u64 i = 0; i < bv->length; i++) {
    
    bool BitVecAny(BitVec *bv, bool value) {
    ValidateBitVec(bv);
    return BitVecFind(bv, value) != SIZE_MAX;
    }
    
    u64 BitVecLongestRun(BitVec *bv, bool value) {
    ValidateBitVec(bv);
    
    if (bv->length == 0) {
    // Pattern search functions
    u64 BitVecFindPattern(BitVec *bv, BitVec *pattern) {
    ValidateBitVec(bv);
    ValidateBitVec(pattern);
    u64 BitVecFindPattern(BitVec *bv, BitVec *pattern) {
    ValidateBitVec(bv);
    ValidateBitVec(pattern);
    
    if (pattern->length == 0 || pattern->length > bv->length) {
    
    u64 BitVecFindLastPattern(BitVec *bv, BitVec *pattern) {
    ValidateBitVec(bv);
    ValidateBitVec(pattern);
    u64 BitVecFindLastPattern(BitVec *bv, BitVec *pattern) {
    ValidateBitVec(bv);
    ValidateBitVec(pattern);
    
    if (pattern->length == 0 || pattern->length > bv->length) {
    
    u64 BitVecFindAllPattern(BitVec *bv, BitVec *pattern, size *results, u64 max_results) {
    ValidateBitVec(bv);
    ValidateBitVec(pattern);
    u64 BitVecFindAllPattern(BitVec *bv, BitVec *pattern, size *results, u64 max_results) {
    ValidateBitVec(bv);
    ValidateBitVec(pattern);
    
    if (!results || max_results == 0) {
    
    u64 BitVecRunLengths(BitVec *bv, u64 *runs, bool *values, u64 max_runs) {
    ValidateBitVec(bv);
    if (!runs || !values || max_runs == 0) {
    LOG_FATAL("invalid arguments");
    
    u64 BitVecHammingDistance(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    u64 BitVecHammingDistance(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    
    u64 min_length = MIN2(bv1->length, bv2->length);
    
    double BitVecJaccardSimilarity(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    double BitVecJaccardSimilarity(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    
    if (bv1->length == 0 && bv2->length == 0) {
    
    double BitVecCosineSimilarity(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    double BitVecCosineSimilarity(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    
    u64 dot_product = BitVecDotProduct(bv1, bv2);
    
    u64 BitVecDotProduct(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    u64 BitVecDotProduct(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    
    u64 min_length = MIN2(bv1->length, bv2->length);
    
    u64 BitVecEditDistance(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    u64 BitVecEditDistance(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    
    u64 len1 = bv1->length;
    
    double BitVecCorrelation(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    double BitVecCorrelation(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    
    u64 max_length = MAX2(bv1->length, bv2->length);
    
    double BitVecEntropy(BitVec *bv) {
    ValidateBitVec(bv);
    
    if (bv->length == 0)
    
    int BitVecAlignmentScore(BitVec *bv1, BitVec *bv2, int match, int mismatch) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    int BitVecAlignmentScore(BitVec *bv1, BitVec *bv2, int match, int mismatch) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    
    u64 min_length = MIN2(bv1->length, bv2->length);
    
    u64 BitVecBestAlignment(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    u64 BitVecBestAlignment(BitVec *bv1, BitVec *bv2) {
    ValidateBitVec(bv1);
    ValidateBitVec(bv2);
    
    if (bv1->length == 0 || bv2->length == 0) {
    
    bool BitVecStartsWith(BitVec *bv, BitVec *prefix) {
    ValidateBitVec(bv);
    ValidateBitVec(prefix);
    bool BitVecStartsWith(BitVec *bv, BitVec *prefix) {
    ValidateBitVec(bv);
    ValidateBitVec(prefix);
    
    if (prefix->length > bv->length) {
    
    bool BitVecEndsWith(BitVec *bv, BitVec *suffix) {
    ValidateBitVec(bv);
    ValidateBitVec(suffix);
    bool BitVecEndsWith(BitVec *bv, BitVec *suffix) {
    ValidateBitVec(bv);
    ValidateBitVec(suffix);
    
    if (suffix->length > bv->length) {
    
    bool BitVecContainsAt(BitVec *bv, BitVec *pattern, u64 idx) {
    ValidateBitVec(bv);
    ValidateBitVec(pattern);
    bool BitVecContainsAt(BitVec *bv, BitVec *pattern, u64 idx) {
    ValidateBitVec(bv);
    ValidateBitVec(pattern);
    
    if (idx + pattern->length > bv->length) {
    
    u64 BitVecCountPattern(BitVec *bv, BitVec *pattern) {
    ValidateBitVec(bv);
    ValidateBitVec(pattern);
    u64 BitVecCountPattern(BitVec *bv, BitVec *pattern) {
    ValidateBitVec(bv);
    ValidateBitVec(pattern);
    
    if (pattern->length == 0 || pattern->length > bv->length) {
    
    u64 BitVecRFindPattern(BitVec *bv, BitVec *pattern, u64 start) {
    ValidateBitVec(bv);
    ValidateBitVec(pattern);
    u64 BitVecRFindPattern(BitVec *bv, BitVec *pattern, u64 start) {
    ValidateBitVec(bv);
    ValidateBitVec(pattern);
    
    if (pattern->length == 0 || pattern->length > bv->length || start >= bv->length) {
    
    bool BitVecReplace(BitVec *bv, BitVec *old_pattern, BitVec *new_pattern) {
    ValidateBitVec(bv);
    ValidateBitVec(old_pattern);
    ValidateBitVec(new_pattern);
    bool BitVecReplace(BitVec *bv, BitVec *old_pattern, BitVec *new_pattern) {
    ValidateBitVec(bv);
    ValidateBitVec(old_pattern);
    ValidateBitVec(new_pattern);
    ValidateBitVec(bv);
    ValidateBitVec(old_pattern);
    ValidateBitVec(new_pattern);
    
    u64 pos = BitVecFindPattern(bv, old_pattern);
    
    u64 BitVecReplaceAll(BitVec *bv, BitVec *old_pattern, BitVec *new_pattern) {
    ValidateBitVec(bv);
    ValidateBitVec(old_pattern);
    ValidateBitVec(new_pattern);
    u64 BitVecReplaceAll(BitVec *bv, BitVec *old_pattern, BitVec *new_pattern) {
    ValidateBitVec(bv);
    ValidateBitVec(old_pattern);
    ValidateBitVec(new_pattern);
    ValidateBitVec(bv);
    ValidateBitVec(old_pattern);
    ValidateBitVec(new_pattern);
    
    u64 replacements = 0;
    
    bool BitVecMatches(BitVec *bv, BitVec *pattern, BitVec *wildcard) {
    ValidateBitVec(bv);
    ValidateBitVec(pattern);
    ValidateBitVec(wildcard);
    bool BitVecMatches(BitVec *bv, BitVec *pattern, BitVec *wildcard) {
    ValidateBitVec(bv);
    ValidateBitVec(pattern);
    ValidateBitVec(wildcard);
    ValidateBitVec(bv);
    ValidateBitVec(pattern);
    ValidateBitVec(wildcard);
    
    if (bv->length != pattern->length || pattern->length != wildcard->length) {
    
    u64 BitVecFuzzyMatch(BitVec *bv, BitVec *pattern, u64 max_errors) {
    ValidateBitVec(bv);
    ValidateBitVec(pattern);
    u64 BitVecFuzzyMatch(BitVec *bv, BitVec *pattern, u64 max_errors) {
    ValidateBitVec(bv);
    ValidateBitVec(pattern);
    
    if (pattern->length > bv->length) {
    
    bool BitVecRegexMatch(BitVec *bv, const char *pattern) {
    ValidateBitVec(bv);
    if (!pattern) {
    LOG_FATAL("pattern is NULL");
    
    u64 BitVecPrefixMatch(BitVec *bv, BitVecs *patterns) {
    ValidateBitVec(bv);
    if (!patterns) {
    LOG_FATAL("invalid BitVecs object provided");
    
    u64 BitVecSuffixMatch(BitVec *bv, BitVecs *patterns) {
    ValidateBitVec(bv);
    if (!patterns) {
    LOG_FATAL("invalid arguments");
    }
    
    void ValidateBitVec(const BitVec *bv) {
    if (!(bv)) {
    LOG_FATAL("Invalid bitvec object: NULL.");
    // Test ValidateBitVec macro
    bool test_bitvec_validate(void) {
    printf("Testing ValidateBitVec macro\n");
    
    // Create a valid bitvector
    
    // This should not abort
    ValidateBitVec(&bitvec);
    
    // Clean up

Share :