Skip to content

VecInit

Description

Initialize a Vec bound to an allocator. The argument may be either a typed allocator handle (&heap, &arena, …) or a raw Allocator *ALLOCATOR_OF typechecks both at compile time and converts to Allocator * via a whole-pointer typecast.

Inside a Scope(...) block the allocator argument may be omitted; the macro then binds to the internal MisraScope allocator the scope provides. Outside a Scope, calling VecInit() with no argument fails to compile because MisraScope is undeclared - the safety net the design relies on.

Usage example (from documentation)

  Scope(alloc, DefaultAllocator) {
      Vec(int) v = VecInit();      // uses MisraScope
      Vec(int) w = VecInit(alloc); // uses the named user-pool
      ...
      VecDeinit(&v);
      VecDeinit(&w);
  }

Usage example (Cross-references)

Usage examples (Cross-references)
        ValidateStr(s);
    
        StrIters sv   = (StrIters)VecInit(s->allocator);
        Zstr     prev = s->data;
        Zstr     end  = s->data + s->length;
        ValidateStr(s);
    
        Strs sv        = (Strs)VecInit(s->allocator);
        sv.copy_deinit = (GenericCopyDeinit)str_deinit;
        Zstr prev      = s->data;
        }
    
        DirContents dc = (DirContents)VecInit(alloc);
    
        // Construct the search path: "<path>\*". Built with the in-tree
        }
    
        DirContents dc = (DirContents)VecInit(alloc);
    
        // O_RDONLY | O_DIRECTORY | O_CLOEXEC. Values match between Linux
        StrIter si1   = StrIterFromStr(json1);
    
        Vec(i32) items = VecInit(&alloc);
    
        JR_OBJ(si1, {
            i32 x_value;
            Vec(i32) filled_items;
        } obj = {0, VecInit(&alloc)};
    
        JR_OBJ(si, {
        Str  json    = StrInit(&alloc);
    
        Vec(u32) numbers = VecInit(&alloc);
        u32 num1 = 1, num2 = 2, num3 = 3;
        VecPushBack(&numbers, num1);
        VecPushBack(&strings, str3);
    
        Vec(bool) booleans = VecInit(&alloc);
        bool bool1 = true, bool2 = false, bool3 = true;
        VecPushBack(&booleans, bool1);
        Str  json    = StrInit(&alloc);
    
        Vec(i32) empty_numbers = VecInit(&alloc);
        Vec(Str) empty_strings = VecInitWithDeepCopy(NULL, StrDeinit, &alloc);
        Str  json    = StrInit(&alloc);
    
        Vec(i32) empty_list = VecInit(&alloc);
    
        JW_OBJ(json, {
        Str  json    = StrInit(&alloc);
    
        Vec(i32) empty_arr  = VecInit(&alloc);
        Vec(i32) filled_arr = VecInit(&alloc);
        i32 val1 = 1, val2 = 2;
    
        Vec(i32) empty_arr  = VecInit(&alloc);
        Vec(i32) filled_arr = VecInit(&alloc);
        i32 val1 = 1, val2 = 2;
        VecPushBack(&filled_arr, val1);
    
        // Original data
        Vec(i32) original_numbers = VecInit(&alloc);
        Vec(Str) original_strings = VecInitWithDeepCopy(NULL, StrDeinit, &alloc);
    
        // Read back from JSON
        Vec(i32) parsed_numbers = VecInit(&alloc);
        Vec(Str) parsed_strings = VecInitWithDeepCopy(NULL, StrDeinit, &alloc);
    
        // Original empty data
        Vec(i32) empty_numbers = VecInit(&alloc);
        Vec(Str) empty_strings = VecInitWithDeepCopy(NULL, StrDeinit, &alloc);
        Str empty_str          = StrInit(&alloc);
    
        // Read back from JSON
        Vec(i32) parsed_numbers = VecInit(&alloc);
        Vec(Str) parsed_strings = VecInitWithDeepCopy(NULL, StrDeinit, &alloc);
        Str  parsed_str         = StrInit(&alloc);
        PageAllocator alloc = PageAllocatorInit();
        typedef Vec(int) IntVec;
        IntVec v  = VecInit(&alloc);
        bool   ok = true;
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data in unsorted order
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some elements
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some elements
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add several elements
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add several elements
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add several elements
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add several elements
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add several elements
        ArenaAllocator arena = ArenaAllocatorInit();
        typedef Vec(int) IntVec;
        IntVec v  = VecInit(&arena);
        bool   ok = true;
    // Test basic vector initialization
    bool test_vec_init_basic(void) {
        WriteFmt("Testing VecInit\n");
    
        // Test with int type
        // Test with int type
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Check initial state
        // Test with struct type
        typedef Vec(TestItem) TestVec;
        TestVec test_vec = VecInit(&alloc);
    
        // Check initial state
    // Test aligned vector initialization
    bool test_vec_init_aligned(void) {
        WriteFmt("Testing VecInit with aligned allocator\n");
    
        HeapAllocator aligned4  = HeapAllocatorInitAligned(4);
        // Test with int type and 4-byte alignment
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&aligned4);
    
        // Check initial state
        // Test with struct type and 16-byte alignment
        typedef Vec(TestItem) TestVec;
        TestVec test_vec = VecInit(&aligned16);
    
        // Check initial state
    // Test vector initialization with alignment and deep copy functions
    bool test_vec_init_aligned_with_deep_copy(void) {
        WriteFmt("Testing VecInit with aligned allocator and deep copy\n");
    
        HeapAllocator aligned8 = HeapAllocatorInitAligned(8);
    // Test vector initialization variants with an explicit optional allocator
    bool test_vec_init_optional_allocator(void) {
        WriteFmt("Testing VecInit optional allocator\n");
    
        typedef Vec(TestItem) TestVec;
        h64.base.retry_limit       = 17;
    
        TestVec vec_a = VecInit(&h_default);
        TestVec vec_b = VecInitT(vec_b, &h_default);
        TestVec vec_c = VecInitWithDeepCopy(TestItemCopyInit, TestItemDeinit, &h_default);
        TestVec vec_c = VecInitWithDeepCopy(TestItemCopyInit, TestItemDeinit, &h_default);
        TestVec vec_d = VecInitWithDeepCopyT(vec_d, TestItemCopyInit, TestItemDeinit, &h_default);
        TestVec vec_e = VecInit(&h8);
        TestVec vec_f = VecInitT(vec_f, &h16);
        TestVec vec_g = VecInitWithDeepCopy(TestItemCopyInit, TestItemDeinit, &h32);
        // Create a source vector
        typedef Vec(int) IntVec;
        IntVec src = VecInit(&alloc);
    
        // Add some data
    
        // Create a destination vector
        IntVec clone = VecInit(&alloc);
    
        // Clone the source vector into the destination
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Reserve more space than needed
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Initial capacity should be 0
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
    
        // Create a valid Strs
        Strs sv = VecInit(&alloc);
    
        // This should not crash
    
        // Create an invalid Strs by corrupting its fields
        Strs sv = VecInit(&alloc);
    
        // Corrupt the vector to make it invalid
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Test VecPushBackL
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some initial elements
    
        // Now test VecInsertRangeFastR in isolation
        IntVec vec2 = VecInit(&alloc);
    
        // Add some initial elements
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some initial elements
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Test pushing to empty vector
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some data
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Check initial size and length
        // Test with a vector with alignment > 1
        typedef Vec(int) AlignedIntVec;
        AlignedIntVec aligned_vec = VecInit(&aligned8);
    
        // Add some data
        // Create a vector of integers with default alignment (1)
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Check offsets
        // Create a vector with 8-byte alignment
        typedef Vec(int) AlignedIntVec;
        AlignedIntVec aligned_vec = VecInit(&aligned8);
    
        // For 8-byte alignment, each int (4 bytes) should be padded to 8 bytes
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        int  needle  = 20;
        // Define a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Check initial state
        // Test with a struct type
        typedef Vec(TestItem) TestVec;
        TestVec test_vec = VecInit(&alloc);
    
        // Check initial state
        // Create a valid vector
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // This should not abort
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Push some elements to the back
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Push some elements to the front
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Insert at index 0 (empty vector)
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Push an array to the back
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Push an array to the front of empty vector
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Push some elements first
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Add some initial elements
    
        // Create another vector with elements to insert
        IntVec src          = VecInit(&alloc);
        int    src_values[] = {40, 50, 60};
        VecPushBackArrR(&src, src_values, 3);
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec1 = VecInit(&alloc);
    
        // Add some elements to first vector
    
        // Create second vector
        IntVec vec2 = VecInit(&alloc);
    
        // Add some elements to second vector
        local_heap.base.retry_limit = 11;
    
        IntVec src      = VecInit(&local_heap);
        int    values[] = {10, 20, 30};
        VecPushBackArrR(&src, values, 3);
        // int[]. Stronger alignment is exercised separately - it's not what
        // this test is asserting.
        IntVec dst = VecInit(VecAllocator(&src));
        // intentional bypass: testing hook propagation; no public VecSetCopyHooks mutator exists
        dst.copy_init   = src.copy_init;
        // Create a vector of integers
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Test R-value insert operations
        // Create a vector of integers without copy_init
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        // Test VecPushBackL
    
        // Test VecMergeL
        IntVec vec2         = VecInit(&alloc);
        int    merge_vals[] = {140, 150, 160};
        for (int i = 0; i < 3; i++) {
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        int  originals[] = {10, 20, 30, 40, 50, 60, 70, 80};
    /// TAGS: Buf, Init, Construct, Lifecycle
    ///
    #define BufInit(...) VecInit(__VA_ARGS__)
    
    ///
Last updated on