Skip to content

BitVecReserve

Description

Ensure bv can hold at least n bits without further reallocation.

Parameters

Name Direction Description
bv in,out Bitvector whose capacity should grow.
n in Minimum bit capacity required after the call.

Success

Returns true; bv->capacity is at least n and existing bits are preserved.

Failure

Returns false on allocator OOM; bv is left unchanged.

Usage example (Cross-references)

Usage examples (Cross-references)
        ValidateBitVec(bitvec);
        if (new_size > bitvec->capacity) {
            if (!BitVecReserve(bitvec, new_size)) {
                return false;
            }
    }
    
    bool BitVecReserve(BitVec *bitvec, u64 n) {
        ValidateBitVec(bitvec);
        if (n <= bitvec->capacity)
        }
    
        if (!BitVecReserve(out, bv->length) || !BitVecResize(out, bv->length)) {
            BitVecDeinit(out);
            *out = BitVecInit(bv->allocator);
        if (bitvec->length >= bitvec->capacity) {
            u64 new_capacity = bitvec->capacity == 0 ? 8 : bitvec->capacity * 2;
            if (!BitVecReserve(bitvec, new_capacity)) {
                return false;
            }
        *out = BitVecInit(alloc);
    
        if (!BitVecReserve(out, str_len)) {
            return false;
        }
        }
    
        if (!BitVecReserve(out, bit_len) || !BitVecResize(out, bit_len)) {
            BitVecDeinit(out);
            *out = BitVecInit(alloc);
        }
    
        if (!BitVecReserve(out, bits) || !BitVecResize(out, bits)) {
            BitVecDeinit(out);
            *out = BitVecInit(alloc);
    
        // Force capacity to be larger than needed by reserving space
        BitVecReserve(&bv, 100);
    
        // Check that capacity is larger than length
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        WriteFmt("Testing BitVecReserve\n");
    
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
    
        // Set capacity to a specific value
        BitVecReserve(&bv, 50);
    
        // Check that capacity was set correctly
    
        // Try to set capacity smaller than current length (should not shrink below length)
        BitVecReserve(&bv, 1);
    
        // Capacity should still accommodate at least the current length
    
        // Test shrink after reserve and clear
        BitVecReserve(&bv, 1000);
        BitVecClear(&bv);
        BitVecShrinkToFit(&bv);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        WriteFmt("Testing BitVecReserve edge cases\n");
    
        BitVec bv     = BitVecInit(ALLOCATOR_OF(&alloc));
    
        // Test set capacity on empty bitvec
        BitVecReserve(&bv, 100);
        result = result && (BitVecCapacity(&bv) >= 100) && (BitVecLen(&bv) == 0);
    
        // Test setting very large capacity
        BitVecReserve(&bv, 10000);
        result = result && (BitVecCapacity(&bv) >= 10000);
            BitVecSwap(&bv1, &bv2);
    
            BitVecReserve(&bv1, cycle * 20);
            BitVecShrinkToFit(&bv2);
    
        // Reserve more space
        BitVecReserve(&bv, 100);
        result = result && (BitVecLen(&bv) == 3);
        result = result && (BitVecCapacity(&bv) >= 100);
        // Create large bitvector
        const int size = 10000;
        BitVecReserve(&bv, size);
    
        // Set alternating pattern
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        WriteFmt("Testing BitVecReserve\n");
    
        BitVec bv = BitVecInit(ALLOCATOR_OF(&alloc));
    
        // Reserve space for 50 bits
        BitVecReserve(&bv, 50);
    
        // Check that capacity was increased
        // Test reserving less than current capacity (should be no-op)
        u64 original_capacity = BitVecCapacity(&bv);
        BitVecReserve(&bv, 25);
        result = result && (BitVecCapacity(&bv) == original_capacity);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        WriteFmt("Testing BitVecReserve edge cases\n");
    
        BitVec bv     = BitVecInit(ALLOCATOR_OF(&alloc));
    
        // Test reserving 0 (should be safe no-op)
        BitVecReserve(&bv, 0);
        result = result && (BitVecCapacity(&bv) == 0) && (BitVecData(&bv) == NULL);
    
        // Test reserving 1 bit (minimum meaningful size)
        BitVecReserve(&bv, 1);
        result = result && (BitVecCapacity(&bv) >= 1) && (BitVecData(&bv) != NULL);
    
        // Test very large but reasonable reservation
        BitVecReserve(&bv, 10000);
        result = result && (BitVecCapacity(&bv) >= 10000);
        // Test reserving same u64 repeatedly (should be no-op)
        u64 cap_before = BitVecCapacity(&bv);
        BitVecReserve(&bv, BitVecCapacity(&bv));
        BitVecReserve(&bv, BitVecCapacity(&bv));
        result = result && (BitVecCapacity(&bv) == cap_before);
        u64 cap_before = BitVecCapacity(&bv);
        BitVecReserve(&bv, BitVecCapacity(&bv));
        BitVecReserve(&bv, BitVecCapacity(&bv));
        result = result && (BitVecCapacity(&bv) == cap_before);
    #define BitVecMustReserve(bv, n)                                                                                       \
        do {                                                                                                               \
            if (!BitVecReserve((bv), (n))) {                                                                               \
                LOG_FATAL("BitVecMustReserve failed");                                                                     \
            }                                                                                                              \
Last updated on