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)
    /// TAGS: Buf, Init, Construct, Lifecycle
    ///
    #define BufInit(...) VecInit(__VA_ARGS__)
    
    ///
        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
        // 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
    
        typedef Vec(u32) U32Vec;
        U32Vec vec = VecInit(&alloc);
        for (u32 i = 0; i < 3; i++) {
            VecPushBackR(&vec, i);
    
        typedef Vec(u32) U32Vec;
        U32Vec vec = VecInit(&alloc);
        for (u32 i = 0; i < 3; i++) {
            VecPushBackR(&vec, i);
        // 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
    
        typedef Vec(int) IntVec;
        IntVec src      = VecInit(&local);
        int    values[] = {1, 2, 3};
        for (int i = 0; i < 3; i++) {
        }
    
        IntVec dst = VecInit(&local);
        VecInitClone(&dst, &src);
    
        typedef Vec(int) IntVec;
        IntVec src      = VecInit(&local);
        int    values[] = {1, 2, 3};
        for (int i = 0; i < 3; i++) {
        }
    
        IntVec dst = VecInit(&local);
        VecInitClone(&dst, &src);
    
        typedef Vec(int) IntVec;
        IntVec src      = VecInit(&local);
        int    values[] = {1, 2, 3};
        for (int i = 0; i < 3; i++) {
        }
    
        IntVec dst = VecInit(&local);
        VecInitClone(&dst, &src);
    
        typedef Vec(int) IntVec;
        IntVec src      = VecInit(&local);
        int    values[] = {1, 2, 3};
        for (int i = 0; i < 3; i++) {
        }
    
        IntVec dst = VecInit(&local);
        VecInitClone(&dst, &src);
    
        typedef Vec(int) IntVec;
        IntVec src      = VecInit(&local);
        int    values[] = {1, 2, 3};
        for (int i = 0; i < 3; i++) {
        }
    
        IntVec dst    = VecInit(&local);
        bool   cloned = VecInitClone(&dst, &src);
        // 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
    
        typedef Vec(u32) U32Vec;
        U32Vec vec = VecInit(&alloc);
    
        u32 seed[] = {1, 2};
    
        typedef Vec(u64) U64Vec;
        U64Vec vec = VecInit(&alloc);
    
        u64 seed[] = {1, 2};
    
        typedef Vec(u32) U32Vec;
        U32Vec vec = VecInit(&alloc);
    
        u32 seed[] = {7, 8};
    
        typedef Vec(u32) U32Vec;
        U32Vec vec = VecInit(&alloc);
    
        // Empty -> grow branch -> reserve_pow2_vec(10). Real: next pow2 >= 10 == 16.
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&heap);
    
        // Capacity 8 -> 64-byte class (16 int slots). Poison the whole class slot.
    
        typedef Vec(char) CharVec;
        CharVec vec = VecInit(&heap);
    
        // n + 1 == SIZE_MAX == (size)-1 / 1: the exact boundary. Real code does not
    
        typedef Vec(char) CharVec;
        CharVec vec = VecInit(&local);
    
        // ~16 KiB of live chars: a 42x over-write spans ~688 KiB, far past the
    
        typedef Vec(int) IntVec;
        IntVec vec      = VecInit(&local);
        vec.copy_deinit = (GenericCopyDeinit)clear_counting_deinit;
        } Wide; // sizeof == 64
        typedef Vec(Wide) WideVec;
        WideVec vec = VecInit(&local);
    
        const u32 N = 60000;
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&local);
    
        VecReserve(&vec, 64);
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&local);
    
        VecReserve(&vec, 50); // length stays 0, capacity > 0, data != NULL
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&local);
    
        VecReserve(&vec, 50); // length stays 0
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&local);
    
        VecReserve(&vec, 100);
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&local);
    
        int values[] = {10, 20, 30};
        } Big;
        typedef Vec(Big) BigVec;
        BigVec vec = VecInit(&alloc);
    
        // (size)1<<43 * 2^21 == 2^64 -> wraps past `size`. Well under the
    // 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
    
        typedef Vec(int) IntVec;
        IntVec vec      = VecInit(&local);
        vec.copy_deinit = (GenericCopyDeinit)counting_deinit;
        // 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};
        WriteFmt("Testing fast-insert SIZE_MAX count returns false (no abort)\n");
    
        ElemVec vec = VecInit(&alloc);
    
        Elem src[1] = {
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        VecReserve(&vec, 8);
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        VecReserve(&vec, 10); // exact, non-power-of-2 capacity
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        int  add[8] = {10, 20, 30, 40, 50, 60, 70, 80};
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        int  add[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        WriteFmt("Testing fast-insert preserves displaced tail (aligned_size)\n");
    
        ElemVec vec = VecInit(&alloc); // no copy hooks: plain MemCopy path
    
        Elem orig[4];
        WriteFmt("Testing fast-insert displacement move stays in bounds (over-copy)\n");
    
        ElemVec vec = VecInit(&alloc); // no copy hooks: plain MemCopy path
    
        // N live originals; inserting N at idx 0 makes displaced == min(N, N) == N,
        // The inserted block is held in a scratch vec; its raw storage feeds the
        // fast insert.
        ElemVec ins = VecInit(&alloc);
        for (size i = 0; i < N; i++) {
            Elem e = {.value = 1000000 + (int)i, .live = false};
        WriteFmt("Testing insert with count == SIZE_MAX returns false (no overflow)\n");
    
        U64Vec vec = VecInit(&alloc);
        u64    one = 1;
        WriteFmt("Testing front insert preserves originals (aligned_size assign)\n");
    
        U64Vec vec = VecInit(&alloc);
        VecReserve(&vec, 16);
        u64 originals[] = {10, 20, 30};
        WriteFmt("Testing front insert keeps first original (aligned_size call)\n");
    
        U64Vec vec = VecInit(&alloc);
        VecReserve(&vec, 16);
        u64 originals[] = {11, 22, 33};
        // while the real single-element move stays in bounds.
        const size N   = 100000;
        U64Vec     vec = VecInit(&alloc);
        for (size i = 0; i < N; i++) {
            u64 v = (u64)i;
    
        typedef Vec(u32) U32Vec;
        U32Vec vec = VecInit(&local);
    
        u32  items[] = {111u, 222u, 333u};
    
        typedef Vec(u32) U32Vec;
        U32Vec vec = VecInit(&local);
    
        u32  items[] = {444u, 555u, 666u};
    
        typedef Vec(u32) U32Vec;
        U32Vec vec = VecInit(&local);
    
        u32  val = 777u;
        // 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);
    
        // 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
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        int values[] = {10, 20, 30};
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        int values[] = {10, 20, 30, 40};
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        int values[] = {11, 22, 33, 44};
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        int values[] = {1, 2, 3, 4, 5};
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        int values[] = {1, 2, 3, 4, 5};
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        const int N = 100000;
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        const int N = 40002;
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        const int N = 40000;
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        const int N = 40000;
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
        for (int i = 0; i < 10; i++) {
            VecPushBackR(&vec, i);  // [0..9]
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
        for (int i = 0; i < 10; i++) {
            VecPushBackR(&vec, i);  // [0..9]
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        const int N = 40000;
    
        typedef Vec(u64) U64Vec;
        U64Vec vec = VecInit(&alloc);
    
        // Large, tightly-allocated buffer: capacity == length so the only slack is
    
        typedef Vec(u64) U64Vec;
        U64Vec vec = VecInit(&alloc);
    
        const size N = 100000;
        // 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
        // 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
        // still `sizeof(int)`, so VecSize and VecAlignedOffsetAt agree.
        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
        // alignment: the allocator governs only the buffer base, never the stride.
        typedef Vec(int) AlignedIntVec;
        AlignedIntVec aligned_vec = VecInit(&aligned8);
    
        // Stride stays `sizeof(int)` even on an 8-byte-aligned allocator.
    
        typedef Vec(int) IntVec;
        IntVec vec = VecInit(&alloc);
    
        int  needle  = 20;
    
        typedef Vec(u32) U32Vec;
        U32Vec vec = VecInit(&alloc);
    
        u32 values[] = {111, 222, 333, 444};
    
        typedef Vec(u32) U32Vec;
        U32Vec src      = VecInit(&alloc);
        u32    values[] = {10, 20, 30, 40};
        for (int i = 0; i < 4; i++) {
        }
    
        U32Vec dst = VecInit(&alloc);
        VecInitClone(&dst, &src);
        ArenaAllocator arena = ArenaAllocatorInit();
        typedef Vec(int) IntVec;
        IntVec v  = VecInit(&arena);
        bool   ok = true;
        PageAllocator alloc = PageAllocatorInit();
        typedef Vec(int) IntVec;
        IntVec v  = VecInit(&alloc);
        bool   ok = true;
    
        // 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
        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);
        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);
        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, {
    
        // 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);
Last updated on