BitVecPush

Table of Contents

BitVecPush

Description

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

Parameters

NameDirectionDescription
bvinBitvector to push bit to
valueinBit value to push (true/false)

Usage example (from documentation)

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

Usage example (Cross-references)

    }
    
    void BitVecPush(BitVec *bitvec, bool value) {
    ValidateBitVec(bitvec);
    if (bitvec->length >= bitvec->capacity) {
    }
    // For now, implement as push + manual bit shifting (simple but not efficient)
    BitVecPush(bitvec, false);
    
    // Shift bits right from idx to end
    for (u64 i = 0; i < str_len; i++) {
    if (str[i] == '1') {
    BitVecPush(&result, true);
    } else if (str[i] == '0') {
    BitVecPush(&result, false);
    BitVecPush(&result, true);
    } else if (str[i] == '0') {
    BitVecPush(&result, false);
    }
    // Ignore other characters
    
    // 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];
    // Test 2: Single bit (true)
    BitVec single_bv = BitVecInit();
    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();
    BitVecPush(&single_false_bv, false);
    count  = BitVecRunLengths(&single_false_bv, runs, values, 5);
    result = result && (count == 1);
    BitVec all_true_bv = BitVecInit();
    for (int i = 0; i < 10; i++) {
    BitVecPush(&all_true_bv, true);
    }
    count  = BitVecRunLengths(&all_true_bv, runs, values, 5);
    BitVec alternating_bv = BitVecInit();
    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]);
    }
    
    BitVec bv = BitVecInit();
    BitVecPush(&bv, true);
    bool values[5];
    
    BitVec bv = BitVecInit();
    BitVecPush(&bv, true);
    u64 runs[5];
    
    BitVec bv = BitVecInit();
    BitVecPush(&bv, true);
    u64  runs[5];
    bool values[5];
    
    // 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 && (bv.length == 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 && (bv.length == 0);
    
    // Test clear after single bit
    BitVecPush(&bv, true);
    BitVecClear(&bv);
    result = result && (bv.length == 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);
    }
    
    // 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
    
    // Test shrink on single element
    BitVecPush(&bv, true);
    BitVecShrinkToFit(&bv);
    result = result && (bv.length == 1) && (bv.capacity >= 1);
    // Test set capacity smaller than current length
    for (int i = 0; i < 10; i++) {
    BitVecPush(&bv, i % 2 == 0);
    }
    u64 original_length = bv.length;
    
    // 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 && (clone2.length == 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);
    }
    
    // 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);
    
    BitVec bv = BitVecInit();
    BitVecPush(&bv, true);
    BitVecPush(&bv, false);
    BitVecPush(&bv, true);
    BitVec bv = BitVecInit();
    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();
    BitVecPush(&bv, true);
    BitVecPush(&bv, false);
    BitVec bv = BitVecInit();
    BitVecPush(&bv, true);
    BitVecPush(&bv, false);
    
    // Test with index way beyond length (2) - should abort
    BitVec bv = BitVecInit();
    for (int i = 0; i < 10; i++) {
    BitVecPush(&bv, i % 2 == 0);
    }
    
    BitVec bv = BitVecInit();
    BitVecPush(&bv, true);
    
    // Test with maximum possible index value - should abort
    // Test BitVecPush function
    bool test_bitvec_push(void) {
    printf("Testing BitVecPush\n");
    
    BitVec bv = BitVecInit();
    
    // 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();
    BitVecPush(&bv2, true);
    
    u8 pattern2 = 0x05;
    
    // Test inserting at end
    BitVecPush(&bv, true);
    BitVecInsertRange(&bv, 1, 2, false);
    result = result && (bv.length == 3);
    
    // Test inserting single bit bitvec
    BitVecPush(&source, true);
    BitVecInsertMultiple(&bv, 0, &source);
    result = result && (bv.length == 1) && (BitVecGet(&bv, 0) == true);
    BitVecClear(&source);
    for (int i = 0; i < 500; i++) {
    BitVecPush(&source, false);
    }
    BitVecInsertMultiple(&bv, 1, &source);
    
    BitVec pattern = BitVecInit();
    BitVecPush(&pattern, true);
    
    BitVecFindPattern(NULL, &pattern); // Should cause LOG_FATAL
    
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecPush(&source, false);
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecPush(&source, false);
    
    BitVecFindPattern(&source, NULL); // Should cause LOG_FATAL
    
    BitVec pattern = BitVecInit();
    BitVecPush(&pattern, true);
    
    BitVecFindLastPattern(NULL, &pattern); // Should cause LOG_FATAL
    
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecPush(&source, false);
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecPush(&source, false);
    
    BitVecFindLastPattern(&source, NULL); // Should cause LOG_FATAL
    BitVec source = BitVecInit();
    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();
    BitVec pattern = BitVecInit();
    BitVecPush(&source, true);
    BitVecPush(&source, false);
    BitVecPush(&pattern, true);
    BitVec pattern = BitVecInit();
    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();
    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
    printf("Testing BitVecStartsWith(NULL, prefix) - should fatal\n");
    BitVec prefix = BitVecInit();
    BitVecPush(&prefix, true);
    BitVecStartsWith(NULL, &prefix);
    BitVecDeinit(&prefix);
    printf("Testing BitVecStartsWith(source, NULL) - should fatal\n");
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecStartsWith(&source, NULL);
    BitVecDeinit(&source);
    printf("Testing BitVecEndsWith(NULL, suffix) - should fatal\n");
    BitVec suffix = BitVecInit();
    BitVecPush(&suffix, true);
    BitVecEndsWith(NULL, &suffix);
    BitVecDeinit(&suffix);
    printf("Testing BitVecEndsWith(source, NULL) - should fatal\n");
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecEndsWith(&source, NULL);
    BitVecDeinit(&source);
    printf("Testing BitVecContainsAt(NULL, pattern, 0) - should fatal\n");
    BitVec pattern = BitVecInit();
    BitVecPush(&pattern, true);
    BitVecContainsAt(NULL, &pattern, 0);
    BitVecDeinit(&pattern);
    printf("Testing BitVecContainsAt(source, NULL, 0) - should fatal\n");
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecContainsAt(&source, NULL, 0);
    BitVecDeinit(&source);
    BitVec pattern  = BitVecInit();
    BitVec wildcard = BitVecInit();
    BitVecPush(&pattern, true);
    BitVecPush(&wildcard, false);
    BitVecMatches(NULL, &pattern, &wildcard);
    BitVec wildcard = BitVecInit();
    BitVecPush(&pattern, true);
    BitVecPush(&wildcard, false);
    BitVecMatches(NULL, &pattern, &wildcard);
    BitVecDeinit(&pattern);
    printf("Testing BitVecRegexMatch(source, NULL) - should fatal\n");
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecRegexMatch(&source, NULL);
    BitVecDeinit(&source);
    printf("Testing BitVecPrefixMatch(NULL, patterns, 1) - should fatal\n");
    BitVecs vp = VecInitWithDeepCopy(NULL, BitVecDeinit);
    BitVecPush(VecPtrAt(&vp, 0), true);
    BitVecPrefixMatch(NULL, &vp);
    VecDeinit(&vp);
    printf("Testing BitVecPrefixMatch(source, NULL, 1) - should fatal\n");
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecPrefixMatch(&source, NULL);
    BitVecDeinit(&source);
    printf("Testing BitVecSuffixMatch(NULL, patterns, 1) - should fatal\n");
    BitVecs vp = VecInitWithDeepCopy(NULL, BitVecDeinit);
    BitVecPush(VecPtrAt(&vp, 0), true);
    BitVecSuffixMatch(NULL, &vp);
    VecDeinit(&vp);
    printf("Testing BitVecSuffixMatch(source, NULL, 1) - should fatal\n");
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecSuffixMatch(&source, NULL);
    BitVecDeinit(&source);
    
    // 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) && (bv.length == 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) && (bv.length == 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 && (bv.length == 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) && (bv.length == 2);
    // Test remove single occurrence
    BitVecClear(&bv);
    BitVecPush(&bv, false);
    found  = BitVecRemoveFirst(&bv, false);
    result = result && (found == true) && (bv.length == 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) && (bv.length == 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
    
    // 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 && (bv.length == 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 && (bv.length == 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 && (result_bv.length == 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 && (bv.length == 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);
    }
    BitVec bv1 = BitVecInit();
    BitVec bv2 = BitVecInit();
    BitVecPush(&bv1, true);
    BitVecPush(&bv2, false);
    BitVec bv2 = BitVecInit();
    BitVecPush(&bv1, true);
    BitVecPush(&bv2, false);
    
    // Test NULL result pointer - should abort
    
    // 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 && (bv.length == 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 && (bv.length == 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 && (result_bv.length == 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 && (bv.length == 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);
    }
    
    // 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();
    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 && (str_obj.length == 1);
    BitVecClear(&bv);
    for (int i = 0; i < 1000; i++) {
    BitVecPush(&bv, i % 2 == 0);
    }
    str_obj = BitVecToStr(&bv);
    BitVec oversized = BitVecInit();
    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();
    BitVecPush(&bv, true);
    
    // Test with insufficient buffer size
    
    // 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];
    // Test 2: Single bit (true)
    BitVec single_bv = BitVecInit();
    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();
    BitVecPush(&single_false_bv, false);
    count  = BitVecRunLengths(&single_false_bv, runs, values, 5);
    result = result && (count == 1);
    BitVec all_true_bv = BitVecInit();
    for (int i = 0; i < 10; i++) {
    BitVecPush(&all_true_bv, true);
    }
    count  = BitVecRunLengths(&all_true_bv, runs, values, 5);
    BitVec alternating_bv = BitVecInit();
    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]);
    }
    
    // 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);
    
    // 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);
    
    // 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);
    
    u64 distance = BitVecEditDistance(&bv1, &bv2);
    // 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();
    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);
    printf("Testing BitVecHammingDistance(NULL, bv2) - should fatal\n");
    BitVec bv2 = BitVecInit();
    BitVecPush(&bv2, true);
    BitVecHammingDistance(NULL, &bv2);
    BitVecDeinit(&bv2);
    printf("Testing BitVecHammingDistance(bv1, NULL) - should fatal\n");
    BitVec bv1 = BitVecInit();
    BitVecPush(&bv1, true);
    BitVecHammingDistance(&bv1, NULL);
    BitVecDeinit(&bv1);
    printf("Testing BitVecJaccardSimilarity(NULL, bv2) - should fatal\n");
    BitVec bv2 = BitVecInit();
    BitVecPush(&bv2, true);
    BitVecJaccardSimilarity(NULL, &bv2);
    BitVecDeinit(&bv2);
    printf("Testing BitVecJaccardSimilarity(bv1, NULL) - should fatal\n");
    BitVec bv1 = BitVecInit();
    BitVecPush(&bv1, true);
    BitVecJaccardSimilarity(&bv1, NULL);
    BitVecDeinit(&bv1);
    printf("Testing BitVecCosineSimilarity(NULL, bv2) - should fatal\n");
    BitVec bv2 = BitVecInit();
    BitVecPush(&bv2, true);
    BitVecCosineSimilarity(NULL, &bv2);
    BitVecDeinit(&bv2);
    printf("Testing BitVecCosineSimilarity(bv1, NULL) - should fatal\n");
    BitVec bv1 = BitVecInit();
    BitVecPush(&bv1, true);
    BitVecCosineSimilarity(&bv1, NULL);
    BitVecDeinit(&bv1);
    printf("Testing BitVecDotProduct(NULL, bv2) - should fatal\n");
    BitVec bv2 = BitVecInit();
    BitVecPush(&bv2, true);
    BitVecDotProduct(NULL, &bv2);
    BitVecDeinit(&bv2);
    printf("Testing BitVecDotProduct(bv1, NULL) - should fatal\n");
    BitVec bv1 = BitVecInit();
    BitVecPush(&bv1, true);
    BitVecDotProduct(&bv1, NULL);
    BitVecDeinit(&bv1);
    printf("Testing BitVecEditDistance(NULL, bv2) - should fatal\n");
    BitVec bv2 = BitVecInit();
    BitVecPush(&bv2, true);
    BitVecEditDistance(NULL, &bv2);
    BitVecDeinit(&bv2);
    printf("Testing BitVecEditDistance(bv1, NULL) - should fatal\n");
    BitVec bv1 = BitVecInit();
    BitVecPush(&bv1, true);
    BitVecEditDistance(&bv1, NULL);
    BitVecDeinit(&bv1);
    printf("Testing BitVecCorrelation(NULL, bv2) - should fatal\n");
    BitVec bv2 = BitVecInit();
    BitVecPush(&bv2, true);
    BitVecCorrelation(NULL, &bv2);
    BitVecDeinit(&bv2);
    printf("Testing BitVecCorrelation(bv1, NULL) - should fatal\n");
    BitVec bv1 = BitVecInit();
    BitVecPush(&bv1, true);
    BitVecCorrelation(&bv1, NULL);
    BitVecDeinit(&bv1);
    printf("Testing BitVecAlignmentScore(NULL, bv2, 1, -1) - should fatal\n");
    BitVec bv2 = BitVecInit();
    BitVecPush(&bv2, true);
    BitVecAlignmentScore(NULL, &bv2, 1, -1);
    BitVecDeinit(&bv2);
    printf("Testing BitVecAlignmentScore(bv1, NULL, 1, -1) - should fatal\n");
    BitVec bv1 = BitVecInit();
    BitVecPush(&bv1, true);
    BitVecAlignmentScore(&bv1, NULL, 1, -1);
    BitVecDeinit(&bv1);
    printf("Testing BitVecBestAlignment(NULL, bv2) - should fatal\n");
    BitVec bv2 = BitVecInit();
    BitVecPush(&bv2, true);
    BitVecBestAlignment(NULL, &bv2);
    BitVecDeinit(&bv2);
    printf("Testing BitVecBestAlignment(bv1, NULL) - should fatal\n");
    BitVec bv1 = BitVecInit();
    BitVecPush(&bv1, true);
    BitVecBestAlignment(&bv1, NULL);
    BitVecDeinit(&bv1);
    
    // 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);
    
    // 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);
    
    BitVec pattern = BitVecInit();
    BitVecPush(&pattern, true);
    
    BitVecFindPattern(NULL, &pattern); // Should cause LOG_FATAL
    
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecPush(&source, false);
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecPush(&source, false);
    
    BitVecFindPattern(&source, NULL); // Should cause LOG_FATAL
    
    BitVec pattern = BitVecInit();
    BitVecPush(&pattern, true);
    
    BitVecFindLastPattern(NULL, &pattern); // Should cause LOG_FATAL
    
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecPush(&source, false);
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecPush(&source, false);
    
    BitVecFindLastPattern(&source, NULL); // Should cause LOG_FATAL
    BitVec source = BitVecInit();
    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();
    BitVec pattern = BitVecInit();
    BitVecPush(&source, true);
    BitVecPush(&source, false);
    BitVecPush(&pattern, true);
    BitVec pattern = BitVecInit();
    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();
    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
    
    // 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 && BitVecContains(&source, &pattern);
    // 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 && !BitVecContains(&source, &pattern);
    
    // 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);
    
    // Pattern 0: 111 (should not match)
    
    // Pattern 0: 111 (should not match)
    BitVecPush(&patterns[0], true);
    BitVecPush(&patterns[0], true);
    BitVecPush(&patterns[0], true);
    // Pattern 0: 111 (should not match)
    BitVecPush(&patterns[0], true);
    BitVecPush(&patterns[0], true);
    BitVecPush(&patterns[0], true);
    BitVecPush(&patterns[0], true);
    BitVecPush(&patterns[0], true);
    BitVecPush(&patterns[0], true);
    
    // Pattern 1: 110 (should match)
    
    // Pattern 1: 110 (should match)
    BitVecPush(&patterns[1], true);
    BitVecPush(&patterns[1], true);
    BitVecPush(&patterns[1], false);
    // Pattern 1: 110 (should match)
    BitVecPush(&patterns[1], true);
    BitVecPush(&patterns[1], true);
    BitVecPush(&patterns[1], false);
    BitVecPush(&patterns[1], true);
    BitVecPush(&patterns[1], true);
    BitVecPush(&patterns[1], false);
    
    // Pattern 2: 101 (should not match as prefix)
    
    // Pattern 2: 101 (should not match as prefix)
    BitVecPush(&patterns[2], true);
    BitVecPush(&patterns[2], false);
    BitVecPush(&patterns[2], true);
    // Pattern 2: 101 (should not match as prefix)
    BitVecPush(&patterns[2], true);
    BitVecPush(&patterns[2], false);
    BitVecPush(&patterns[2], true);
    BitVecPush(&patterns[2], true);
    BitVecPush(&patterns[2], false);
    BitVecPush(&patterns[2], true);
    
    u64 match_idx = BitVecPrefixMatch(&source, patterns, 3);
    
    // 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);
    
    // Pattern 0: 111 (should not match)
    
    // Pattern 0: 111 (should not match)
    BitVecPush(&patterns[0], true);
    BitVecPush(&patterns[0], true);
    BitVecPush(&patterns[0], true);
    // Pattern 0: 111 (should not match)
    BitVecPush(&patterns[0], true);
    BitVecPush(&patterns[0], true);
    BitVecPush(&patterns[0], true);
    BitVecPush(&patterns[0], true);
    BitVecPush(&patterns[0], true);
    BitVecPush(&patterns[0], true);
    
    // Pattern 1: 101 (should match as suffix)
    
    // Pattern 1: 101 (should match as suffix)
    BitVecPush(&patterns[1], true);
    BitVecPush(&patterns[1], false);
    BitVecPush(&patterns[1], true);
    // Pattern 1: 101 (should match as suffix)
    BitVecPush(&patterns[1], true);
    BitVecPush(&patterns[1], false);
    BitVecPush(&patterns[1], true);
    BitVecPush(&patterns[1], true);
    BitVecPush(&patterns[1], false);
    BitVecPush(&patterns[1], true);
    
    // Pattern 2: 110 (should not match as suffix)
    
    // Pattern 2: 110 (should not match as suffix)
    BitVecPush(&patterns[2], true);
    BitVecPush(&patterns[2], true);
    BitVecPush(&patterns[2], false);
    // Pattern 2: 110 (should not match as suffix)
    BitVecPush(&patterns[2], true);
    BitVecPush(&patterns[2], true);
    BitVecPush(&patterns[2], false);
    BitVecPush(&patterns[2], true);
    BitVecPush(&patterns[2], true);
    BitVecPush(&patterns[2], false);
    
    u64 match_idx = BitVecSuffixMatch(&source, patterns, 3);
    printf("Testing BitVecStartsWith(NULL, prefix) - should fatal\n");
    BitVec prefix = BitVecInit();
    BitVecPush(&prefix, true);
    BitVecStartsWith(NULL, &prefix);
    BitVecDeinit(&prefix);
    printf("Testing BitVecStartsWith(source, NULL) - should fatal\n");
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecStartsWith(&source, NULL);
    BitVecDeinit(&source);
    printf("Testing BitVecEndsWith(NULL, suffix) - should fatal\n");
    BitVec suffix = BitVecInit();
    BitVecPush(&suffix, true);
    BitVecEndsWith(NULL, &suffix);
    BitVecDeinit(&suffix);
    printf("Testing BitVecEndsWith(source, NULL) - should fatal\n");
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecEndsWith(&source, NULL);
    BitVecDeinit(&source);
    printf("Testing BitVecContainsAt(NULL, pattern, 0) - should fatal\n");
    BitVec pattern = BitVecInit();
    BitVecPush(&pattern, true);
    BitVecContainsAt(NULL, &pattern, 0);
    BitVecDeinit(&pattern);
    printf("Testing BitVecContainsAt(source, NULL, 0) - should fatal\n");
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecContainsAt(&source, NULL, 0);
    BitVecDeinit(&source);
    BitVec pattern  = BitVecInit();
    BitVec wildcard = BitVecInit();
    BitVecPush(&pattern, true);
    BitVecPush(&wildcard, false);
    BitVecMatches(NULL, &pattern, &wildcard);
    BitVec wildcard = BitVecInit();
    BitVecPush(&pattern, true);
    BitVecPush(&wildcard, false);
    BitVecMatches(NULL, &pattern, &wildcard);
    BitVecDeinit(&pattern);
    printf("Testing BitVecRegexMatch(source, NULL) - should fatal\n");
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecRegexMatch(&source, NULL);
    BitVecDeinit(&source);
    printf("Testing BitVecPrefixMatch(NULL, patterns, 1) - should fatal\n");
    BitVec patterns[1] = {BitVecInit()};
    BitVecPush(&patterns[0], true);
    BitVecPrefixMatch(NULL, patterns, 1);
    BitVecDeinit(&patterns[0]);
    printf("Testing BitVecPrefixMatch(source, NULL, 1) - should fatal\n");
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecPrefixMatch(&source, NULL, 1);
    BitVecDeinit(&source);
    printf("Testing BitVecSuffixMatch(NULL, patterns, 1) - should fatal\n");
    BitVec patterns[1] = {BitVecInit()};
    BitVecPush(&patterns[0], true);
    BitVecSuffixMatch(NULL, patterns, 1);
    BitVecDeinit(&patterns[0]);
    printf("Testing BitVecSuffixMatch(source, NULL, 1) - should fatal\n");
    BitVec source = BitVecInit();
    BitVecPush(&source, true);
    BitVecSuffixMatch(&source, NULL, 1);
    BitVecDeinit(&source);
    BitVec bv1 = BitVecInit();
    BitVec bv2 = BitVecInit();
    BitVecPush(&bv1, true);
    BitVecPush(&bv2, false);
    BitVec bv2 = BitVecInit();
    BitVecPush(&bv1, true);
    BitVecPush(&bv2, false);
    
    // Test NULL result pointer - should abort
    
    BitVec bv = BitVecInit();
    BitVecPush(&bv, true);
    bool values[5];
    
    BitVec bv = BitVecInit();
    BitVecPush(&bv, true);
    u64 runs[5];
    
    BitVec bv = BitVecInit();
    BitVecPush(&bv, true);
    u64  runs[5];
    bool values[5];
    
    // Add a pattern: 1010
    BitVecPush(&bv, true);
    BitVecPush(&bv, false);
    BitVecPush(&bv, true);
    // Add a pattern: 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);
    
    // Test getting each bit
    
    // Initialize with some bits
    BitVecPush(&bv, false);
    BitVecPush(&bv, false);
    BitVecPush(&bv, false);
    // Initialize with some bits
    BitVecPush(&bv, false);
    BitVecPush(&bv, false);
    BitVecPush(&bv, false);
    BitVecPush(&bv, false);
    BitVecPush(&bv, false);
    BitVecPush(&bv, false);
    
    // Set specific bits
    
    // Initialize with pattern: 101
    BitVecPush(&bv, true);
    BitVecPush(&bv, false);
    BitVecPush(&bv, true);
    // Initialize with pattern: 101
    BitVecPush(&bv, true);
    BitVecPush(&bv, false);
    BitVecPush(&bv, true);
    BitVecPush(&bv, true);
    BitVecPush(&bv, false);
    BitVecPush(&bv, true);
    
    // Flip each bit
    
    // 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);
    
    result = result && (BitVecLen(&bv) == 3);
    
    // Create pattern: 1101000
    BitVecPush(&bv, true);  // 1 one,  0 zeros
    BitVecPush(&bv, true);  // 2 ones, 0 zeros
    BitVecPush(&bv, false); // 2 ones, 1 zero
    // Create pattern: 1101000
    BitVecPush(&bv, true);  // 1 one,  0 zeros
    BitVecPush(&bv, true);  // 2 ones, 0 zeros
    BitVecPush(&bv, false); // 2 ones, 1 zero
    BitVecPush(&bv, true);  // 3 ones, 1 zero
    BitVecPush(&bv, true);  // 1 one,  0 zeros
    BitVecPush(&bv, true);  // 2 ones, 0 zeros
    BitVecPush(&bv, false); // 2 ones, 1 zero
    BitVecPush(&bv, true);  // 3 ones, 1 zero
    BitVecPush(&bv, false); // 3 ones, 2 zeros
    BitVecPush(&bv, true);  // 2 ones, 0 zeros
    BitVecPush(&bv, false); // 2 ones, 1 zero
    BitVecPush(&bv, true);  // 3 ones, 1 zero
    BitVecPush(&bv, false); // 3 ones, 2 zeros
    BitVecPush(&bv, false); // 3 ones, 3 zeros
    BitVecPush(&bv, false); // 2 ones, 1 zero
    BitVecPush(&bv, true);  // 3 ones, 1 zero
    BitVecPush(&bv, false); // 3 ones, 2 zeros
    BitVecPush(&bv, false); // 3 ones, 3 zeros
    BitVecPush(&bv, false); // 3 ones, 4 zeros
    BitVecPush(&bv, true);  // 3 ones, 1 zero
    BitVecPush(&bv, false); // 3 ones, 2 zeros
    BitVecPush(&bv, false); // 3 ones, 3 zeros
    BitVecPush(&bv, false); // 3 ones, 4 zeros
    BitVecPush(&bv, false); // 3 ones, 2 zeros
    BitVecPush(&bv, false); // 3 ones, 3 zeros
    BitVecPush(&bv, false); // 3 ones, 4 zeros
    
    // Test counting
    // Test with all ones
    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);
    
    result = result && (BitVecCountOnes(&bv) == 3);
    
    // Test boundary conditions (no longer test empty bitvec - strict bounds checking now)
    BitVecPush(&bv, true);
    result = result && (BitVecGet(&bv, 0) == true); // Valid index
    BitVecClear(&bv);
    for (int i = 0; i < 1000; i++) {
    BitVecPush(&bv, i % 3 == 0);
    }
    
    // Test normal setting
    BitVecPush(&bv, false);
    BitVecSet(&bv, 0, true);
    result = result && (BitVecGet(&bv, 0) == true);
    
    // Test normal flipping
    BitVecPush(&bv, true);
    BitVecFlip(&bv, 0);
    result = result && (BitVecGet(&bv, 0) == false);
    
    // Test count with single bit
    BitVecPush(&bv, true);
    result = result && (BitVecCountOnes(&bv) == 1);
    result = result && (BitVecCountZeros(&bv) == 0);
    
    BitVecClear(&bv);
    BitVecPush(&bv, false);
    result = result && (BitVecCountOnes(&bv) == 0);
    result = result && (BitVecCountZeros(&bv) == 1);
    BitVecClear(&bv);
    for (int i = 0; i < 1000; i++) {
    BitVecPush(&bv, true);
    }
    result = result && (BitVecCountOnes(&bv) == 1000);
    // Stress test with many operations
    for (int cycle = 0; cycle < 100; cycle++) {
    BitVecPush(&bv, cycle % 2 == 0);
    
    // Test access during growth
    for (int bit = 0; bit < 8; bit++) {
    bool bit_value = (pattern & (1u << bit)) != 0;
    BitVecPush(&bv, bit_value);
    }
    }
    // Add bits and test macros again
    for (int i = 0; i < 65; i++) { // Test across byte boundaries
    BitVecPush(&bv, i % 2 == 0);
    }
    BitVecClear(&bv);
    for (int i = 0; i < 64; i++) { // Exactly 64 bits
    BitVecPush(&bv, true);
    }
    for (u64 i = 0; i < size; i++) {
    // Pattern: alternating every 7 bits
    BitVecPush(&bv, (i / 7) % 2 == 0);
    }
    // Test all-zeros pattern
    for (int i = 0; i < 100; i++) {
    BitVecPush(&bv, false);
    }
    BitVecClear(&bv);
    for (int i = 0; i < 100; i++) {
    BitVecPush(&bv, i % 2 == 0);
    }
    // Test Fibonacci-like pattern (each bit is XOR of previous two)
    BitVecClear(&bv);
    BitVecPush(&bv, true); // F(0) = 1
    BitVecPush(&bv, true); // F(1) = 1
    for (int i = 2; i < 50; i++) {
    BitVecClear(&bv);
    BitVecPush(&bv, true); // F(0) = 1
    BitVecPush(&bv, true); // F(1) = 1
    for (int i = 2; i < 50; i++) {
    bool prev1 = BitVecGet(&bv, i - 1);
    bool prev1 = BitVecGet(&bv, i - 1);
    bool prev2 = BitVecGet(&bv, i - 2);
    BitVecPush(&bv, prev1 != prev2); // XOR
    }
    
    BitVec bv = BitVecInit();
    BitVecPush(&bv, true);
    BitVecPush(&bv, false);
    BitVecPush(&bv, true);
    BitVec bv = BitVecInit();
    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();
    BitVecPush(&bv, true);
    BitVecPush(&bv, false);
    BitVec bv = BitVecInit();
    BitVecPush(&bv, true);
    BitVecPush(&bv, false);
    
    // Test with index way beyond length (2) - should abort
    BitVec bv = BitVecInit();
    for (int i = 0; i < 10; i++) {
    BitVecPush(&bv, i % 2 == 0);
    }
    
    BitVec bv = BitVecInit();
    BitVecPush(&bv, true);
    
    // Test with maximum possible index value - should abort
    
    // Create pattern: 10110100
    BitVecPush(&bv, true);  // 0
    BitVecPush(&bv, false); // 1
    BitVecPush(&bv, true);  // 2
    // Create pattern: 10110100
    BitVecPush(&bv, true);  // 0
    BitVecPush(&bv, false); // 1
    BitVecPush(&bv, true);  // 2
    BitVecPush(&bv, true);  // 3
    BitVecPush(&bv, true);  // 0
    BitVecPush(&bv, false); // 1
    BitVecPush(&bv, true);  // 2
    BitVecPush(&bv, true);  // 3
    BitVecPush(&bv, false); // 4
    BitVecPush(&bv, false); // 1
    BitVecPush(&bv, true);  // 2
    BitVecPush(&bv, true);  // 3
    BitVecPush(&bv, false); // 4
    BitVecPush(&bv, true);  // 5
    BitVecPush(&bv, true);  // 2
    BitVecPush(&bv, true);  // 3
    BitVecPush(&bv, false); // 4
    BitVecPush(&bv, true);  // 5
    BitVecPush(&bv, false); // 6
    BitVecPush(&bv, true);  // 3
    BitVecPush(&bv, false); // 4
    BitVecPush(&bv, true);  // 5
    BitVecPush(&bv, false); // 6
    BitVecPush(&bv, false); // 7
    BitVecPush(&bv, false); // 4
    BitVecPush(&bv, true);  // 5
    BitVecPush(&bv, false); // 6
    BitVecPush(&bv, false); // 7
    BitVecPush(&bv, true);  // 5
    BitVecPush(&bv, false); // 6
    BitVecPush(&bv, false); // 7
    
    // Test finding first true (should be at index 0)
    // Test with all same values
    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);
    
    result = result && (BitVecFind(&bv, true) == 0);
    
    // Test with all true bits
    BitVecPush(&bv, true);
    BitVecPush(&bv, true);
    BitVecPush(&bv, true);
    // Test with all true bits
    BitVecPush(&bv, true);
    BitVecPush(&bv, true);
    BitVecPush(&bv, true);
    BitVecPush(&bv, true);
    BitVecPush(&bv, true);
    BitVecPush(&bv, true);
    
    result = result && BitVecAll(&bv, true);
    // Test with all false bits
    BitVecClear(&bv);
    BitVecPush(&bv, false);
    BitVecPush(&bv, false);
    BitVecPush(&bv, false);
    BitVecClear(&bv);
    BitVecPush(&bv, false);
    BitVecPush(&bv, false);
    BitVecPush(&bv, false);
    BitVecPush(&bv, false);
    BitVecPush(&bv, false);
    BitVecPush(&bv, false);
    
    result = result && !BitVecAll(&bv, true);
    // Test with mixed bits
    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);
    
    // Test pattern: 11100110011111
    BitVecPush(&bv, true);  // Run of 3 trues
    BitVecPush(&bv, true);
    BitVecPush(&bv, true);
    // Test pattern: 11100110011111
    BitVecPush(&bv, true);  // Run of 3 trues
    BitVecPush(&bv, true);
    BitVecPush(&bv, true);
    BitVecPush(&bv, false); // 1 false
    BitVecPush(&bv, true);  // Run of 3 trues
    BitVecPush(&bv, true);
    BitVecPush(&bv, true);
    BitVecPush(&bv, false); // 1 false
    BitVecPush(&bv, false); // Run of 2 falses
    BitVecPush(&bv, true);
    BitVecPush(&bv, true);
    BitVecPush(&bv, false); // 1 false
    BitVecPush(&bv, false); // Run of 2 falses
    BitVecPush(&bv, true);  // 1 true
    BitVecPush(&bv, true);
    BitVecPush(&bv, false); // 1 false
    BitVecPush(&bv, false); // Run of 2 falses
    BitVecPush(&bv, true);  // 1 true
    BitVecPush(&bv, true);  // Run of 2 trues
    BitVecPush(&bv, false); // 1 false
    BitVecPush(&bv, false); // Run of 2 falses
    BitVecPush(&bv, true);  // 1 true
    BitVecPush(&bv, true);  // Run of 2 trues
    BitVecPush(&bv, false); // 1 false
    BitVecPush(&bv, false); // Run of 2 falses
    BitVecPush(&bv, true);  // 1 true
    BitVecPush(&bv, true);  // Run of 2 trues
    BitVecPush(&bv, false); // 1 false
    BitVecPush(&bv, false); // Run of 2 falses
    BitVecPush(&bv, true);  // 1 true
    BitVecPush(&bv, true);  // Run of 2 trues
    BitVecPush(&bv, false); // 1 false
    BitVecPush(&bv, false); // Run of 2 falses
    BitVecPush(&bv, true);  // Run of 5 trues
    BitVecPush(&bv, true);  // Run of 2 trues
    BitVecPush(&bv, false); // 1 false
    BitVecPush(&bv, false); // Run of 2 falses
    BitVecPush(&bv, true);  // Run of 5 trues
    BitVecPush(&bv, true);
    BitVecPush(&bv, false); // 1 false
    BitVecPush(&bv, false); // Run of 2 falses
    BitVecPush(&bv, true);  // Run of 5 trues
    BitVecPush(&bv, true);
    BitVecPush(&bv, true);
    BitVecPush(&bv, false); // Run of 2 falses
    BitVecPush(&bv, true);  // Run of 5 trues
    BitVecPush(&bv, true);
    BitVecPush(&bv, true);
    BitVecPush(&bv, true);
    BitVecPush(&bv, true);  // Run of 5 trues
    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);
    
    // Longest run of trues should be 5
    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);
    
    // 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);
    }

Share :

Related Posts

BitVecFindLast

BitVecFindLast Description Find index of last occurrence of a specific bit value.

Read More

BitVecCountZeros

BitVecCountZeros Description Count number of bits set to 0 in bitvector.

Read More

BitVecNone

BitVecNone Description Check if no bits in bitvector match the given value.

Read More