BitVecPush
- Function
- August 22, 2025
Table of Contents
BitVecPush
BitVecPush
Description
Push a bit to the end of bitvector. Grows the bitvector if necessary.
Parameters
Name | Direction | Description |
---|---|---|
bv | in | Bitvector to push bit to |
value | in | Bit value to push (true/false) |
Usage example (from documentation)
BitVecPush(&flags, true);
BitVecPush(&flags, false);
Usage example (Cross-references)
- In
BitVec.c:223
:
}
void BitVecPush(BitVec *bitvec, bool value) {
ValidateBitVec(bitvec);
if (bitvec->length >= bitvec->capacity) {
- In
BitVec.c:250
:
}
// For now, implement as push + manual bit shifting (simple but not efficient)
BitVecPush(bitvec, false);
// Shift bits right from idx to end
- In
BitVec.c:756
:
for (u64 i = 0; i < str_len; i++) {
if (str[i] == '1') {
BitVecPush(&result, true);
} else if (str[i] == '0') {
BitVecPush(&result, false);
- In
BitVec.c:758
:
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];
- In
BitVec.Init.c:48
:
// Add some data to make sure deinitialization works with allocated memory
BitVecPush(&bv, true);
BitVecPush(&bv, false);
BitVecPush(&bv, true);
- In
BitVec.Init.c:49
:
// Add some data to make sure deinitialization works with allocated memory
BitVecPush(&bv, true);
BitVecPush(&bv, false);
BitVecPush(&bv, true);
- In
BitVec.Init.c:50
:
BitVecPush(&bv, true);
BitVecPush(&bv, false);
BitVecPush(&bv, true);
// Check that data was allocated
- In
BitVec.Init.c:85
:
// 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);
- In
BitVec.Math.c:60
:
// Test identical bitvectors
BitVecPush(&bv1, true);
BitVecPush(&bv1, false);
BitVecPush(&bv1, true);
- In
BitVec.Math.c:61
:
// Test identical bitvectors
BitVecPush(&bv1, true);
BitVecPush(&bv1, false);
BitVecPush(&bv1, true);
BitVecPush(&bv2, true);
- In
BitVec.Math.c:62
:
BitVecPush(&bv1, true);
BitVecPush(&bv1, false);
BitVecPush(&bv1, true);
BitVecPush(&bv2, true);
BitVecPush(&bv2, false);
- In
BitVec.Math.c:63
:
BitVecPush(&bv1, false);
BitVecPush(&bv1, true);
BitVecPush(&bv2, true);
BitVecPush(&bv2, false);
BitVecPush(&bv2, true);
- In
BitVec.Math.c:64
:
BitVecPush(&bv1, true);
BitVecPush(&bv2, true);
BitVecPush(&bv2, false);
BitVecPush(&bv2, true);
- In
BitVec.Math.c:65
:
BitVecPush(&bv2, true);
BitVecPush(&bv2, false);
BitVecPush(&bv2, true);
u64 distance = BitVecHammingDistance(&bv1, &bv2);
- In
BitVec.Math.c:72
:
// Test completely different bitvectors
BitVecClear(&bv2);
BitVecPush(&bv2, false);
BitVecPush(&bv2, true);
BitVecPush(&bv2, false);
- In
BitVec.Math.c:73
:
BitVecClear(&bv2);
BitVecPush(&bv2, false);
BitVecPush(&bv2, true);
BitVecPush(&bv2, false);
- In
BitVec.Math.c:74
:
BitVecPush(&bv2, false);
BitVecPush(&bv2, true);
BitVecPush(&bv2, false);
distance = BitVecHammingDistance(&bv1, &bv2);
- In
BitVec.Math.c:81
:
// Test partially different bitvectors
BitVecClear(&bv2);
BitVecPush(&bv2, true); // Same
BitVecPush(&bv2, true); // Different
BitVecPush(&bv2, true); // Same
- In
BitVec.Math.c:82
:
BitVecClear(&bv2);
BitVecPush(&bv2, true); // Same
BitVecPush(&bv2, true); // Different
BitVecPush(&bv2, true); // Same
- In
BitVec.Math.c:83
:
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);
}