Skip to content

BitVecPush

Description

Push a bit to the end of bitvector. Grows the bitvector if necessary.

Parameters

Name Direction Description
bv in,out Bitvector to push bit to.
value in Bit value to push (true/false).

Usage example (from documentation)

  BitVecPush(&flags, true);
  BitVecPush(&flags, false);

Success

Returns true. Bitvector length grows by one; bit at index old_length is now value. The byte buffer may have grown.

Failure

Returns false on allocation failure when capacity must grow. The bitvector is unchanged.

Usage example (Cross-references)

Usage examples (Cross-references)
    #define BitVecMustPush(bv, value)                                                                                      \
        do {                                                                                                               \
            if (!BitVecPush((bv), (value))) {                                                                              \
                LOG_FATAL("BitVecMustPush failed");                                                                        \
            }                                                                                                              \
    }
    
    bool BitVecPush(BitVec *bitvec, bool value) {
        ValidateBitVec(bitvec);
        if (bitvec->length >= bitvec->capacity) {
            LOG_FATAL("Index {} exceeds bitvector length {}", idx, bitvec->length);
        }
        if (!BitVecPush(bitvec, false)) {
            return false;
        }
        for (u64 i = 0; i < str_len; i++) {
            if (str[i] == '1') {
                if (!BitVecPush(out, true)) {
                    BitVecDeinit(out);
                    *out = BitVecInit(alloc);
                }
            } else if (str[i] == '0') {
                if (!BitVecPush(out, false)) {
                    BitVecDeinit(out);
                    *out = BitVecInit(alloc);
    
        // Add some bits
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Add some bits
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
    
        // Force capacity to be larger than needed by reserving space
    
        // Add some bits
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        // Add some bits
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
    
        // Set capacity to a specific value
    
        // Set up first bitvector
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        // Set up first bitvector
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
    
        // Set up second bitvector
    
        // Set up second bitvector
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        // Set up second bitvector
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
    
        // Store original states
    
        // Set up original bitvector
        BitVecPush(&original, true);
        BitVecPush(&original, false);
        BitVecPush(&original, true);
        // Set up original bitvector
        BitVecPush(&original, true);
        BitVecPush(&original, false);
        BitVecPush(&original, true);
        BitVecPush(&original, false);
        BitVecPush(&original, true);
        BitVecPush(&original, false);
        BitVecPush(&original, true);
        BitVecPush(&original, false);
        BitVecPush(&original, false);
        BitVecPush(&original, true);
        BitVecPush(&original, false);
    
        // Clone the bitvector
    
        // Verify they are independent by modifying original
        BitVecPush(&original, true);
    
        // Clone should remain unchanged
        BitVec original = BitVecInit(ALLOCATOR_OF(&alloc));
    
        BitVecPush(&original, true);
        BitVecPush(&original, false);
        BitVecPush(&original, true);
    
        BitVecPush(&original, true);
        BitVecPush(&original, false);
        BitVecPush(&original, true);
        BitVecPush(&original, true);
        BitVecPush(&original, false);
        BitVecPush(&original, true);
    
        BitVec clone = BitVecClone(&original);
    
        // Test shrink on single element
        BitVecPush(&bv, true);
        BitVecShrinkToFit(&bv);
        result = result && (BitVecLen(&bv) == 1) && (BitVecCapacity(&bv) >= 1);
    
        for (int i = 0; i < 10; i++) {
            BitVecPush(&bv, i % 2 == 0);
        }
        u64 original_length = BitVecLen(&bv);
    
        // Test swap with one empty, one non-empty
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecSwap(&bv1, &bv2);
        // Test swap with one empty, one non-empty
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecSwap(&bv1, &bv2);
        BitVecClear(&bv1);
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&bv1, i % 3 == 0);
        }
    
        // Test clone single element
        BitVecPush(&bv, true);
        BitVec clone2 = BitVecClone(&bv);
        result        = result && (BitVecLen(&clone2) == 1);
        BitVecClear(&bv);
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&bv, i % 2 == 0);
        }
            // Add random-sized data
            for (int i = 0; i < cycle * 10; i++) {
                BitVecPush(&bv1, i % 2 == 0);
                BitVecPush(&bv2, i % 3 == 0);
            }
            for (int i = 0; i < cycle * 10; i++) {
                BitVecPush(&bv1, i % 2 == 0);
                BitVecPush(&bv2, i % 3 == 0);
            }
        // Fill a full byte with ones so bits 5,6,7 are set in the backing byte.
        for (int i = 0; i < 8; i++) {
            BitVecPush(&bv, true);
        }
        // shrink takes the realloc path (50 != 64) and capacity (512) > length.
        for (int i = 0; i < 400; i++) {
            BitVecPush(&bv, i % 2 == 0);
        }
    
        for (int i = 0; i < 400; i++) {
            BitVecPush(&bv, i % 3 == 0);
        }
        BitVec large = BitVecInit(ALLOCATOR_OF(&alloc));
    
        BitVecPush(&small, true);
        BitVecPush(&small, false);
    
        BitVecPush(&small, true);
        BitVecPush(&small, false);
    
        // Large enough that 42*8 == 336 < capacity once swapped in.
        // Large enough that 42*8 == 336 < capacity once swapped in.
        for (int i = 0; i < 400; i++) {
            BitVecPush(&large, i % 2 == 0);
        }
    
        BitVec good = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&good, true);
    
        BitVec bad = {0}; // magic 0 => invalid bitvec
    
        // Add some data to make sure deinitialization works with allocated memory
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Add some data to make sure deinitialization works with allocated memory
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
    
        // Check that data was allocated
        // Add some bits to make sure the reserved space works
        for (int i = 0; i < 10; i++) {
            BitVecPush(&bv, (i % 2 == 0));
        }
    
        // Add some data
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Add some data
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
    
        // Check initial state
    
        // Test that we can still add data after clearing
        BitVecPush(&bv, true);
        result = result && (BitVecLen(&bv) == 1);
        result = result && (BitVecGet(&bv, 0) == true);
    
        // Add some initial data
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Add some initial data
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
    
        // Test resizing to larger size
    
        // Test reu64 to 0 (should clear but keep memory)
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecResize(&bv, 0);
        // Test reu64 to 0 (should clear but keep memory)
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecResize(&bv, 0);
        result = result && (BitVecLen(&bv) == 0);
    
        // Test clear after single bit
        BitVecPush(&bv, true);
        BitVecClear(&bv);
        result = result && (BitVecLen(&bv) == 0);
        // Test clear after large data
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&bv, i % 2);
        }
        BitVecClear(&bv);
            // Add some data
            for (int i = 0; i < cycle % 10; i++) {
                BitVecPush(&bv, i % 2);
            }
    
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
    
        // Test with index way beyond length (3) - should abort
    
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
    
        // Test with index way beyond length (2) - should abort
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
        for (int i = 0; i < 10; i++) {
            BitVecPush(&bv, i % 2 == 0);
        }
    
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv, true);
    
        // Test with maximum possible index value - should abort
    
        // Add same pattern to both
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        // Add same pattern to both
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
    
        // Should be equal
    
        // Add different pattern to third
        BitVecPush(&bv3, true);
        BitVecPush(&bv3, false);
        BitVecPush(&bv3, false); // Different bit
        // Add different pattern to third
        BitVecPush(&bv3, true);
        BitVecPush(&bv3, false);
        BitVecPush(&bv3, false); // Different bit
        BitVecPush(&bv3, true);
        BitVecPush(&bv3, false);
        BitVecPush(&bv3, false); // Different bit
    
        // Should not be equal
    
        // Test different lengths
        BitVecPush(&bv3, true);
        result = result && !BitVecEquals(&bv1, &bv3);
    
        // Test equal bitvectors
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        // Test equal bitvectors
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, false);
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        bool result = (BitVecCompare(&bv1, &bv2) == 0);
        BitVecClear(&bv2);
    
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);  // 11
    
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);  // 11
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);  // 11
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false); // 10
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false); // 10
    
        result = result && (BitVecCompare(&bv1, &bv2) > 0);
    
        // Test lexicographic comparison
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true); // 101
        // Test lexicographic comparison
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true); // 101
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true); // 101
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true); // 101
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true); // 11 (shorter)
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true); // 11 (shorter)
    
        // Lexicographic comparison considers position-by-position
        // Test equal bitvectors
        BitVecClear(&bv2);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true); // 101
        BitVecClear(&bv2);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true); // 101
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true); // 101
    
        result = result && (BitVecCompare(&bv1, &bv2) == 0);
        // Create bitvectors representing different numbers
        // bv1: 101 (binary) = 5 (decimal)
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        // bv1: 101 (binary) = 5 (decimal)
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
    
        // bv2: 11 (binary) = 3 (decimal)
    
        // bv2: 11 (binary) = 3 (decimal)
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        // bv2: 11 (binary) = 3 (decimal)
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
    
        // Numerical comparison should compare the integer values
        // Test equal values
        BitVecClear(&bv2);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true); // Also 101
        BitVecClear(&bv2);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true); // Also 101
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true); // Also 101
    
        result = result && (BitVecNumericalCompare(&bv1, &bv2) == 0);
    
        // bv1: 111 (3 ones)
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        // bv1: 111 (3 ones)
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
    
        // bv2: 101 (2 ones)
    
        // bv2: 101 (2 ones)
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        // bv2: 101 (2 ones)
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
    
        // Weight comparison should compare number of set bits
        // Test equal weights
        BitVecClear(&bv2);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true); // Also 3 ones
        BitVecClear(&bv2);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true); // Also 3 ones
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true); // Also 3 ones
    
        result = result && (BitVecWeightCompare(&bv1, &bv2) == 0);
    
        // Create superset: 1111
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        // Create superset: 1111
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
    
        // Create subset: 1010
    
        // Create subset: 1010
        BitVecPush(&subset, true);
        BitVecPush(&subset, false);
        BitVecPush(&subset, true);
        // Create subset: 1010
        BitVecPush(&subset, true);
        BitVecPush(&subset, false);
        BitVecPush(&subset, true);
        BitVecPush(&subset, false);
        BitVecPush(&subset, true);
        BitVecPush(&subset, false);
        BitVecPush(&subset, true);
        BitVecPush(&subset, false);
        BitVecPush(&subset, false);
        BitVecPush(&subset, true);
        BitVecPush(&subset, false);
    
        // subset should be a subset of superset (all 1s in subset are also 1s in superset)
        // Test equal sets (should be subset)
        BitVecClear(&superset);
        BitVecPush(&superset, true);
        BitVecPush(&superset, false);
        BitVecPush(&superset, true);
        BitVecClear(&superset);
        BitVecPush(&superset, true);
        BitVecPush(&superset, false);
        BitVecPush(&superset, true);
        BitVecPush(&superset, false);
        BitVecPush(&superset, true);
        BitVecPush(&superset, false);
        BitVecPush(&superset, true);
        BitVecPush(&superset, false);
        BitVecPush(&superset, false);
        BitVecPush(&superset, true);
        BitVecPush(&superset, false);
    
        result = result && BitVecIsSubset(&subset, &superset);
        // Test positive vs negative (MSB is sign bit)
        // bv1: 011 (positive 3)
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        // bv1: 011 (positive 3)
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
    
        // bv2: 111 (negative, MSB=1)
    
        // bv2: 111 (negative, MSB=1)
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        // bv2: 111 (negative, MSB=1)
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
    
        // Positive should be greater than negative
        BitVecClear(&bv2);
        // bv2: 001 (positive 1)
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        // bv2: 001 (positive 1)
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
    
        // 3 > 1
    
        // Create superset: 1111
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        // Create superset: 1111
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
    
        // Create subset: 1010
    
        // Create subset: 1010
        BitVecPush(&subset, true);
        BitVecPush(&subset, false);
        BitVecPush(&subset, true);
        // Create subset: 1010
        BitVecPush(&subset, true);
        BitVecPush(&subset, false);
        BitVecPush(&subset, true);
        BitVecPush(&subset, false);
        BitVecPush(&subset, true);
        BitVecPush(&subset, false);
        BitVecPush(&subset, true);
        BitVecPush(&subset, false);
        BitVecPush(&subset, false);
        BitVecPush(&subset, true);
        BitVecPush(&subset, false);
    
        // superset should be a superset of subset
        // Test equal sets (should be superset)
        BitVecClear(&superset);
        BitVecPush(&superset, true);
        BitVecPush(&superset, false);
        BitVecPush(&superset, true);
        BitVecClear(&superset);
        BitVecPush(&superset, true);
        BitVecPush(&superset, false);
        BitVecPush(&superset, true);
        BitVecPush(&superset, false);
        BitVecPush(&superset, true);
        BitVecPush(&superset, false);
        BitVecPush(&superset, true);
        BitVecPush(&superset, false);
        BitVecPush(&superset, false);
        BitVecPush(&superset, true);
        BitVecPush(&superset, false);
    
        result = result && BitVecIsSuperset(&superset, &subset);
        // Create overlapping bitvectors
        // bv1: 1010
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        // bv1: 1010
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
    
        // bv2: 1100
    
        // bv2: 1100
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        // bv2: 1100
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
    
        // They overlap at position 0 (both have 1)
        BitVecClear(&bv2);
        // bv2: 0101 (complement of bv1)
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        // bv2: 0101 (complement of bv1)
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
    
        // They should not overlap (no position where both have 1)
        // Create disjoint bitvectors
        // bv1: 1010
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        // bv1: 1010
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
    
        // bv2: 0101 (disjoint with bv1)
    
        // bv2: 0101 (disjoint with bv1)
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        // bv2: 0101 (disjoint with bv1)
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
    
        // Should be disjoint and not intersect
        // bv1: 11100111
        for (int i = 0; i < 8; i++) {
            BitVecPush(&bv1, (i >= 3 && i <= 5) ? false : true);
        }
        // bv2: 00100100
        for (int i = 0; i < 8; i++) {
            BitVecPush(&bv2, (i == 2 || i == 5) ? true : false);
        }
        // Create test patterns
        // bv1: 11010110
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        // bv1: 11010110
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
    
        // bv2: 01101011
    
        // bv2: 01101011
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        // bv2: 01101011
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
    
        // Test range comparisons
        // Test lexicographic comparison
        // bv1: 10 (shorter)
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        // bv1: 10 (shorter)
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
    
        // bv2: 101 (longer)
    
        // bv2: 101 (longer)
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        // bv2: 101 (longer)
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
    
        // Lexicographically, shorter comes first
    
        // Test sorted pattern: 0001111
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        // Test sorted pattern: 0001111
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
    
        result = result && BitVecIsSorted(&bv);
    
        // Test unsorted pattern (add 0 after 1s)
        BitVecPush(&bv, false);
        result = result && !BitVecIsSorted(&bv);
        BitVecClear(&bv);
        for (int i = 0; i < 5; i++) {
            BitVecPush(&bv, false);
        }
        result = result && BitVecIsSorted(&bv);
        BitVecClear(&bv);
        for (int i = 0; i < 5; i++) {
            BitVecPush(&bv, true);
        }
        result = result && BitVecIsSorted(&bv);
    
        // Test compare empty vs non-empty
        BitVecPush(&bv1, true);
        result = result && !BitVecEquals(&bv1, &bv2);
        result = result && (BitVecCompare(&bv1, &bv2) != 0);
        for (int i = 0; i < 1000; i++) {
            bool bit = i % 3 == 0;
            BitVecPush(&bv1, bit);
            BitVecPush(&bv2, bit);
        }
            bool bit = i % 3 == 0;
            BitVecPush(&bv1, bit);
            BitVecPush(&bv2, bit);
        }
        result = result && BitVecEquals(&bv1, &bv2);
    
        // Test single bit sets
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, false);
        result = result && !BitVecOverlaps(&bv1, &bv2);
        // Test single bit sets
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, false);
        result = result && !BitVecOverlaps(&bv1, &bv2);
        BitVecClear(&bv2);
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&bv1, i % 2 == 0);
            BitVecPush(&bv2, i % 3 == 0);
        }
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&bv1, i % 2 == 0);
            BitVecPush(&bv2, i % 3 == 0);
        }
        // Should have some overlap since both contain position 0 (true)
        int pattern1[] = {1, 0, 1, 0, 1, 1, 0};
        for (int i = 0; i < 7; i++) {
            BitVecPush(&bv1, pattern1[i]);
        }
        int pattern2[] = {1, 1, 0, 0, 1, 0, 1};
        for (int i = 0; i < 7; i++) {
            BitVecPush(&bv2, pattern2[i]);
        }
        // bv3: larger than bv2
        for (int i = 0; i < 8; i++) {
            BitVecPush(&bv3, true);
        }
    
        // Create actual subset/superset relationship
        BitVecPush(&subset, true);
        BitVecPush(&subset, false);
        BitVecPush(&subset, true);
        // Create actual subset/superset relationship
        BitVecPush(&subset, true);
        BitVecPush(&subset, false);
        BitVecPush(&subset, true);
        BitVecPush(&subset, true);
        BitVecPush(&subset, false);
        BitVecPush(&subset, true);
    
        BitVecPush(&superset, true);
        BitVecPush(&subset, true);
    
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
    
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
        BitVecPush(&superset, true);
    
        result = result && BitVecIsSubset(&subset, &superset);
            // Pattern 1: Fibonacci-like XOR pattern
            bool bit1 = (i % 3 == 0) ^ (i % 5 == 0);
            BitVecPush(&large1, bit1);
    
            // Pattern 2: Prime-like pattern
            // Pattern 2: Prime-like pattern
            bool bit2 = (i % 7 == 0) || (i % 11 == 0);
            BitVecPush(&large2, bit2);
        }
        // Positive number (MSB = 0): 01111111
        for (int i = 0; i < 7; i++) {
            BitVecPush(&pos, true);
        }
        BitVecPush(&pos, false);
            BitVecPush(&pos, true);
        }
        BitVecPush(&pos, false);
    
        // Negative number (MSB = 1): 10000001
    
        // Negative number (MSB = 1): 10000001
        BitVecPush(&neg, true);
        for (int i = 1; i < 7; i++) {
            BitVecPush(&neg, false);
        BitVecPush(&neg, true);
        for (int i = 1; i < 7; i++) {
            BitVecPush(&neg, false);
        }
        BitVecPush(&neg, true);
            BitVecPush(&neg, false);
        }
        BitVecPush(&neg, true);
    
        // Unsigned: 01111111 (127) < 10000001 (129)
        // Create small bitvectors
        for (int i = 0; i < 3; i++) {
            BitVecPush(&bv1, i % 2 == 0);
            BitVecPush(&bv2, i % 2 == 1);
        }
        for (int i = 0; i < 3; i++) {
            BitVecPush(&bv1, i % 2 == 0);
            BitVecPush(&bv2, i % 2 == 1);
        }
        BitVec b = BitVecInit(base);
        for (int i = 0; i < 11; i++) {
            BitVecPush(&a, (i % 2) == 0);
            BitVecPush(&b, (i % 2) == 0);
        }
        for (int i = 0; i < 11; i++) {
            BitVecPush(&a, (i % 2) == 0);
            BitVecPush(&b, (i % 2) == 0);
        }
        BitVec c = BitVecInit(base);
    
        BitVecPush(&a, true);
        BitVecPush(&a, false);
        BitVecPush(&a, true);
    
        BitVecPush(&a, true);
        BitVecPush(&a, false);
        BitVecPush(&a, true);
        BitVecPush(&a, true);
        BitVecPush(&a, false);
        BitVecPush(&a, true);
    
        BitVecPush(&b, true);
        BitVecPush(&a, true);
    
        BitVecPush(&b, true);
        BitVecPush(&b, false);
        BitVecPush(&b, false);
    
        BitVecPush(&b, true);
        BitVecPush(&b, false);
        BitVecPush(&b, false);
        BitVecPush(&b, true);
        BitVecPush(&b, false);
        BitVecPush(&b, false);
    
        // c shares the byte-prefix with a but is longer.
    
        // c shares the byte-prefix with a but is longer.
        BitVecPush(&c, true);
        BitVecPush(&c, false);
        BitVecPush(&c, true);
        // c shares the byte-prefix with a but is longer.
        BitVecPush(&c, true);
        BitVecPush(&c, false);
        BitVecPush(&c, true);
        BitVecPush(&c, false);
        BitVecPush(&c, true);
        BitVecPush(&c, false);
        BitVecPush(&c, true);
        BitVecPush(&c, false);
        BitVecPush(&c, false);
        BitVecPush(&c, false);
        BitVecPush(&c, true);
        BitVecPush(&c, false);
        BitVecPush(&c, false);
        BitVecPush(&c, true);
        BitVecPush(&c, false);
        BitVecPush(&c, false);
    
        bool result = (bitvec_hash(&a, 0) != bitvec_hash(&b, 0));
    
        BitVec k1 = BitVecInit(base);
        BitVecPush(&k1, true);
        BitVecPush(&k1, false);
        BitVecPush(&k1, true);
        BitVec k1 = BitVecInit(base);
        BitVecPush(&k1, true);
        BitVecPush(&k1, false);
        BitVecPush(&k1, true);
        BitVecPush(&k1, true);
        BitVecPush(&k1, false);
        BitVecPush(&k1, true);
    
        BitVec k2 = BitVecInit(base);
    
        BitVec k2 = BitVecInit(base);
        BitVecPush(&k2, false);
        BitVecPush(&k2, true);
        BitVec k2 = BitVecInit(base);
        BitVecPush(&k2, false);
        BitVecPush(&k2, true);
    
        MapInsertR(&counts, k1, 1u);
    
        BitVec probe = BitVecInit(base);
        BitVecPush(&probe, true);
        BitVecPush(&probe, false);
        BitVecPush(&probe, true);
        BitVec probe = BitVecInit(base);
        BitVecPush(&probe, true);
        BitVecPush(&probe, false);
        BitVecPush(&probe, true);
        BitVecPush(&probe, true);
        BitVecPush(&probe, false);
        BitVecPush(&probe, true);
    
        u64 *got = MapGetFirstPtr(&counts, probe);
    
        BitVec missing = BitVecInit(base);
        BitVecPush(&missing, true);
        BitVecPush(&missing, true);
        u64 *gone = MapGetFirstPtr(&counts, missing);
        BitVec missing = BitVecInit(base);
        BitVecPush(&missing, true);
        BitVecPush(&missing, true);
        u64 *gone = MapGetFirstPtr(&counts, missing);
    
        BitVec a = BitVecInit(base);
        BitVecPush(&a, false);
        BitVecPush(&a, true);
        BitVec a = BitVecInit(base);
        BitVecPush(&a, false);
        BitVecPush(&a, true);
    
        BitVec b = BitVecInit(base);
    
        BitVec b = BitVecInit(base);
        BitVecPush(&b, false);
        BitVecPush(&b, true);
        BitVec b = BitVecInit(base);
        BitVecPush(&b, false);
        BitVecPush(&b, true);
    
        BitVec c = BitVecInit(base);
    
        BitVec c = BitVecInit(base);
        BitVecPush(&c, true);
        BitVecPush(&c, false);
        BitVec c = BitVecInit(base);
        BitVecPush(&c, true);
        BitVecPush(&c, false);
    
        GenericCompare cmp = bitvec_compare;
        BitVec bad = {0};
    
        BitVecPush(&bv1, true);
    
        BitVecEquals(&bv1, &bad);
        // a: 8 zero bits -> byte 0x00.
        for (int i = 0; i < 8; i++)
            BitVecPush(&a, false);
        // b: bit 0 set, rest clear -> byte 0x01 (same length 8).
        BitVecPush(&b, true);
            BitVecPush(&a, false);
        // b: bit 0 set, rest clear -> byte 0x01 (same length 8).
        BitVecPush(&b, true);
        for (int i = 0; i < 7; i++)
            BitVecPush(&b, false);
        BitVecPush(&b, true);
        for (int i = 0; i < 7; i++)
            BitVecPush(&b, false);
    
        bool result = (bitvec_hash(&a, 0) != bitvec_hash(&b, 0));
    
        for (int i = 0; i < 8; i++) {
            BitVecPush(&a, (i % 2) == 0);
            BitVecPush(&b, (i % 2) == 1);
        }
        for (int i = 0; i < 8; i++) {
            BitVecPush(&a, (i % 2) == 0);
            BitVecPush(&b, (i % 2) == 1);
        }
        // a: first 8 bits set, next 8 clear.
        for (int i = 0; i < 8; i++)
            BitVecPush(&a, true);
        for (int i = 0; i < 8; i++)
            BitVecPush(&a, false);
            BitVecPush(&a, true);
        for (int i = 0; i < 8; i++)
            BitVecPush(&a, false);
        // b: all 16 bits set.
        for (int i = 0; i < 16; i++)
        // b: all 16 bits set.
        for (int i = 0; i < 16; i++)
            BitVecPush(&b, true);
    
        bool result = (bitvec_hash(&a, 0) != bitvec_hash(&b, 0));
    
        BitVec bv = BitVecInit(base);
        BitVecPush(&bv, true);
    
        BitVecCompare(NULL, &bv); // must abort
    
        BitVec bv = BitVecInit(base);
        BitVecPush(&bv, true);
    
        BitVecCompare(&bv, NULL); // must abort
    
        BitVec bv = BitVecInit(base);
        BitVecPush(&bv, true);
    
        BitVecCompareRange(NULL, 0, &bv, 0, 1); // must abort
    
        BitVec bv = BitVecInit(base);
        BitVecPush(&bv, true);
    
        BitVecCompareRange(&bv, 0, NULL, 0, 1); // must abort
    
        BitVec bv = BitVecInit(base);
        BitVecPush(&bv, true);
    
        BitVecNumericalCompare(NULL, &bv); // must abort
    
        for (u64 i = 0; i < 50; i++) {
            BitVecPush(&bv1, i == 49);
            BitVecPush(&bv2, false);
        }
        for (u64 i = 0; i < 50; i++) {
            BitVecPush(&bv1, i == 49);
            BitVecPush(&bv2, false);
        }
        BitVec empty = BitVecInit(base);
    
        BitVecPush(&neg, true); // single bit set -> MSB set -> negative
    
        bool result = (BitVecSignedCompare(&neg, &empty) < 0);
        BitVec neg   = BitVecInit(base);
    
        BitVecPush(&neg, true); // negative
    
        bool result = (BitVecSignedCompare(&empty, &neg) > 0);
        BitVec pos = BitVecInit(base);
    
        BitVecPush(&neg, true);  // length 1, MSB set -> negative
        BitVecPush(&pos, false); // length 1, MSB clear -> non-negative (zero)
    
        BitVecPush(&neg, true);  // length 1, MSB set -> negative
        BitVecPush(&pos, false); // length 1, MSB clear -> non-negative (zero)
    
        // negative < zero
        BitVec neg   = BitVecInit(base);
    
        BitVecPush(&neg, true); // negative
    
        bool result = (BitVecSignedCompare(&empty, &neg) > 0);
        BitVec empty = BitVecInit(base);
    
        BitVecPush(&neg, true); // negative
    
        bool result = (BitVecSignedCompare(&neg, &empty) < 0);
    
        // [1,1]: MSB (index 1) set -> both negative, identical magnitude.
        BitVecPush(&a, true);
        BitVecPush(&a, true);
        BitVecPush(&b, true);
        // [1,1]: MSB (index 1) set -> both negative, identical magnitude.
        BitVecPush(&a, true);
        BitVecPush(&a, true);
        BitVecPush(&b, true);
        BitVecPush(&b, true);
        BitVecPush(&a, true);
        BitVecPush(&a, true);
        BitVecPush(&b, true);
        BitVecPush(&b, true);
        BitVecPush(&a, true);
        BitVecPush(&b, true);
        BitVecPush(&b, true);
    
        bool result = (BitVecSignedCompare(&a, &b) == 0);
    
        // a = [1,1]: index1 (MSB) set -> negative, magnitude 3.
        BitVecPush(&a, true);
        BitVecPush(&a, true);
        // b = [0,1]: index1 (MSB) set -> negative, magnitude 2.
        // a = [1,1]: index1 (MSB) set -> negative, magnitude 3.
        BitVecPush(&a, true);
        BitVecPush(&a, true);
        // b = [0,1]: index1 (MSB) set -> negative, magnitude 2.
        BitVecPush(&b, false);
        BitVecPush(&a, true);
        // b = [0,1]: index1 (MSB) set -> negative, magnitude 2.
        BitVecPush(&b, false);
        BitVecPush(&b, true);
        // b = [0,1]: index1 (MSB) set -> negative, magnitude 2.
        BitVecPush(&b, false);
        BitVecPush(&b, true);
    
        // a has the larger magnitude, so a is the more-negative -> a < b.
    
        BitVec bv = BitVecInit(base);
        BitVecPush(&bv, true);
    
        BitVecNumericalCompare(&bv, NULL); // must abort
    
        BitVec bv = BitVecInit(base);
        BitVecPush(&bv, true);
    
        BitVecSignedCompare(NULL, &bv); // must abort
    
        BitVec bv = BitVecInit(base);
        BitVecPush(&bv, true);
    
        BitVecSignedCompare(&bv, NULL); // must abort
    
        BitVec bv = BitVecInit(base);
        BitVecPush(&bv, true);
    
        BitVecIsSubset(NULL, &bv); // must abort
    
        for (u64 i = 0; i < 50; i++) {
            BitVecPush(&bv1, i == 45);
            BitVecPush(&bv2, false);
        }
        for (u64 i = 0; i < 50; i++) {
            BitVecPush(&bv1, i == 45);
            BitVecPush(&bv2, false);
        }
        BitVec bv2 = BitVecInit(base); // length 5
    
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
    
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, false);
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
    
        // bv1's only 1 (pos 0) is set in bv2 -> subset is true.
        BitVec bv2 = BitVecInit(base); // length 2
    
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
    
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, false);
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        // bv1's only 1 (pos 0) is set in bv2 -> subset is true.
    
        // Both: 0 1 1 -- no shared 1 at position 0, shared 1s at 1 and 2.
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        // Both: 0 1 1 -- no shared 1 at position 0, shared 1s at 1 and 2.
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
    
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, true);
    
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
    
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
    
        // They share 1-bits, so they are NOT disjoint.
    
        BitVec bv1 = BitVecInit(base);
        BitVecPush(&bv1, true);
    
        // Should abort on the NULL second argument.
    
        BitVec bv2 = BitVecInit(base);
        BitVecPush(&bv2, true);
    
        // Should abort on the NULL first argument.
    
        BitVec bv1 = BitVecInit(base);
        BitVecPush(&bv1, true);
    
        // Should abort on the NULL second argument.
        BitVec b = BitVecInit(ALLOCATOR_OF(&alloc));
        for (int i = 0; i < 256; i++) {
            BitVecPush(&a, false);
        }
        for (int i = 0; i < 512; i++) {
        }
        for (int i = 0; i < 512; i++) {
            BitVecPush(&b, false);
        }
        // Byte content differs (32 vs 64 zero bytes), so this alone is not a pure
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        WriteFmt("Testing BitVecPush\n");
    
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
    
        // Push some bits
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Push some bits
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
    
        // Check length
    
        // Create target bitvector
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        // Create target bitvector
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
    
        // Insert range of true bits
    
        // Start with some bits
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        // Start with some bits
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
    
        // Create source bitvector to insert
    
        // Create source bitvector to insert
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        // Create source bitvector to insert
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
    
        // Insert multiple bits from source
    
        // Start with some bits
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        // Start with some bits
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
    
        // Insert pattern 0x0B (1011 in binary) using 4 bits
        // Test with different pattern - 0x05 (0101 in binary) using only 3 bits
        BitVec bv2 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv2, true);
    
        u8 pattern2 = 0x05;
    
        // Test inserting at end
        BitVecPush(&bv, true);
        BitVecInsertRange(&bv, 1, 2, false);
        result = result && (BitVecLen(&bv) == 3);
    
        // Test inserting single bit bitvec
        BitVecPush(&source, true);
        BitVecInsertMultiple(&bv, 0, &source);
        result = result && (BitVecLen(&bv) == 1) && (BitVecGet(&bv, 0) == true);
        BitVecClear(&source);
        for (int i = 0; i < 500; i++) {
            BitVecPush(&source, false);
        }
        BitVecInsertMultiple(&bv, 1, &source);
    
        // Original: [1, 0, 1, 1]
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Original: [1, 0, 1, 1]
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
    
        // Insert 2 false bits at index 1 -> [1, 0, 0, 0, 1, 1]
    
        // bv: [1, 0, 1]
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // bv: [1, 0, 1]
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
    
        // other: [1, 1]
    
        // other: [1, 1]
        BitVecPush(&other, true);
        BitVecPush(&other, true);
        // other: [1, 1]
        BitVecPush(&other, true);
        BitVecPush(&other, true);
    
        // Insert other at index 1 -> [1, 1, 1, 0, 1]
    
        BitVec other = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&other, true);
    
        BitVecInsertMultiple(NULL, 0, &other);
    
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv, true);
    
        BitVecInsertMultiple(&bv, 0, NULL);
    static void push_bits(BitVec *bv, const char *bits) {
        for (const char *c = bits; *c != '\0'; c++)
            BitVecPush(bv, *c == '1');
    }
    
        BitVec pattern = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&pattern, true);
    
        BitVecFindPattern(NULL, &pattern); // Should cause LOG_FATAL
    
        BitVec source = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVec source = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&source, true);
        BitVecPush(&source, false);
    
        BitVecFindPattern(&source, NULL); // Should cause LOG_FATAL
    
        BitVec pattern = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&pattern, true);
    
        BitVecFindLastPattern(NULL, &pattern); // Should cause LOG_FATAL
    
        BitVec source = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVec source = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&source, true);
        BitVecPush(&source, false);
    
        BitVecFindLastPattern(&source, NULL); // Should cause LOG_FATAL
        BitVec source = BitVecInit(ALLOCATOR_OF(&alloc));
        size   results[10];
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        size   results[10];
        BitVecPush(&source, true);
        BitVecPush(&source, false);
    
        BitVecFindAllPattern(&source, NULL, results, 10); // Should cause LOG_FATAL
        BitVec source  = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVec pattern = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&pattern, true);
        BitVec pattern = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&pattern, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&pattern, true);
    
        BitVecFindAllPattern(&source, &pattern, NULL, 10); // Should cause LOG_FATAL
        BitVec pattern = BitVecInit(ALLOCATOR_OF(&alloc));
        size   results[10];
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&pattern, true);
        size   results[10];
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&pattern, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&pattern, true);
    
        BitVecFindAllPattern(&source, &pattern, results, 0); // Should cause LOG_FATAL
        WriteFmt("Testing BitVecStartsWith(NULL, prefix) - should fatal\n");
        BitVec prefix = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&prefix, true);
        BitVecStartsWith(NULL, &prefix);
        BitVecDeinit(&prefix);
        WriteFmt("Testing BitVecStartsWith(source, NULL) - should fatal\n");
        BitVec source = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&source, true);
        BitVecStartsWith(&source, NULL);
        BitVecDeinit(&source);
        WriteFmt("Testing BitVecEndsWith(NULL, suffix) - should fatal\n");
        BitVec suffix = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&suffix, true);
        BitVecEndsWith(NULL, &suffix);
        BitVecDeinit(&suffix);
        WriteFmt("Testing BitVecEndsWith(source, NULL) - should fatal\n");
        BitVec source = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&source, true);
        BitVecEndsWith(&source, NULL);
        BitVecDeinit(&source);
        WriteFmt("Testing BitVecContainsAt(NULL, pattern, 0) - should fatal\n");
        BitVec pattern = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&pattern, true);
        BitVecContainsAt(NULL, &pattern, 0);
        BitVecDeinit(&pattern);
        WriteFmt("Testing BitVecContainsAt(source, NULL, 0) - should fatal\n");
        BitVec source = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&source, true);
        BitVecContainsAt(&source, NULL, 0);
        BitVecDeinit(&source);
        BitVec pattern  = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVec wildcard = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&pattern, true);
        BitVecPush(&wildcard, false);
        BitVecMatches(NULL, &pattern, &wildcard);
        BitVec wildcard = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&pattern, true);
        BitVecPush(&wildcard, false);
        BitVecMatches(NULL, &pattern, &wildcard);
        BitVecDeinit(&pattern);
        WriteFmt("Testing BitVecRegexMatch(source, NULL) - should fatal\n");
        BitVec source = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&source, true);
        BitVecRegexMatch(&source, (Zstr)NULL);
        BitVecDeinit(&source);
        WriteFmt("Testing BitVecPrefixMatch(NULL, patterns, 1) - should fatal\n");
        BitVecs vp = VecInitWithDeepCopy(NULL, BitVecDeinit, ALLOCATOR_OF(&alloc));
        BitVecPush(VecPtrAt(&vp, 0), true);
        BitVecPrefixMatch(NULL, &vp);
        VecDeinit(&vp);
        WriteFmt("Testing BitVecPrefixMatch(source, NULL, 1) - should fatal\n");
        BitVec source = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&source, true);
        BitVecPrefixMatch(&source, NULL);
        BitVecDeinit(&source);
        WriteFmt("Testing BitVecSuffixMatch(NULL, patterns, 1) - should fatal\n");
        BitVecs vp = VecInitWithDeepCopy(NULL, BitVecDeinit, ALLOCATOR_OF(&alloc));
        BitVecPush(VecPtrAt(&vp, 0), true);
        BitVecSuffixMatch(NULL, &vp);
        VecDeinit(&vp);
        WriteFmt("Testing BitVecSuffixMatch(source, NULL, 1) - should fatal\n");
        BitVec source = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&source, true);
        BitVecSuffixMatch(&source, NULL);
        BitVecDeinit(&source);
    
        BitVec pattern = BitVecInit(base);
        BitVecPush(&pattern, true);
    
        BitVecMatchIndices matches = VecInitT(matches, base);
    
        BitVec source = BitVecInit(base);
        BitVecPush(&source, true);
    
        BitVecMatchIndices matches = VecInitT(matches, base);
    
        BitVec pattern = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&pattern, true);
    
        BitVecCountPattern(NULL, &pattern); // Should LOG_FATAL
    
        BitVec source = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&source, true);
    
        BitVecCountPattern(&source, NULL); // Should LOG_FATAL
    
        BitVec pattern = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&pattern, true);
    
        BitVecRFindPattern(NULL, &pattern, 0); // Should LOG_FATAL
    
        BitVec source = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&source, true);
    
        BitVecRFindPattern(&source, NULL, 0); // Should LOG_FATAL
        BitVec source   = BitVecInit(base);
        BitVec wildcard = BitVecInit(base);
        BitVecPush(&source, true);
        BitVecPush(&wildcard, false);
        BitVec wildcard = BitVecInit(base);
        BitVecPush(&source, true);
        BitVecPush(&wildcard, false);
    
        BitVecMatches(&source, NULL, &wildcard); // must abort
        BitVec source  = BitVecInit(base);
        BitVec pattern = BitVecInit(base);
        BitVecPush(&source, true);
        BitVecPush(&pattern, true);
        BitVec pattern = BitVecInit(base);
        BitVecPush(&source, true);
        BitVecPush(&pattern, true);
    
        BitVecMatches(&source, &pattern, NULL); // must abort
    
        BitVec pattern = BitVecInit(base);
        BitVecPush(&pattern, true);
    
        BitVecFuzzyMatch(NULL, &pattern, 0); // must abort
    
        BitVec source = BitVecInit(base);
        BitVecPush(&source, true);
    
        BitVecFuzzyMatch(&source, NULL, 0); // must abort
    
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv, true);
        bool values[5];
    
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv, true);
        u64 runs[5];
    
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv, true);
        u64  runs[5];
        bool values[5];
    
        // Add test pattern: true, false, true, false
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Add test pattern: true, false, true, false
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
    
        // Test forward iteration with index
    
        // Add test pattern: true, false, true
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Add test pattern: true, false, true
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
    
        // Test forward iteration without explicit index
    
        // Add test pattern: true, false, true, false
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Add test pattern: true, false, true, false
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
    
        // Test reverse iteration with index
    
        // Add test pattern: true, false, true
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Add test pattern: true, false, true
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
    
        // Test reverse iteration
    
        // Add test pattern: true, false, true, false, true
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Add test pattern: true, false, true, false, true
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
    
        // Test range iteration from index 1 to 4 (exclusive)
    
        // Add test pattern: false, true, true, false, true
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        // Add test pattern: false, true, true, false, true
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
    
        // Test range iteration from index 1 to 3 (exclusive)
    
        // Test foreach on single element
        BitVecPush(&bv, true);
        count = 0;
        BitVecForeach(&bv, bit) {
        BitVecClear(&bv);
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&bv, i % 2 == 0);
        }
    
        // Test foreach idx on single element
        BitVecPush(&bv, false);
        BitVecForeachIdx(&bv, bit, idx) {
            result   = result && (idx == 0);
        BitVecClear(&bv);
        for (int i = 0; i < 10; i++) {
            BitVecPush(&bv, i % 2 == 0);
        }
    
        // Test reverse foreach on single element
        BitVecPush(&bv, true);
        int count = 0;
        BitVecForeachReverse(&bv, bit) {
        // Test reverse ordering
        BitVecClear(&bv);
        BitVecPush(&bv, true);                          // idx 0
        BitVecPush(&bv, false);                         // idx 1
        BitVecPush(&bv, true);                          // idx 2
        BitVecClear(&bv);
        BitVecPush(&bv, true);                          // idx 0
        BitVecPush(&bv, false);                         // idx 1
        BitVecPush(&bv, true);                          // idx 2
        BitVecPush(&bv, true);                          // idx 0
        BitVecPush(&bv, false);                         // idx 1
        BitVecPush(&bv, true);                          // idx 2
    
        bool expected_sequence[] = {true, false, true}; // Reverse order
        // Setup test data
        for (int i = 0; i < 10; i++) {
            BitVecPush(&bv, i % 2 == 0);
        }
            // Create bitvec of varying sz
            for (int i = 0; i < sz; i++) {
                BitVecPush(&bv, i % 3 == 0);
            }
    
        // Test pattern: 11100101 (3 true, 2 false, 1 true, 1 false, 1 true)
        BitVecPush(&bv, true);  // 0
        BitVecPush(&bv, true);  // 1
        BitVecPush(&bv, true);  // 2
        // Test pattern: 11100101 (3 true, 2 false, 1 true, 1 false, 1 true)
        BitVecPush(&bv, true);  // 0
        BitVecPush(&bv, true);  // 1
        BitVecPush(&bv, true);  // 2
        BitVecPush(&bv, false); // 3
        BitVecPush(&bv, true);  // 0
        BitVecPush(&bv, true);  // 1
        BitVecPush(&bv, true);  // 2
        BitVecPush(&bv, false); // 3
        BitVecPush(&bv, false); // 4
        BitVecPush(&bv, true);  // 1
        BitVecPush(&bv, true);  // 2
        BitVecPush(&bv, false); // 3
        BitVecPush(&bv, false); // 4
        BitVecPush(&bv, true);  // 5
        BitVecPush(&bv, true);  // 2
        BitVecPush(&bv, false); // 3
        BitVecPush(&bv, false); // 4
        BitVecPush(&bv, true);  // 5
        BitVecPush(&bv, false); // 6
        BitVecPush(&bv, false); // 3
        BitVecPush(&bv, false); // 4
        BitVecPush(&bv, true);  // 5
        BitVecPush(&bv, false); // 6
        BitVecPush(&bv, true);  // 7
        BitVecPush(&bv, false); // 4
        BitVecPush(&bv, true);  // 5
        BitVecPush(&bv, false); // 6
        BitVecPush(&bv, true);  // 7
        BitVecPush(&bv, true);  // 5
        BitVecPush(&bv, false); // 6
        BitVecPush(&bv, true);  // 7
    
        u64  runs[10];
    
        BitVec bv = BitVecInit(base);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVec bv = BitVecInit(base);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
    
        BitVecRuns runs   = VecInitT(runs, base);
        // Test 2: Single bit (true)
        BitVec single_bv = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&single_bv, true);
        count  = BitVecRunLengths(&single_bv, runs, values, 5);
        result = result && (count == 1);
        // Test 3: Single bit (false)
        BitVec single_false_bv = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&single_false_bv, false);
        count  = BitVecRunLengths(&single_false_bv, runs, values, 5);
        result = result && (count == 1);
        BitVec all_true_bv = BitVecInit(ALLOCATOR_OF(&alloc));
        for (int i = 0; i < 10; i++) {
            BitVecPush(&all_true_bv, true);
        }
        count  = BitVecRunLengths(&all_true_bv, runs, values, 5);
        BitVec alternating_bv = BitVecInit(ALLOCATOR_OF(&alloc));
        for (int i = 0; i < 7; i++) {
            BitVecPush(&alternating_bv, i % 2 == 0);
        }
        u64  alt_runs[10];
        // Create pattern with many runs: 10101010 (8 runs)
        for (int i = 0; i < 8; i++) {
            BitVecPush(&bv, i % 2 == 0);
        }
            bool value = (block % 2 == 0);
            for (int i = 0; i < 5; i++) {
                BitVecPush(&large_bv, value);
            }
        }
    
        for (int i = 0; i < pattern_len; i++) {
            BitVecPush(&large_bv, pattern[i]);
        }
    
        // Set up first bitvector: 1101
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        // Set up first bitvector: 1101
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
    
        // Set up second bitvector: 1010
    
        // Set up second bitvector: 1010
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        // Set up second bitvector: 1010
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        // Perform AND operation
    
        // Set up first bitvector: 1100
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        // Set up first bitvector: 1100
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
    
        // Set up second bitvector: 1010
    
        // Set up second bitvector: 1010
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        // Set up second bitvector: 1010
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        // Perform OR operation
    
        // Set up first bitvector: 1100
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        // Set up first bitvector: 1100
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
    
        // Set up second bitvector: 1010
    
        // Set up second bitvector: 1010
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        // Set up second bitvector: 1010
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        // Perform XOR operation
    
        // Set up bitvector: 1010
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Set up bitvector: 1010
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
    
        // Perform NOT operation
    
        // Set up bitvector: 1011 (indices 0,1,2,3)
        BitVecPush(&bv, true);  // index 0
        BitVecPush(&bv, false); // index 1
        BitVecPush(&bv, true);  // index 2
        // Set up bitvector: 1011 (indices 0,1,2,3)
        BitVecPush(&bv, true);  // index 0
        BitVecPush(&bv, false); // index 1
        BitVecPush(&bv, true);  // index 2
        BitVecPush(&bv, true);  // index 3
        BitVecPush(&bv, true);  // index 0
        BitVecPush(&bv, false); // index 1
        BitVecPush(&bv, true);  // index 2
        BitVecPush(&bv, true);  // index 3
        BitVecPush(&bv, false); // index 1
        BitVecPush(&bv, true);  // index 2
        BitVecPush(&bv, true);  // index 3
    
        // Shift left by 2 positions
    
        // Set up bitvector: 1011
        BitVecPush(&bv, true);  // index 0
        BitVecPush(&bv, false); // index 1
        BitVecPush(&bv, true);  // index 2
        // Set up bitvector: 1011
        BitVecPush(&bv, true);  // index 0
        BitVecPush(&bv, false); // index 1
        BitVecPush(&bv, true);  // index 2
        BitVecPush(&bv, true);  // index 3
        BitVecPush(&bv, true);  // index 0
        BitVecPush(&bv, false); // index 1
        BitVecPush(&bv, true);  // index 2
        BitVecPush(&bv, true);  // index 3
        BitVecPush(&bv, false); // index 1
        BitVecPush(&bv, true);  // index 2
        BitVecPush(&bv, true);  // index 3
    
        // Shift right by 2 positions
    
        // Set up bitvector: 1011
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Set up bitvector: 1011
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
    
        // Rotate left by 2 positions
    
        // Set up bitvector: 1011
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Set up bitvector: 1011
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
    
        // Rotate right by 1 position
    
        // Set up bitvector: 1011
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Set up bitvector: 1011
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
    
        // Reverse the bits
    
        // Test shift by 0 (should be no-op)
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecShiftLeft(&bv, 0);
        // Test shift by 0 (should be no-op)
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecShiftLeft(&bv, 0);
        result = result && (BitVecLen(&bv) == 2);
        BitVecClear(&bv);
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&bv, i % 2 == 0);
        }
        BitVecShiftLeft(&bv, 1);
    
        // Test rotate by 0
        BitVecPush(&bv, true);
        BitVecRotateRight(&bv, 0);
        result = result && (BitVecGet(&bv, 0) == true);
    
        // Test rotate by length (should be no-op)
        BitVecPush(&bv, false);
        BitVecRotateLeft(&bv, 2);
        result = result && (BitVecLen(&bv) == 2);
    
        // Test operations with different lengths
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        // Test operations with different lengths
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
    
        BitVecAnd(&result_bv, &bv1, &bv2);
        result = result && (BitVecLen(&result_bv) == 0);
    
        BitVecPush(&bv1, true);
        BitVecNot(&result_bv, &bv1);
        result = result && (BitVecGet(&result_bv, 0) == false);
    
        // Test reverse single bit
        BitVecPush(&bv, true);
        BitVecReverse(&bv);
        result = result && (BitVecLen(&bv) == 1);
        // Test reverse even length
        BitVecClear(&bv);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecReverse(&bv);
        BitVecClear(&bv);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecReverse(&bv);
        result = result && (BitVecGet(&bv, 0) == false);
        // bv2: 1011     (4 bits)
        for (int i = 0; i < 8; i++) {
            BitVecPush(&bv1, (0b11010110 >> i) & 1);
        }
        for (int i = 0; i < 4; i++) {
        }
        for (int i = 0; i < 4; i++) {
            BitVecPush(&bv2, (0b1011 >> i) & 1);
        }
        BitVecClear(&bv1);
        BitVecClear(&bv2);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, false);
        BitVecClear(&bv2);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, false);
    
        BitVecAnd(&result, &bv1, &bv2);
        BitVecClear(&bv1);
        for (int i = 0; i < 100; i++) {
            BitVecPush(&bv1, i % 3 == 0);
        }
        // Pattern: 10101010 10101011 (16 bits) - asymmetric to detect shifts
        for (int i = 0; i < 15; i++) {
            BitVecPush(&bv, i % 2 == 0);
        }
        BitVecPush(&bv, true); // Make the last bit different to break symmetry
            BitVecPush(&bv, i % 2 == 0);
        }
        BitVecPush(&bv, true); // Make the last bit different to break symmetry
    
        // Test various shift amounts
        BitVecClear(&bv);
        for (int i = 0; i < 8; i++) {
            BitVecPush(&bv, true);
        }
        BitVecClear(&bv);
        for (int i = 0; i < 5; i++) {
            BitVecPush(&bv, true);
        }
        // Test boundary conditions - shift by length-1
        BitVecClear(&bv);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecClear(&bv);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
    
        BitVecShiftLeft(&bv, 2);
        // Pattern: 10110100
        for (int i = 0; i < 8; i++) {
            BitVecPush(&bv, (0b10110100 >> i) & 1);
        }
        // Test rotate with odd length
        BitVecClear(&bv);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecClear(&bv);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true); // 5 bits: 10101
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true); // 5 bits: 10101
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true); // 5 bits: 10101
    
        BitVecRotateLeft(&bv, 2);
        // Create test pattern
        for (int i = 0; i < 16; i++) {
            BitVecPush(&bv1, i % 3 == 0);
        }
        BitVecClear(&bv2);
        for (int i = 0; i < 16; i++) {
            BitVecPush(&bv2, false);
        }
        BitVecClear(&bv2);
        for (int i = 0; i < 16; i++) {
            BitVecPush(&bv2, true);
        }
        // Create different patterns
        for (int i = 0; i < 12; i++) {
            BitVecPush(&bv1, i % 2 == 0);
            BitVecPush(&bv2, i % 3 == 0);
        }
        for (int i = 0; i < 12; i++) {
            BitVecPush(&bv1, i % 2 == 0);
            BitVecPush(&bv2, i % 3 == 0);
        }
        // Create large bitvectors (1000 bits each)
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&bv1, i % 7 == 0);  // Pattern every 7 bits
            BitVecPush(&bv2, i % 11 == 0); // Pattern every 11 bits
        }
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&bv1, i % 7 == 0);  // Pattern every 7 bits
            BitVecPush(&bv2, i % 11 == 0); // Pattern every 11 bits
        }
        BitVecClear(&result);
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&result, i % 2 == 0);
        }
    
        // a = 10 (len 2)
        BitVecPush(&a, true);
        BitVecPush(&a, false);
        // a = 10 (len 2)
        BitVecPush(&a, true);
        BitVecPush(&a, false);
    
        // b = 0110 (len 4, strictly longer than a)
    
        // b = 0110 (len 4, strictly longer than a)
        BitVecPush(&b, false);
        BitVecPush(&b, true);
        BitVecPush(&b, true);
        // b = 0110 (len 4, strictly longer than a)
        BitVecPush(&b, false);
        BitVecPush(&b, true);
        BitVecPush(&b, true);
        BitVecPush(&b, false);
        BitVecPush(&b, false);
        BitVecPush(&b, true);
        BitVecPush(&b, true);
        BitVecPush(&b, false);
        BitVecPush(&b, true);
        BitVecPush(&b, true);
        BitVecPush(&b, false);
    
        BitVecOr(&result, &a, &b);
    
        // a = 10 (len 2)
        BitVecPush(&a, true);
        BitVecPush(&a, false);
        // a = 10 (len 2)
        BitVecPush(&a, true);
        BitVecPush(&a, false);
    
        // b = 0110 (len 4, strictly longer than a)
    
        // b = 0110 (len 4, strictly longer than a)
        BitVecPush(&b, false);
        BitVecPush(&b, true);
        BitVecPush(&b, true);
        // b = 0110 (len 4, strictly longer than a)
        BitVecPush(&b, false);
        BitVecPush(&b, true);
        BitVecPush(&b, true);
        BitVecPush(&b, false);
        BitVecPush(&b, false);
        BitVecPush(&b, true);
        BitVecPush(&b, true);
        BitVecPush(&b, false);
        BitVecPush(&b, true);
        BitVecPush(&b, true);
        BitVecPush(&b, false);
    
        BitVecXor(&result, &a, &b);
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
        for (int i = 0; i < 8; i++) {
            BitVecPush(&bv, true);
        }
    
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv, true);  // bit 0
        BitVecPush(&bv, true);  // bit 1
        BitVecPush(&bv, true);  // bit 2
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv, true);  // bit 0
        BitVecPush(&bv, true);  // bit 1
        BitVecPush(&bv, true);  // bit 2
        BitVecPush(&bv, true);  // bit 3
        BitVecPush(&bv, true);  // bit 0
        BitVecPush(&bv, true);  // bit 1
        BitVecPush(&bv, true);  // bit 2
        BitVecPush(&bv, true);  // bit 3
        BitVecPush(&bv, false); // bit 4
        BitVecPush(&bv, true);  // bit 1
        BitVecPush(&bv, true);  // bit 2
        BitVecPush(&bv, true);  // bit 3
        BitVecPush(&bv, false); // bit 4
        BitVecPush(&bv, false); // bit 5
        BitVecPush(&bv, true);  // bit 2
        BitVecPush(&bv, true);  // bit 3
        BitVecPush(&bv, false); // bit 4
        BitVecPush(&bv, false); // bit 5
        BitVecPush(&bv, false); // bit 6
        BitVecPush(&bv, true);  // bit 3
        BitVecPush(&bv, false); // bit 4
        BitVecPush(&bv, false); // bit 5
        BitVecPush(&bv, false); // bit 6
        BitVecPush(&bv, false); // bit 7
        BitVecPush(&bv, false); // bit 4
        BitVecPush(&bv, false); // bit 5
        BitVecPush(&bv, false); // bit 6
        BitVecPush(&bv, false); // bit 7
        BitVecPush(&bv, false); // bit 5
        BitVecPush(&bv, false); // bit 6
        BitVecPush(&bv, false); // bit 7
    
        BitVecShiftRight(&bv, 2);
        bool pat[5] = {true, false, false, true, true};
        for (int i = 0; i < 5; i++) {
            BitVecPush(&bv, pat[i]);
        }
        BitVecRotateRight(&bv, 2);
        // 1011 -- length > 1 and positions % length != 0 so the rotate body
        // (clone + copy-back) actually runs.
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // (clone + copy-back) actually runs.
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
    
        BitVecRotateRight(&bv, 1);
        // length > 1 and positions % length != 0 so the rotate body
        // (clone + copy-back) actually runs.
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // (clone + copy-back) actually runs.
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
    
        BitVecRotateLeft(&bv, 2);
        BitVec bv1 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVec bv2 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, false);
        BitVec bv2 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, false);
    
        // Test NULL result pointer - should abort
    static void push_bits(BitVec *bv, const char *bits) {
        for (const char *c = bits; *c != '\0'; c++)
            BitVecPush(bv, *c == '1');
    }
    
        // Create source: 11010011101
        BitVecPush(&source, true);  // 0
        BitVecPush(&source, true);  // 1
        BitVecPush(&source, false); // 2
        // Create source: 11010011101
        BitVecPush(&source, true);  // 0
        BitVecPush(&source, true);  // 1
        BitVecPush(&source, false); // 2
        BitVecPush(&source, true);  // 3
        BitVecPush(&source, true);  // 0
        BitVecPush(&source, true);  // 1
        BitVecPush(&source, false); // 2
        BitVecPush(&source, true);  // 3
        BitVecPush(&source, false); // 4
        BitVecPush(&source, true);  // 1
        BitVecPush(&source, false); // 2
        BitVecPush(&source, true);  // 3
        BitVecPush(&source, false); // 4
        BitVecPush(&source, false); // 5
        BitVecPush(&source, false); // 2
        BitVecPush(&source, true);  // 3
        BitVecPush(&source, false); // 4
        BitVecPush(&source, false); // 5
        BitVecPush(&source, true);  // 6
        BitVecPush(&source, true);  // 3
        BitVecPush(&source, false); // 4
        BitVecPush(&source, false); // 5
        BitVecPush(&source, true);  // 6
        BitVecPush(&source, true);  // 7
        BitVecPush(&source, false); // 4
        BitVecPush(&source, false); // 5
        BitVecPush(&source, true);  // 6
        BitVecPush(&source, true);  // 7
        BitVecPush(&source, true);  // 8
        BitVecPush(&source, false); // 5
        BitVecPush(&source, true);  // 6
        BitVecPush(&source, true);  // 7
        BitVecPush(&source, true);  // 8
        BitVecPush(&source, false); // 9
        BitVecPush(&source, true);  // 6
        BitVecPush(&source, true);  // 7
        BitVecPush(&source, true);  // 8
        BitVecPush(&source, false); // 9
        BitVecPush(&source, true);  // 10
        BitVecPush(&source, true);  // 7
        BitVecPush(&source, true);  // 8
        BitVecPush(&source, false); // 9
        BitVecPush(&source, true);  // 10
        BitVecPush(&source, true);  // 8
        BitVecPush(&source, false); // 9
        BitVecPush(&source, true);  // 10
    
        // Create pattern: 101
    
        // Create pattern: 101
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        // Create pattern: 101
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
    
        // Test basic pattern finding
        for (int i = 0; i < 12; i++) {
            bool bit = (i % 4 == 0 || i % 4 == 1 || i % 4 == 3);
            BitVecPush(&source, bit);
        }
    
        // Pattern 1: 101 (should find multiple occurrences)
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        // Pattern 1: 101 (should find multiple occurrences)
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
    
        u64 index = BitVecFindPattern(&source, &pattern);
        // Pattern 2: Single bit pattern
        BitVecClear(&pattern);
        BitVecPush(&pattern, true);
        index  = BitVecFindPattern(&source, &pattern);
        result = result && (index == 0); // First true bit at index 0
        // Pattern 3: Non-existent pattern
        BitVecClear(&pattern);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, false);
        BitVecClear(&pattern);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, false);
        index  = BitVecFindPattern(&source, &pattern);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, false);
        index  = BitVecFindPattern(&source, &pattern);
        result = result && (index == SIZE_MAX); // Should not find three consecutive falses
        // Pattern 4: Pattern at the end
        BitVecClear(&pattern);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        // Depending on the exact source pattern, adjust this test
        BitVecClear(&pattern);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        // Depending on the exact source pattern, adjust this test
        // Create source with multiple pattern occurrences: 101010101
        for (int i = 0; i < 9; i++) {
            BitVecPush(&source, i % 2 == 0);
        }
    
        // Pattern: 10
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        // Pattern: 10
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
    
        u64 index = BitVecFindLastPattern(&source, &pattern);
    
        // Source: 110011
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        // Source: 110011
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
    
        // Pattern: 001
    
        // Pattern: 001
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        // Pattern: 001
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
    
        index  = BitVecFindLastPattern(&source, &pattern);
        // Create source: 10101010101
        for (int i = 0; i < 11; i++) {
            BitVecPush(&source, i % 2 == 0);
        }
    
        // Pattern: 101
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        // Pattern: 101
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
    
        size results[10];
        for (int i = 0; i < 9; i++) {
            bool bit = (i % 3 == 0 || i % 3 == 1);
            BitVecPush(&source, bit);
        }
    
        // Pattern: 110
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        // Pattern: 110
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
    
        count  = BitVecFindAllPattern(&source, &pattern, results, 10);
        // Source: 10101010101 (11 bits)
        for (int i = 0; i < 11; i++)
            BitVecPush(&source, i % 2 == 0);
        // Pattern: 101
        BitVecPush(&pattern, true);
            BitVecPush(&source, i % 2 == 0);
        // Pattern: 101
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        // Pattern: 101
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
    
        BitVecMatchIndices matches = VecInitT(matches, base);
    
        // Test empty pattern
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        u64 index = BitVecFindPattern(&source, &pattern); // Empty pattern
        // Test empty pattern
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        u64 index = BitVecFindPattern(&source, &pattern); // Empty pattern
        result    = result && (index == SIZE_MAX);
        BitVecClear(&pattern);
        for (int i = 0; i < 5; i++) {
            BitVecPush(&pattern, true);
        }
        index  = BitVecFindPattern(&source, &pattern); // Pattern length 5, source length 2
        BitVecClear(&source);
        BitVecClear(&pattern);
        BitVecPush(&pattern, true);
        index  = BitVecFindPattern(&source, &pattern);
        result = result && (index == SIZE_MAX);
        BitVecClear(&source);
        BitVecClear(&pattern);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecClear(&pattern);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&pattern, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&source, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        index  = BitVecFindPattern(&source, &pattern);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        index  = BitVecFindPattern(&source, &pattern);
        result = result && (index == 0);
        BitVecClear(&source);
        BitVecClear(&pattern);
        BitVecPush(&source, true);
        BitVecPush(&pattern, true);
        index  = BitVecFindPattern(&source, &pattern);
        BitVecClear(&pattern);
        BitVecPush(&source, true);
        BitVecPush(&pattern, true);
        index  = BitVecFindPattern(&source, &pattern);
        result = result && (index == 0);
        result = result && (index == 0);
    
        BitVecPush(&pattern, false); // Now pattern is longer than source
        index  = BitVecFindPattern(&source, &pattern);
        result = result && (index == SIZE_MAX);
        BitVecClear(&source);
        BitVecClear(&pattern);
        BitVecPush(&source, true);
        BitVecPush(&pattern, true);
        BitVecClear(&pattern);
        BitVecPush(&source, true);
        BitVecPush(&pattern, true);
    
        u64 count = BitVecFindAllPattern(&source, &pattern, results, 1);
            // Create pattern "1010" every 100 bits, rest are "1100"
            if (i % 100 == 0) {
                BitVecPush(&source, true); // Start of 1010 pattern
                BitVecPush(&source, false);
                BitVecPush(&source, true);
            if (i % 100 == 0) {
                BitVecPush(&source, true); // Start of 1010 pattern
                BitVecPush(&source, false);
                BitVecPush(&source, true);
                BitVecPush(&source, false);
                BitVecPush(&source, true); // Start of 1010 pattern
                BitVecPush(&source, false);
                BitVecPush(&source, true);
                BitVecPush(&source, false);
                i += 3; // Skip next 3 iterations
                BitVecPush(&source, false);
                BitVecPush(&source, true);
                BitVecPush(&source, false);
                i += 3; // Skip next 3 iterations
            } else {
                i += 3; // Skip next 3 iterations
            } else {
                BitVecPush(&source, i % 2 == 0);
            }
        }
    
        // Pattern: 1010
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        // Pattern: 1010
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
    
        u64 index = BitVecFindPattern(&source, &pattern);
    
        // Create source: 110101
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        // Create source: 110101
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
    
        // Test prefix: 110
    
        // Test prefix: 110
        BitVecPush(&prefix, true);
        BitVecPush(&prefix, true);
        BitVecPush(&prefix, false);
        // Test prefix: 110
        BitVecPush(&prefix, true);
        BitVecPush(&prefix, true);
        BitVecPush(&prefix, false);
        BitVecPush(&prefix, true);
        BitVecPush(&prefix, true);
        BitVecPush(&prefix, false);
    
        result = result && BitVecStartsWith(&source, &prefix);
        // Test non-matching prefix: 101
        BitVecClear(&prefix);
        BitVecPush(&prefix, true);
        BitVecPush(&prefix, false);
        BitVecPush(&prefix, true);
        BitVecClear(&prefix);
        BitVecPush(&prefix, true);
        BitVecPush(&prefix, false);
        BitVecPush(&prefix, true);
        BitVecPush(&prefix, true);
        BitVecPush(&prefix, false);
        BitVecPush(&prefix, true);
    
        result = result && !BitVecStartsWith(&source, &prefix);
    
        // Test empty prefix (should always match)
        BitVecPush(&source, true);
        result = result && BitVecStartsWith(&source, &prefix);
        // Test prefix longer than source
        BitVecClear(&source);
        BitVecPush(&prefix, true);
        BitVecPush(&prefix, false);
        result = result && !BitVecStartsWith(&source, &prefix);
        BitVecClear(&source);
        BitVecPush(&prefix, true);
        BitVecPush(&prefix, false);
        result = result && !BitVecStartsWith(&source, &prefix);
        BitVecClear(&source);
        BitVecClear(&prefix);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&prefix, true);
        BitVecClear(&prefix);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&prefix, true);
        BitVecPush(&prefix, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&prefix, true);
        BitVecPush(&prefix, false);
        result = result && BitVecStartsWith(&source, &prefix);
        BitVecPush(&source, false);
        BitVecPush(&prefix, true);
        BitVecPush(&prefix, false);
        result = result && BitVecStartsWith(&source, &prefix);
    
        // Create source: 110101
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        // Create source: 110101
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
    
        // Test suffix: 101
    
        // Test suffix: 101
        BitVecPush(&suffix, true);
        BitVecPush(&suffix, false);
        BitVecPush(&suffix, true);
        // Test suffix: 101
        BitVecPush(&suffix, true);
        BitVecPush(&suffix, false);
        BitVecPush(&suffix, true);
        BitVecPush(&suffix, true);
        BitVecPush(&suffix, false);
        BitVecPush(&suffix, true);
    
        result = result && BitVecEndsWith(&source, &suffix);
        // Test non-matching suffix: 110
        BitVecClear(&suffix);
        BitVecPush(&suffix, true);
        BitVecPush(&suffix, true);
        BitVecPush(&suffix, false);
        BitVecClear(&suffix);
        BitVecPush(&suffix, true);
        BitVecPush(&suffix, true);
        BitVecPush(&suffix, false);
        BitVecPush(&suffix, true);
        BitVecPush(&suffix, true);
        BitVecPush(&suffix, false);
    
        result = result && !BitVecEndsWith(&source, &suffix);
    
        // Test empty suffix (should always match)
        BitVecPush(&source, true);
        result = result && BitVecEndsWith(&source, &suffix);
        // Test suffix longer than source
        BitVecClear(&source);
        BitVecPush(&suffix, true);
        BitVecPush(&suffix, false);
        result = result && !BitVecEndsWith(&source, &suffix);
        BitVecClear(&source);
        BitVecPush(&suffix, true);
        BitVecPush(&suffix, false);
        result = result && !BitVecEndsWith(&source, &suffix);
    
        // Create source: 1101011
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        // Create source: 1101011
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
    
        // Test pattern: 101 (exists at positions 2 and 4)
    
        // Test pattern: 101 (exists at positions 2 and 4)
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        // Test pattern: 101 (exists at positions 2 and 4)
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
    
        result = result && (BitVecFindPattern(&source, &pattern) != SIZE_MAX);
        // Test non-existing pattern: 000
        BitVecClear(&pattern);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, false);
        BitVecClear(&pattern);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, false);
    
        result = result && (BitVecFindPattern(&source, &pattern) == SIZE_MAX);
    
        // Create source: 1101011
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        // Create source: 1101011
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
    
        // Test pattern: 101
    
        // Test pattern: 101
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        // Test pattern: 101
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
    
        result = result && BitVecContainsAt(&source, &pattern, 1);  // Should match
    
        // Create small source
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        // Create small source
        BitVecPush(&source, true);
        BitVecPush(&source, false);
    
        // Test pattern that extends beyond source
    
        // Test pattern that extends beyond source
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        // Test pattern that extends beyond source
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
    
        result = result && !BitVecContainsAt(&source, &pattern, 0); // Pattern too long
        // Create source: 101010101
        for (int i = 0; i < 9; i++) {
            BitVecPush(&source, i % 2 == 0);
        }
    
        // Test pattern: 101 (should find 4 occurrences at 0, 2, 4, 6)
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        // Test pattern: 101 (should find 4 occurrences at 0, 2, 4, 6)
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
    
        u64 count = BitVecCountPattern(&source, &pattern);
        // Test pattern: 010 (should find 3 occurrences at 1, 3, 5)
        BitVecClear(&pattern);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecClear(&pattern);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
    
        count  = BitVecCountPattern(&source, &pattern);
    
        // Create source: 101101101
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        // Create source: 101101101
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
    
        // Test pattern: 101
    
        // Test pattern: 101
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        // Test pattern: 101
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
    
        // Search from index 8 backwards
    
        // Create source: 110110
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        // Create source: 110110
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
    
        // Old pattern: 110
    
        // Old pattern: 110
        BitVecPush(&old_pattern, true);
        BitVecPush(&old_pattern, true);
        BitVecPush(&old_pattern, false);
        // Old pattern: 110
        BitVecPush(&old_pattern, true);
        BitVecPush(&old_pattern, true);
        BitVecPush(&old_pattern, false);
        BitVecPush(&old_pattern, true);
        BitVecPush(&old_pattern, true);
        BitVecPush(&old_pattern, false);
    
        // New pattern: 101
    
        // New pattern: 101
        BitVecPush(&new_pattern, true);
        BitVecPush(&new_pattern, false);
        BitVecPush(&new_pattern, true);
        // New pattern: 101
        BitVecPush(&new_pattern, true);
        BitVecPush(&new_pattern, false);
        BitVecPush(&new_pattern, true);
        BitVecPush(&new_pattern, true);
        BitVecPush(&new_pattern, false);
        BitVecPush(&new_pattern, true);
    
        bool replaced = BitVecReplace(&source, &old_pattern, &new_pattern);
        // Create source: 110110110
        for (int i = 0; i < 3; i++) {
            BitVecPush(&source, true);
            BitVecPush(&source, true);
            BitVecPush(&source, false);
        for (int i = 0; i < 3; i++) {
            BitVecPush(&source, true);
            BitVecPush(&source, true);
            BitVecPush(&source, false);
        }
            BitVecPush(&source, true);
            BitVecPush(&source, true);
            BitVecPush(&source, false);
        }
    
        // Old pattern: 110
        BitVecPush(&old_pattern, true);
        BitVecPush(&old_pattern, true);
        BitVecPush(&old_pattern, false);
        // Old pattern: 110
        BitVecPush(&old_pattern, true);
        BitVecPush(&old_pattern, true);
        BitVecPush(&old_pattern, false);
        BitVecPush(&old_pattern, true);
        BitVecPush(&old_pattern, true);
        BitVecPush(&old_pattern, false);
    
        // New pattern: 01
    
        // New pattern: 01
        BitVecPush(&new_pattern, false);
        BitVecPush(&new_pattern, true);
        // New pattern: 01
        BitVecPush(&new_pattern, false);
        BitVecPush(&new_pattern, true);
    
        u64 replacements = BitVecReplaceAll(&source, &old_pattern, &new_pattern);
    
        // Create source: 1101
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        // Create source: 1101
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
    
        // Create pattern: 1?01 (where ? can be anything)
    
        // Create pattern: 1?01 (where ? can be anything)
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false); // This will be wildcarded
        BitVecPush(&pattern, false);
        // Create pattern: 1?01 (where ? can be anything)
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false); // This will be wildcarded
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false); // This will be wildcarded
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false); // This will be wildcarded
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
    
        // Create wildcard: 0100 (1 means wildcard, 0 means must match exactly)
    
        // Create wildcard: 0100 (1 means wildcard, 0 means must match exactly)
        BitVecPush(&wildcard, false);
        BitVecPush(&wildcard, true); // Wildcard position
        BitVecPush(&wildcard, false);
        // Create wildcard: 0100 (1 means wildcard, 0 means must match exactly)
        BitVecPush(&wildcard, false);
        BitVecPush(&wildcard, true); // Wildcard position
        BitVecPush(&wildcard, false);
        BitVecPush(&wildcard, false);
        BitVecPush(&wildcard, false);
        BitVecPush(&wildcard, true); // Wildcard position
        BitVecPush(&wildcard, false);
        BitVecPush(&wildcard, false);
        BitVecPush(&wildcard, true); // Wildcard position
        BitVecPush(&wildcard, false);
        BitVecPush(&wildcard, false);
    
        result = result && BitVecMatches(&source, &pattern, &wildcard);
    
        // Create source: 110100111
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        // Create source: 110100111
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, false);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
    
        // Create pattern: 111 (should match at position 6 with 0 errors)
    
        // Create pattern: 111 (should match at position 6 with 0 errors)
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        // Create pattern: 111 (should match at position 6 with 0 errors)
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
    
        u64 pos = BitVecFuzzyMatch(&source, &pattern, 0);
    
        // Create source: 101010
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        // Create source: 101010
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
    
        // Test simple substring match
    
        // Create source: 110101
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        // Create source: 110101
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
    
        BitVec *p0 = VecPtrAt(&patterns, 0);
    
        // Pattern 0: 111 (should not match)
        BitVecPush(p0, true);
        BitVecPush(p0, true);
        BitVecPush(p0, true);
        // Pattern 0: 111 (should not match)
        BitVecPush(p0, true);
        BitVecPush(p0, true);
        BitVecPush(p0, true);
        BitVecPush(p0, true);
        BitVecPush(p0, true);
        BitVecPush(p0, true);
    
        // Pattern 1: 110 (should match)
    
        // Pattern 1: 110 (should match)
        BitVecPush(p1, true);
        BitVecPush(p1, true);
        BitVecPush(p1, false);
        // Pattern 1: 110 (should match)
        BitVecPush(p1, true);
        BitVecPush(p1, true);
        BitVecPush(p1, false);
        BitVecPush(p1, true);
        BitVecPush(p1, true);
        BitVecPush(p1, false);
    
        // Pattern 2: 101 (should not match as prefix)
    
        // Pattern 2: 101 (should not match as prefix)
        BitVecPush(p2, true);
        BitVecPush(p2, false);
        BitVecPush(p2, true);
        // Pattern 2: 101 (should not match as prefix)
        BitVecPush(p2, true);
        BitVecPush(p2, false);
        BitVecPush(p2, true);
        BitVecPush(p2, true);
        BitVecPush(p2, false);
        BitVecPush(p2, true);
    
        u64 match_idx = BitVecPrefixMatch(&source, &patterns);
    
        // Create source: 110101
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        // Create source: 110101
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
    
        BitVec *p0 = VecPtrAt(&patterns, 0);
    
        // Pattern 0: 111 (should not match)
        BitVecPush(p0, true);
        BitVecPush(p0, true);
        BitVecPush(p0, true);
        // Pattern 0: 111 (should not match)
        BitVecPush(p0, true);
        BitVecPush(p0, true);
        BitVecPush(p0, true);
        BitVecPush(p0, true);
        BitVecPush(p0, true);
        BitVecPush(p0, true);
    
        // Pattern 1: 101 (should match as suffix)
    
        // Pattern 1: 101 (should match as suffix)
        BitVecPush(p1, true);
        BitVecPush(p1, false);
        BitVecPush(p1, true);
        // Pattern 1: 101 (should match as suffix)
        BitVecPush(p1, true);
        BitVecPush(p1, false);
        BitVecPush(p1, true);
        BitVecPush(p1, true);
        BitVecPush(p1, false);
        BitVecPush(p1, true);
    
        // Pattern 2: 110 (should not match as suffix)
    
        // Pattern 2: 110 (should not match as suffix)
        BitVecPush(p2, true);
        BitVecPush(p2, true);
        BitVecPush(p2, false);
        // Pattern 2: 110 (should not match as suffix)
        BitVecPush(p2, true);
        BitVecPush(p2, true);
        BitVecPush(p2, false);
        BitVecPush(p2, true);
        BitVecPush(p2, true);
        BitVecPush(p2, false);
    
        u64 match_idx = BitVecSuffixMatch(&source, &patterns);
    
        // Source and pattern are both 1011, same length.
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        // Source and pattern are both 1011, same length.
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
    
        BitVecPush(&pattern, true);
        BitVecPush(&source, true);
    
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
    
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
    
        // Exact-length match must be found at index 0.
    
        // Source and pattern are both 110, same length.
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        // Source and pattern are both 110, same length.
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
    
        BitVecPush(&pattern, true);
        BitVecPush(&source, false);
    
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
    
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, false);
    
        BitVecMatchIndices matches = VecInitT(matches, base);
        // source: 0000 (no occurrence of "11")
        for (int i = 0; i < 4; i++)
            BitVecPush(&source, false);
    
        // old: 11 (absent), new: 1
    
        // old: 11 (absent), new: 1
        BitVecPush(&old, true);
        BitVecPush(&old, true);
        BitVecPush(&neww, true);
        // old: 11 (absent), new: 1
        BitVecPush(&old, true);
        BitVecPush(&old, true);
        BitVecPush(&neww, true);
        BitVecPush(&old, true);
        BitVecPush(&old, true);
        BitVecPush(&neww, true);
    
        u64 n  = BitVecReplaceAll(&source, &old, &neww);
        // source: 110110110
        for (int i = 0; i < 3; i++) {
            BitVecPush(&source, true);
            BitVecPush(&source, true);
            BitVecPush(&source, false);
        for (int i = 0; i < 3; i++) {
            BitVecPush(&source, true);
            BitVecPush(&source, true);
            BitVecPush(&source, false);
        }
            BitVecPush(&source, true);
            BitVecPush(&source, true);
            BitVecPush(&source, false);
        }
    
        // old: 110, new: 01  (each 110 -> 01, result 010101)
        BitVecPush(&old, true);
        BitVecPush(&old, true);
        BitVecPush(&old, false);
        // old: 110, new: 01  (each 110 -> 01, result 010101)
        BitVecPush(&old, true);
        BitVecPush(&old, true);
        BitVecPush(&old, false);
        BitVecPush(&neww, false);
        BitVecPush(&old, true);
        BitVecPush(&old, true);
        BitVecPush(&old, false);
        BitVecPush(&neww, false);
        BitVecPush(&neww, true);
        BitVecPush(&old, true);
        BitVecPush(&old, false);
        BitVecPush(&neww, false);
        BitVecPush(&neww, true);
        BitVecPush(&old, false);
        BitVecPush(&neww, false);
        BitVecPush(&neww, true);
    
        u64 n  = BitVecReplaceAll(&source, &old, &neww);
        // source: 1010, pattern: 1111, wildcard: 0000 (no wildcards).
        // Position 0 matches (1 vs 1); position 1 mismatches (0 vs 1) -> false.
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        // Position 0 matches (1 vs 1); position 1 mismatches (0 vs 1) -> false.
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
    
        for (int i = 0; i < 4; i++)
    
        for (int i = 0; i < 4; i++)
            BitVecPush(&pattern, true);
        for (int i = 0; i < 4; i++)
            BitVecPush(&wildcard, false);
            BitVecPush(&pattern, true);
        for (int i = 0; i < 4; i++)
            BitVecPush(&wildcard, false);
    
        result = result && (BitVecMatches(&source, &pattern, &wildcard) == false);
        BitVec wild_all = BitVecInit(base);
        for (int i = 0; i < 4; i++)
            BitVecPush(&wild_all, true);
        result = result && (BitVecMatches(&source, &pattern, &wild_all) == true);
        // source: 111, pattern: 111 (same length, exact match).
        for (int i = 0; i < 3; i++) {
            BitVecPush(&source, true);
            BitVecPush(&pattern, true);
        }
        for (int i = 0; i < 3; i++) {
            BitVecPush(&source, true);
            BitVecPush(&pattern, true);
        }
        // source: 00000111 (8 bits), pattern: 111.
        for (int i = 0; i < 5; i++)
            BitVecPush(&source, false);
        for (int i = 0; i < 3; i++)
            BitVecPush(&source, true);
            BitVecPush(&source, false);
        for (int i = 0; i < 3; i++)
            BitVecPush(&source, true);
    
        BitVecPush(&pattern, true);
            BitVecPush(&source, true);
    
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
    
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
        BitVecPush(&pattern, true);
    
        // Window [4,6] = 011 -> 1 error <= 1 (first acceptable window).
        // zero errors, so the loop must traverse every valid i and report SIZE_MAX.
        for (int i = 0; i < 4096; i++)
            BitVecPush(&source, false);
        BitVecPush(&pattern, true);
        for (int i = 0; i < 4096; i++)
            BitVecPush(&source, false);
        BitVecPush(&pattern, true);
    
        bool result = (BitVecFuzzyMatch(&source, &pattern, 0) == SIZE_MAX);
    
        // Source rendering: 101010
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        // Source rendering: 101010
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
        BitVecPush(&source, false);
        BitVecPush(&source, true);
        BitVecPush(&source, false);
    
        // "111" never appears in "101010" -> must be false.
    
        // 101010 so the render is a non-empty Str that must be freed.
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // 101010 so the render is a non-empty Str that must be freed.
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
    
        bool matched = BitVecRegexMatch(&bv, "101");
    
        BitVec bv = BitVecInit(adbg);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVec bv = BitVecInit(adbg);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
    
        // Pattern "101" as a Str on a separate (untracked) allocator.
    static void push_bits(BitVec *bv, const char *bits) {
        for (const char *p = bits; *p != '\0'; p++)
            BitVecPush(bv, *p == '1');
    }
    
        // Test identical bitvectors
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        // Test identical bitvectors
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
    
        u64 distance = BitVecHammingDistance(&bv1, &bv2);
        // Test completely different bitvectors
        BitVecClear(&bv2);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecClear(&bv2);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        distance = BitVecHammingDistance(&bv1, &bv2);
        // Test partially different bitvectors
        BitVecClear(&bv2);
        BitVecPush(&bv2, true); // Same
        BitVecPush(&bv2, true); // Different
        BitVecPush(&bv2, true); // Same
        BitVecClear(&bv2);
        BitVecPush(&bv2, true); // Same
        BitVecPush(&bv2, true); // Different
        BitVecPush(&bv2, true); // Same
        BitVecPush(&bv2, true); // Same
        BitVecPush(&bv2, true); // Different
        BitVecPush(&bv2, true); // Same
    
        distance = BitVecHammingDistance(&bv1, &bv2);
    
        // Test different lengths
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, true);
        // Test different lengths
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, true);
    
        distance = BitVecHammingDistance(&bv1, &bv2);
    
        // Test identical bitvectors
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        // Test identical bitvectors
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
    
        double similarity = BitVecJaccardSimilarity(&bv1, &bv2);
        BitVecClear(&bv1);
        BitVecClear(&bv2);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        BitVecClear(&bv2);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
    
        similarity = BitVecJaccardSimilarity(&bv1, &bv2);
        BitVecClear(&bv1);
        BitVecClear(&bv2);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecClear(&bv2);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        // Intersection: 1, Union: 2, Jaccard = 1/2 = 0.5
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        // Intersection: 1, Union: 2, Jaccard = 1/2 = 0.5
    
        // Test all zeros
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        // Test all zeros
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
    
        similarity = BitVecJaccardSimilarity(&bv1, &bv2);
    
        // Test identical bitvectors
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        // Test identical bitvectors
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
    
        double similarity = BitVecCosineSimilarity(&bv1, &bv2);
        BitVecClear(&bv1);
        BitVecClear(&bv2);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        BitVecClear(&bv2);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
    
        similarity = BitVecCosineSimilarity(&bv1, &bv2);
    
        // Test zero vectors
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        // Test zero vectors
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
    
        double similarity = BitVecCosineSimilarity(&bv1, &bv2);
        // Test one zero vector
        BitVecClear(&bv2);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecClear(&bv2);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        similarity = BitVecCosineSimilarity(&bv1, &bv2);
    
        // Test basic dot product
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        // Test basic dot product
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
    
        u64 product = BitVecDotProduct(&bv1, &bv2);
        BitVecClear(&bv1);
        BitVecClear(&bv2);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        BitVecClear(&bv2);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
    
        product = BitVecDotProduct(&bv1, &bv2);
    
        // Test different lengths
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        // Test different lengths
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        product = BitVecDotProduct(&bv1, &bv2);
    
        // Test identical strings
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        // Test identical strings
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
    
        bool error    = true;
        // Test single substitution
        BitVecClear(&bv2);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true); // Changed from false
        BitVecPush(&bv2, true);
        BitVecClear(&bv2);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true); // Changed from false
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true); // Changed from false
        BitVecPush(&bv2, true);
    
        distance = BitVecEditDistance(&bv1, &bv2);
        // Test insertion
        BitVecClear(&bv2);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecClear(&bv2);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false); // Extra bit
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false); // Extra bit
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false); // Extra bit
    
        distance = BitVecEditDistance(&bv1, &bv2);
    
        // Test empty to non-empty
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        // Test empty to non-empty
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        distance = BitVecEditDistance(&bv1, &bv2);
    
        // Test perfect correlation
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        // Test perfect correlation
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        double correlation = BitVecCorrelation(&bv1, &bv2);
        // Test perfect anti-correlation
        BitVecClear(&bv2);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecClear(&bv2);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
    
        correlation = BitVecCorrelation(&bv1, &bv2);
    
        // Test uniform vectors
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        // Test uniform vectors
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
    
        correlation = BitVecCorrelation(&bv1, &bv2);
    
        // Test maximum entropy (equal 0s and 1s)
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Test maximum entropy (equal 0s and 1s)
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
    
        double entropy = BitVecEntropy(&bv);
        // Test minimum entropy (all same)
        BitVecClear(&bv);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecClear(&bv);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
    
        entropy = BitVecEntropy(&bv);
    
        // Test single bit
        BitVecPush(&bv, true);
        entropy = BitVecEntropy(&bv);
        result  = result && (entropy == 0.0);
    
        // Test perfect match
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        // Test perfect match
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
    
        int score = BitVecAlignmentScore(&bv1, &bv2, 2, -1);
        // Test perfect mismatch
        BitVecClear(&bv2);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecClear(&bv2);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        score  = BitVecAlignmentScore(&bv1, &bv2, 2, -1);
    
        // Test different lengths (only overlapping region scored)
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        // Test different lengths (only overlapping region scored)
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        score  = BitVecAlignmentScore(&bv1, &bv2, 1, -1);
    
        // Create bv1: 1100110
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        // Create bv1: 1100110
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
    
        // Create bv2: 110 (should match at position 0 and 4)
    
        // Create bv2: 110 (should match at position 0 and 4)
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        // Create bv2: 110 (should match at position 0 and 4)
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        u64 best_pos = BitVecBestAlignment(&bv1, &bv2);
    
        // Test bv2 longer than bv1
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        // Test bv2 longer than bv1
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        best_pos = BitVecBestAlignment(&bv1, &bv2);
        // Create large bitvectors
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&bv1, i % 2 == 0);
            BitVecPush(&bv2, i % 3 == 0);
        }
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&bv1, i % 2 == 0);
            BitVecPush(&bv2, i % 3 == 0);
        }
        BitVec small2 = BitVecInit(ALLOCATOR_OF(&alloc));
        for (int i = 0; i < 50; i++) {
            BitVecPush(&small1, i % 2 == 0);
            BitVecPush(&small2, i % 3 == 0);
        }
        for (int i = 0; i < 50; i++) {
            BitVecPush(&small1, i % 2 == 0);
            BitVecPush(&small2, i % 3 == 0);
        }
        u64 edit_dist = BitVecEditDistance(&small1, &small2);
        WriteFmt("Testing BitVecHammingDistance(NULL, bv2) - should fatal\n");
        BitVec bv2 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv2, true);
        BitVecHammingDistance(NULL, &bv2);
        BitVecDeinit(&bv2);
        WriteFmt("Testing BitVecHammingDistance(bv1, NULL) - should fatal\n");
        BitVec bv1 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv1, true);
        BitVecHammingDistance(&bv1, NULL);
        BitVecDeinit(&bv1);
        WriteFmt("Testing BitVecJaccardSimilarity(NULL, bv2) - should fatal\n");
        BitVec bv2 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv2, true);
        BitVecJaccardSimilarity(NULL, &bv2);
        BitVecDeinit(&bv2);
        WriteFmt("Testing BitVecJaccardSimilarity(bv1, NULL) - should fatal\n");
        BitVec bv1 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv1, true);
        BitVecJaccardSimilarity(&bv1, NULL);
        BitVecDeinit(&bv1);
        WriteFmt("Testing BitVecCosineSimilarity(NULL, bv2) - should fatal\n");
        BitVec bv2 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv2, true);
        BitVecCosineSimilarity(NULL, &bv2);
        BitVecDeinit(&bv2);
        WriteFmt("Testing BitVecCosineSimilarity(bv1, NULL) - should fatal\n");
        BitVec bv1 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv1, true);
        BitVecCosineSimilarity(&bv1, NULL);
        BitVecDeinit(&bv1);
        WriteFmt("Testing BitVecDotProduct(NULL, bv2) - should fatal\n");
        BitVec bv2 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv2, true);
        BitVecDotProduct(NULL, &bv2);
        BitVecDeinit(&bv2);
        WriteFmt("Testing BitVecDotProduct(bv1, NULL) - should fatal\n");
        BitVec bv1 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv1, true);
        BitVecDotProduct(&bv1, NULL);
        BitVecDeinit(&bv1);
        WriteFmt("Testing BitVecEditDistance(NULL, bv2) - should fatal\n");
        BitVec bv2 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv2, true);
        BitVecEditDistance(NULL, &bv2);
        BitVecDeinit(&bv2);
        WriteFmt("Testing BitVecEditDistance(bv1, NULL) - should fatal\n");
        BitVec bv1 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv1, true);
        BitVecEditDistance(&bv1, NULL);
        BitVecDeinit(&bv1);
        WriteFmt("Testing BitVecCorrelation(NULL, bv2) - should fatal\n");
        BitVec bv2 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv2, true);
        BitVecCorrelation(NULL, &bv2);
        BitVecDeinit(&bv2);
        WriteFmt("Testing BitVecCorrelation(bv1, NULL) - should fatal\n");
        BitVec bv1 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv1, true);
        BitVecCorrelation(&bv1, NULL);
        BitVecDeinit(&bv1);
        WriteFmt("Testing BitVecAlignmentScore(NULL, bv2, 1, -1) - should fatal\n");
        BitVec bv2 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv2, true);
        BitVecAlignmentScore(NULL, &bv2, 1, -1);
        BitVecDeinit(&bv2);
        WriteFmt("Testing BitVecAlignmentScore(bv1, NULL, 1, -1) - should fatal\n");
        BitVec bv1 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv1, true);
        BitVecAlignmentScore(&bv1, NULL, 1, -1);
        BitVecDeinit(&bv1);
        WriteFmt("Testing BitVecBestAlignment(NULL, bv2) - should fatal\n");
        BitVec bv2 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv2, true);
        BitVecBestAlignment(NULL, &bv2);
        BitVecDeinit(&bv2);
        WriteFmt("Testing BitVecBestAlignment(bv1, NULL) - should fatal\n");
        BitVec bv1 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv1, true);
        BitVecBestAlignment(&bv1, NULL);
        BitVecDeinit(&bv1);
        BitVec empty = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVec one   = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&one, true);
    
        bool result = true;
    
        // bv1 = {1}, bv2 = {1, 0}. Intersection 1 (pos 0), union 1 -> 1.0.
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        // bv1 = {1}, bv2 = {1, 0}. Intersection 1 (pos 0), union 1 -> 1.0.
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        double s      = BitVecJaccardSimilarity(&bv1, &bv2);
    
        // bv1 = {1, 0}, bv2 = {1}. Intersection 1 (pos 0), union 1 -> 1.0.
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, true);
        // bv1 = {1, 0}, bv2 = {1}. Intersection 1 (pos 0), union 1 -> 1.0.
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, true);
    
        double s      = BitVecJaccardSimilarity(&bv1, &bv2);
    
        // bv1 = {0, 0}, bv2 = {1, 1}. Intersection 0, union 2 -> 0.0.
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, true);
        // bv1 = {0, 0}, bv2 = {1, 1}. Intersection 0, union 2 -> 0.0.
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
    
        double s      = BitVecJaccardSimilarity(&bv1, &bv2);
        BitVec bv2 = BitVecInit(ALLOCATOR_OF(&alloc));
    
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
    
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
    
        u64  dist   = BitVecEditDistance(&bv1, &bv2);
        BitVec bv2 = BitVecInit(ALLOCATOR_OF(&alloc));
    
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, false);
    
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, false);
    
        u64  dist   = BitVecEditDistance(&bv1, &bv2);
        BitVec warm_b = BitVecInit(ALLOCATOR_OF(&alloc));
        for (int i = 0; i < 5; i++) {
            BitVecPush(&warm_a, (i % 2) == 0);
            BitVecPush(&warm_b, (i % 3) == 0);
        }
        for (int i = 0; i < 5; i++) {
            BitVecPush(&warm_a, (i % 2) == 0);
            BitVecPush(&warm_b, (i % 3) == 0);
        }
        (void)BitVecEditDistance(&warm_a, &warm_b);
        BitVec bv2 = BitVecInit(ALLOCATOR_OF(&alloc));
        for (int i = 0; i < 5; i++) {
            BitVecPush(&bv2, true);
        }
        BitVec warm_b = BitVecInit(ALLOCATOR_OF(&alloc));
        for (int i = 0; i < 4; i++) {
            BitVecPush(&warm_a, (i % 2) == 1);
            BitVecPush(&warm_b, (i % 2) == 0);
        }
        for (int i = 0; i < 4; i++) {
            BitVecPush(&warm_a, (i % 2) == 1);
            BitVecPush(&warm_b, (i % 2) == 0);
        }
        (void)BitVecEditDistance(&warm_a, &warm_b);
        BitVec bv2 = BitVecInit(ALLOCATOR_OF(&alloc));
        for (int i = 0; i < 4; i++) {
            BitVecPush(&bv2, false);
        }
        BitVec bv2 = BitVecInit(ALLOCATOR_OF(&alloc));
    
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
    
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
    
        u64  dist   = BitVecEditDistance(&bv1, &bv2);
    
        // bv1 length 2, bv2 length 4 -> bv1 is the shorter operand.
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        // bv1 length 2, bv2 length 4 -> bv1 is the shorter operand.
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, false);
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, false);
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        double correlation = BitVecCorrelation(&bv1, &bv2);
    
        // bv1 length 4, bv2 length 2 -> bv2 is the shorter operand.
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        // bv1 length 4, bv2 length 2 -> bv2 is the shorter operand.
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, true);
        BitVecPush(&bv1, false);
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv1, false);
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, false);
    
        double correlation = BitVecCorrelation(&bv1, &bv2);
        bool   result = true;
    
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
    
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
    
        double entropy = BitVecEntropy(&bv);
    
        // bv1 = 0 0 0 0
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        // bv1 = 0 0 0 0
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
        BitVecPush(&bv1, false);
    
        // bv2 = 1 1
    
        // bv2 = 1 1
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
        // bv2 = 1 1
        BitVecPush(&bv2, true);
        BitVecPush(&bv2, true);
    
        u64 best_offset = BitVecBestAlignment(&bv1, &bv2);
        // With sqrt forced to sqrt(42), cosine collapses to 4/42 ~= 0.095.
        for (u64 i = 0; i < 4; i++) {
            BitVecPush(&bv1, true);
            BitVecPush(&bv2, true);
        }
        for (u64 i = 0; i < 4; i++) {
            BitVecPush(&bv1, true);
            BitVecPush(&bv2, true);
        }
        // 3 ones, 1 zero -> p1=0.75, p0=0.25.
        // entropy = -(0.75*log2(0.75) + 0.25*log2(0.25)) ~= 0.8112782517.
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        // entropy = -(0.75*log2(0.75) + 0.25*log2(0.25)) ~= 0.8112782517.
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
    
        double entropy = BitVecEntropy(&bv);
    
        // 1000 -> one 1, three 0s : p1 = 0.25, p0 = 0.75.
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        // 1000 -> one 1, three 0s : p1 = 0.25, p0 = 0.75.
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
    
        double entropy = BitVecEntropy(&bv);
    
        // Add some bits
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Add some bits
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
    
        // Pop the last bit
    
        // Add some bits: true, false, true, false, true
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Add some bits: true, false, true, false, true
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
    
        // Remove bit at index 2 (middle true)
    
        // Add some bits: true, false, true, true, false, true
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Add some bits: true, false, true, true, false, true
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
    
        // Remove range from index 1 to 3 (3 bits)
    
        // Add some bits: true, false, true, false, true
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Add some bits: true, false, true, false, true
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
    
        // Remove first occurrence of false
    
        // Add some bits: true, false, true, false, true
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Add some bits: true, false, true, false, true
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
    
        // Remove last occurrence of false
    
        // Add some bits: true, false, true, false, true, false
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Add some bits: true, false, true, false, true, false
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
    
        // Remove all false bits
    
        // Test pop single element
        BitVecPush(&bv, true);
        bool popped = BitVecPop(&bv);
        result      = result && (popped == true) && (BitVecLen(&bv) == 0);
        // Test multiple pops in sequence
        for (int i = 0; i < 100; i++) {
            BitVecPush(&bv, i % 2 == 0);
        }
        for (int i = 99; i >= 0; i--) {
    
        // Test remove last element
        BitVecPush(&bv, true);
        bool removed = BitVecRemove(&bv, 0);
        result       = result && (removed == true) && (BitVecLen(&bv) == 0);
        // Test remove from large bitvec
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&bv, i % 3 == 0);
        }
    
        // Test remove 0 elements (should be no-op)
        BitVecPush(&bv, true);
        BitVecRemoveRange(&bv, 0, 0);
        result = result && (BitVecLen(&bv) == 1);
        BitVecClear(&bv);
        for (int i = 0; i < 10; i++) {
            BitVecPush(&bv, i % 2 == 0);
        }
        BitVecRemoveRange(&bv, 0, 10);
        // Test remove partial range
        for (int i = 0; i < 10; i++) {
            BitVecPush(&bv, i % 2 == 0);
        }
        BitVecRemoveRange(&bv, 1, 5);             // Remove 5 elements starting at index 1
    
        // Test remove when value doesn't exist
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        found  = BitVecRemoveFirst(&bv, false);
        // Test remove when value doesn't exist
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        found  = BitVecRemoveFirst(&bv, false);
        result = result && (found == false) && (BitVecLen(&bv) == 2);
        // Test remove single occurrence
        BitVecClear(&bv);
        BitVecPush(&bv, false);
        found  = BitVecRemoveFirst(&bv, false);
        result = result && (found == true) && (BitVecLen(&bv) == 0);
        // Test remove from large uniform data
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&bv, true);
        }
        found  = BitVecRemoveFirst(&bv, true);
    
        // Test remove all when value doesn't exist
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        count  = BitVecRemoveAll(&bv, false);
        // Test remove all when value doesn't exist
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        count  = BitVecRemoveAll(&bv, false);
        result = result && (count == 0) && (BitVecLen(&bv) == 2);
        BitVecClear(&bv);
        for (int i = 0; i < 100; i++) {
            BitVecPush(&bv, true);
        }
        count  = BitVecRemoveAll(&bv, true);
        // Test remove all mixed data
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&bv, i % 2 == 0);
        }
        count  = BitVecRemoveAll(&bv, false); // Remove odds
        // Length 10, all true.
        for (int i = 0; i < 10; i++) {
            BitVecPush(&bv, true);
        }
        // Length 10, all true.
        for (int i = 0; i < 10; i++) {
            BitVecPush(&bv, true);
        }
        bool pattern[] = {true, false, true, false, false, true, false, true, true, false};
        for (int i = 0; i < 10; i++) {
            BitVecPush(&bv, pattern[i]);
        }
    
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
    
        // length is 3; idx 3 is out of range and must abort.
    
        // Create pattern: 1011
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Create pattern: 1011
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
    
        // Convert to string
    
        // Create pattern: 10110011 (0xB3)
        BitVecPush(&bv, true);  // bit 0
        BitVecPush(&bv, false); // bit 1
        BitVecPush(&bv, true);  // bit 2
        // Create pattern: 10110011 (0xB3)
        BitVecPush(&bv, true);  // bit 0
        BitVecPush(&bv, false); // bit 1
        BitVecPush(&bv, true);  // bit 2
        BitVecPush(&bv, true);  // bit 3
        BitVecPush(&bv, true);  // bit 0
        BitVecPush(&bv, false); // bit 1
        BitVecPush(&bv, true);  // bit 2
        BitVecPush(&bv, true);  // bit 3
        BitVecPush(&bv, false); // bit 4
        BitVecPush(&bv, false); // bit 1
        BitVecPush(&bv, true);  // bit 2
        BitVecPush(&bv, true);  // bit 3
        BitVecPush(&bv, false); // bit 4
        BitVecPush(&bv, false); // bit 5
        BitVecPush(&bv, true);  // bit 2
        BitVecPush(&bv, true);  // bit 3
        BitVecPush(&bv, false); // bit 4
        BitVecPush(&bv, false); // bit 5
        BitVecPush(&bv, true);  // bit 6
        BitVecPush(&bv, true);  // bit 3
        BitVecPush(&bv, false); // bit 4
        BitVecPush(&bv, false); // bit 5
        BitVecPush(&bv, true);  // bit 6
        BitVecPush(&bv, true);  // bit 7
        BitVecPush(&bv, false); // bit 4
        BitVecPush(&bv, false); // bit 5
        BitVecPush(&bv, true);  // bit 6
        BitVecPush(&bv, true);  // bit 7
        BitVecPush(&bv, false); // bit 5
        BitVecPush(&bv, true);  // bit 6
        BitVecPush(&bv, true);  // bit 7
    
        u8  bytes[2];           // Buffer for byte output
    
        // Create pattern: 1011 (decimal 11 if MSB first, 13 if LSB first)
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Create pattern: 1011 (decimal 11 if MSB first, 13 if LSB first)
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
    
        // Convert to integer
        BitVec bv2 = BitVecInit(ALLOCATOR_OF(&alloc));
        for (int i = 0; i < 8; i++) {
            BitVecPush(&bv2, (i % 2 == 0)); // Alternating pattern
        }
    
        // Test converting single bit
        BitVecPush(&bv, true);
        str_obj = BitVecToStr(&bv);
        result  = result && (StrLen(&str_obj) == 1);
        BitVecClear(&bv);
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&bv, i % 2 == 0);
        }
        str_obj = BitVecToStr(&bv);
        BitVec oversized = BitVecInit(ALLOCATOR_OF(&alloc));
        for (int i = 0; i < 100; i++) { // 100 bits > 64 bit limit
            BitVecPush(&oversized, i % 2 == 0);
        }
        // Create a 1000-bit pattern
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&large_bv, (i % 3) == 0); // Every third bit set
        }
    
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv, true);
    
        // Zero max_len is a contract violation - should abort.
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
        // 4-bit pattern 1011 -> LSB-first packing: bits 0,2,3 set -> 0x0D.
        BitVecPush(&bv, true);  // bit 0
        BitVecPush(&bv, false); // bit 1
        BitVecPush(&bv, true);  // bit 2
        // 4-bit pattern 1011 -> LSB-first packing: bits 0,2,3 set -> 0x0D.
        BitVecPush(&bv, true);  // bit 0
        BitVecPush(&bv, false); // bit 1
        BitVecPush(&bv, true);  // bit 2
        BitVecPush(&bv, true);  // bit 3
        BitVecPush(&bv, true);  // bit 0
        BitVecPush(&bv, false); // bit 1
        BitVecPush(&bv, true);  // bit 2
        BitVecPush(&bv, true);  // bit 3
        BitVecPush(&bv, false); // bit 1
        BitVecPush(&bv, true);  // bit 2
        BitVecPush(&bv, true);  // bit 3
    
        u8  bytes[1] = {0};
        // 16 bits; ensure byte 1 has at least one set bit (bit 8 -> byte1 bit0).
        for (u64 i = 0; i < 16; i++) {
            BitVecPush(&bv, i == 8); // only bit 8 set
        }
    
        // Push some bits
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Push some bits
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
    
        // Test getting bits
    
        // Push some bits
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Push some bits
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
    
        // Flip some bits
    
        // Push some bits
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Push some bits
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
    
        result = result && (BitVecLen(&bv) == 3);
    
        // Push a pattern: true, false, true, false, true
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        // Push a pattern: true, false, true, false, true
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
    
        // Count true and false bits
    
        // Test with single bit
        BitVecPush(&bv, true);
        result = result && (BitVecGet(&bv, 0) == true);
        // Test with larger index
        for (int i = 1; i < 64; i++) {
            BitVecPush(&bv, i % 2 == 0);
        }
    
        // Test flipping single bit
        BitVecPush(&bv, false);
        BitVecFlip(&bv, 0);
        bool result = (BitVecGet(&bv, 0) == true);
    
        // Test single bit
        BitVecPush(&bv, true);
        result = result && (BitVecCountOnes(&bv) == 1);
        result = result && (BitVecCountZeros(&bv) == 0);
        BitVecClear(&bv);
        for (int i = 0; i < 100; i++) {
            BitVecPush(&bv, true);
        }
        result = result && (BitVecCountOnes(&bv) == 100);
    
        // Create pattern using different methods
        BitVecPush(&bv, true);
        BitVecResize(&bv, 5);
        BitVecSet(&bv, 1, false);
        // Create large alternating pattern
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&bv, i % 2 == 0);
        }
    
        // Test BITVEC_GET, BITVEC_SET, BITVEC_FLIP if they exist
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        // Test BITVEC_GET, BITVEC_SET, BITVEC_FLIP if they exist
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
    
        // Test length and capacity macros if they exist
        // Test all zeros
        for (int i = 0; i < 64; i++) {
            BitVecPush(&bv, false);
        }
        result = result && (BitVecCountZeros(&bv) == 64);
        BitVecClear(&bv);
        for (int i = 0; i < 64; i++) {
            BitVecPush(&bv, true);
        }
        result = result && (BitVecCountOnes(&bv) == 64);
        BitVecClear(&bv);
        for (int i = 0; i < 64; i++) {
            BitVecPush(&bv, i % 2 == 0);
        }
        result = result && (BitVecCountOnes(&bv) == 32);
        BitVecClear(&bv);
        for (int i = 0; i < 64; i++) {
            BitVecPush(&bv, i % 8 == 0);
        }
        result = result && (BitVecCountOnes(&bv) == 8);
        BitVecClear(&bv);
        for (int i = 0; i < 100; i++) {
            BitVecPush(&bv, (i * 17 + 3) % 7 < 3); // Pseudo-random pattern
        }
        // Create pattern: F T F T F T F T
        for (int i = 0; i < 8; i++) {
            BitVecPush(&bv, i % 2 == 1);
        }
        BitVecClear(&bv);
        for (int i = 0; i < 5; i++) {
            BitVecPush(&bv, true);
        }
        result = result && (BitVecFind(&bv, true) == 0);
        // Test with all true
        for (int i = 0; i < 5; i++) {
            BitVecPush(&bv, true);
        }
        result = result && BitVecAll(&bv, true);
        BitVecClear(&bv);
        for (int i = 0; i < 5; i++) {
            BitVecPush(&bv, false);
        }
        result = result && !BitVecAll(&bv, true);
        // Test with mixed values
        BitVecClear(&bv);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecClear(&bv);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
        BitVecPush(&bv, true);
        BitVecPush(&bv, false);
        BitVecPush(&bv, true);
    
        result = result && !BitVecAll(&bv, true);
        bool pattern[] = {true, true, true, false, false, true, true, false, false, false, false};
        for (int i = 0; i < 11; i++) {
            BitVecPush(&bv, pattern[i]);
        }
        BitVecClear(&bv);
        for (int i = 0; i < 10; i++) {
            BitVecPush(&bv, true);
        }
        result = result && (BitVecLongestRun(&bv, true) == 10);
        BitVecClear(&bv);
        for (int i = 0; i < 10; i++) {
            BitVecPush(&bv, i % 2 == 0);
        }
        result = result && (BitVecLongestRun(&bv, true) == 1);
    
        // Test single element
        BitVecPush(&bv, true);
        result = result && (BitVecFind(&bv, true) == 0);
        result = result && (BitVecFindLast(&bv, true) == 0);
        BitVecClear(&bv);
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&bv, i == 500 || i == 999); // Only indices 500 and 999 are true
        }
        result = result && (BitVecFind(&bv, true) == 500);
    
        // Test single element bitvector
        BitVecPush(&bv, true);
        result = result && BitVecAll(&bv, true);
        result = result && !BitVecAll(&bv, false);
        BitVecClear(&bv);
        for (int i = 0; i < 1000; i++) {
            BitVecPush(&bv, true); // All true
        }
        result = result && BitVecAll(&bv, true);
    
        // Test single element
        BitVecPush(&bv, true);
        result = result && (BitVecLongestRun(&bv, true) == 1);
        result = result && (BitVecLongestRun(&bv, false) == 0);
        BitVecClear(&bv);
        for (int i = 0; i < 10000; i++) {
            BitVecPush(&bv, true);
        }
        result = result && (BitVecLongestRun(&bv, true) == 10000);
        Int original = IntInit(&alloc);
    
        BitVecPush(&original.bits, true);
        BitVecPush(&original.bits, false);
        BitVecPush(&original.bits, true);
    
        BitVecPush(&original.bits, true);
        BitVecPush(&original.bits, false);
        BitVecPush(&original.bits, true);
        BitVecPush(&original.bits, true);
        BitVecPush(&original.bits, false);
        BitVecPush(&original.bits, true);
    
        Int clone = IntClone(&original);
Last updated on