Skip to content

VecBegin

Description

Pointer to the first element of the vector. Equivalent to v->data.

Parameters

Name Direction Description
v in Vector to query.

Usage example (Cross-references)

Usage examples (Cross-references)
        if (!out || !frames)
            return;
        format_walk_win(out, VecBegin(frames), VecLen(frames), alloc);
    }
        if (!out || !frames || !alloc)
            return;
        format_walk_mac(out, VecBegin(frames), VecLen(frames), alloc);
    }
        if (!out || !frames || !resolver)
            return;
        format_walk_with(out, VecBegin(frames), VecLen(frames), resolver);
    }
        if (!out || !frames || !alloc)
            return;
        format_walk_alloc(out, VecBegin(frames), VecLen(frames), alloc);
    }
        // down. `VecBegin` is a `NULL`-safe field read that does not
        // call into the validator.
        if (VecBegin(&self->hosts)) {
            VecForeachPtr(&self->hosts, e) {
                StrDeinit(&e->name);
            VecDeinit(&self->hosts);
        }
        if (VecBegin(&self->nameservers)) {
            VecDeinit(&self->nameservers);
        }
    
        u8  resp_buf[1232]; // safe UDP payload (avoids IP fragmentation)
        i64 got = udp_round_trip(ns, VecBegin(&query), VecLen(&query), resp_buf, sizeof(resp_buf), self->timeout_ms);
        VecDeinit(&query);
        if (got <= 0) {
        bool ok = false;
        VecInitStack(u8, buf, 28) {
            if (!stream_read(self, 1, 0, VecBegin(&buf), VecCapacity(&buf)))
                break;
            BufIter bi = BufIterFromMemory(VecBegin(&buf), VecCapacity(&buf));
            if (!stream_read(self, 1, 0, VecBegin(&buf), VecCapacity(&buf)))
                break;
            BufIter bi = BufIterFromMemory(VecBegin(&buf), VecCapacity(&buf));
            if (!BufReadFmt(&bi, FMT_PDB_INFO_LE, self->info.version, self->info.signature, self->info.age)) {
                LOG_ERROR("PDB: info stream prefix truncated");
                break;
            }
            MemCopy(self->info.guid, VecBegin(&buf) + 12, 16);
            ok = true;
        }
        u16 global_idx = 0, build_num = 0, public_idx = 0, pdb_dll_ver = 0, pdb_dll_rbld = 0, flags = 0, machine = 0;
        VecInitStack(u8, hdr, DBI_HEADER_SIZE) {
            if (!stream_read(self, DBI_STREAM_INDEX, 0, VecBegin(&hdr), VecCapacity(&hdr)))
                break;
                break;
    
            BufIter bi = BufIterFromMemory(VecBegin(&hdr), VecCapacity(&hdr));
            if (!BufReadFmt(
                    &bi,
    
        VecInitStack(u8, sh, 2) {
            if (!stream_read(self, DBI_STREAM_INDEX, sec_hdr_off, VecBegin(&sh), 2))
                break;
            r.section_hdr_stream = (u16)VecAt(&sh, 0) | (u16)VecAt(&sh, 1) << 8;
    
    static void deinit_record_list(DnsRecords *list) {
        if (!list || !VecBegin(list)) {
            return;
        }
            case VEC_CHAR_PTR_BEGIN : {
                if (VecLen(vec) > 0) {
                    char **begin = VecBegin(vec);
                    (void)begin; // Use the result to avoid warnings
                }
            case VEC_STR_BEGIN : {
                if (VecLen(vec) > 0) {
                    Str *begin = VecBegin(vec);
                    (void)begin; // Use the result to avoid warnings
                }
    
            case VEC_INT_BEGIN : {
                volatile i32 *begin_ptr = VecBegin(vec);
                (void)begin_ptr;
                break;
        // every internal cursor / table empty.
        bool result = GraphNodeCount(&graph) == 0 && GraphEdgeCount(&graph) == 0 && GraphEmpty(&graph) &&
                      VecBegin(&graph.slots) == NULL && VecBegin(&graph.free_indices) == NULL &&
                      VecBegin(&graph.pending_edge_removals) == NULL && GraphCopyInit(&graph) == NULL &&
                      GraphCopyDeinit(&graph) == NULL && graph.pending_delete_count == 0 &&
        bool result = GraphNodeCount(&graph) == 0 && GraphEdgeCount(&graph) == 0 && GraphEmpty(&graph) &&
                      VecBegin(&graph.slots) == NULL && VecBegin(&graph.free_indices) == NULL &&
                      VecBegin(&graph.pending_edge_removals) == NULL && GraphCopyInit(&graph) == NULL &&
                      GraphCopyDeinit(&graph) == NULL && graph.pending_delete_count == 0 &&
                      GraphMutationEpoch(&graph) == 0 && GraphAllocator(&graph)->alignment == 1;
    
        // Check initial state
        bool result = (VecLen(&vec) == 0 && VecCapacity(&vec) == 0 && VecBegin(&vec) == NULL &&
                       VecAllocator(&vec)->alignment == 1 && VecCopyInit(&vec) == NULL && VecCopyDeinit(&vec) == NULL);
        // Check initial state
        result = result &&
                 (VecLen(&test_vec) == 0 && VecCapacity(&test_vec) == 0 && VecBegin(&test_vec) == NULL &&
                  VecAllocator(&test_vec)->alignment == 1 && VecCopyInit(&test_vec) == NULL &&
                  VecCopyDeinit(&test_vec) == NULL);
    
        // Check initial state
        bool result = (VecLen(&vec) == 0 && VecCapacity(&vec) == 0 && VecBegin(&vec) == NULL &&
                       VecAllocator(&vec)->alignment == 4 && VecCopyInit(&vec) == NULL && VecCopyDeinit(&vec) == NULL);
        // Check initial state
        result = result &&
                 (VecLen(&test_vec) == 0 && VecCapacity(&test_vec) == 0 && VecBegin(&test_vec) == NULL &&
                  VecAllocator(&test_vec)->alignment == 16 && VecCopyInit(&test_vec) == NULL &&
                  VecCopyDeinit(&test_vec) == NULL);
        // Check initial state
        bool result =
            (VecLen(&vec) == 0 && VecCapacity(&vec) == 0 && VecBegin(&vec) == NULL &&
             VecAllocator(&vec)->alignment == 1 && VecCopyInit(&vec) == (GenericCopyInit)TestItemCopyInit &&
             VecCopyDeinit(&vec) == (GenericCopyDeinit)TestItemDeinit);
        // Check initial state
        bool result =
            (VecLen(&vec) == 0 && VecCapacity(&vec) == 0 && VecBegin(&vec) == NULL &&
             VecAllocator(&vec)->alignment == 8 && VecCopyInit(&vec) == (GenericCopyInit)TestItemCopyInit &&
             VecCopyDeinit(&vec) == (GenericCopyDeinit)TestItemDeinit);
        VecInitStack(int, vec, 10) {
            // Stack-init: NULL allocator distinguishes from heap-init.
            if (VecLen(&vec) != 0 || VecCapacity(&vec) != 10 || VecBegin(&vec) == NULL ||
                VecAllocator(&vec) != NULL) {
                result = false;
        // Test with struct type
        VecInitStack(TestItem, test_vec, 5) {
            if (VecLen(&test_vec) != 0 || VecCapacity(&test_vec) != 5 || VecBegin(&test_vec) == NULL ||
                VecAllocator(&test_vec) != NULL) {
                result = false;
        } AlignedItem;
        VecInitStack(AlignedItem, av, 4) {
            if ((size)(void *)VecBegin(&av) % _Alignof(AlignedItem) != 0) {
                result = false;
            }
    
        // Clone the source vector into the destination
        VecPushBackArrR(&clone, VecBegin(&src), VecLen(&src));
    
        // Check that the clone has the same data but different memory
        // Check that the clone has the same data but different memory
        bool result =
            (VecLen(&clone) == VecLen(&src) && VecCapacity(&clone) >= VecLen(&src) && VecBegin(&clone) != VecBegin(&src) &&
             VecAllocator(&clone)->alignment == VecAllocator(&src)->alignment);
    
        // Data pointer should still be valid
        result = result && (VecBegin(&vec) != NULL);
    
        // Clean up
        // Check initial state
        bool result =
            (VecLen(&vec) == 0 && VecCapacity(&vec) == 0 && VecBegin(&vec) == NULL &&
             VecCopyInit(&vec) == (GenericCopyInit)ComplexItemCopyInit &&
             VecCopyDeinit(&vec) == (GenericCopyDeinit)ComplexItemDeinit);
        result = result && (VecLen(&vec3) == 2);
        result = result && (VecLen(&vec4) == 0); // VecMergeL resets source vector
        result = result && (VecBegin(&vec4) == NULL);
    
        // Check items in vec3: item4, item5
        // Check that vec2 is now empty (data has been transferred)
        result = result && (VecLen(&vec2) == 0);
        result = result && (VecBegin(&vec2) == NULL);
    
        // Clean up
    // Test VecBegin and VecEnd functions
    bool test_vec_begin_end(void) {
        WriteFmt("Testing VecBegin and VecEnd\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        // Get begin and end pointers
        int  *begin = VecBegin(&vec);
        char *end   = (char *)VecEnd(&vec);
        // Check initial state
        bool result =
            (VecLen(&vec) == 0 && VecCapacity(&vec) == 0 && VecBegin(&vec) == NULL &&
             VecAllocator(&vec)->alignment == 1 && VecCopyInit(&vec) == NULL && VecCopyDeinit(&vec) == NULL);
        // Check initial state
        result =
            result && (VecLen(&test_vec) == 0 && VecCapacity(&test_vec) == 0 && VecBegin(&test_vec) == NULL &&
                       VecAllocator(&test_vec)->alignment == 1 && VecCopyInit(&test_vec) == NULL &&
                       VecCopyDeinit(&test_vec) == NULL);
    
        // Insert range in the middle
        VecInsertRangeR(&vec, VecBegin(&src), 1, VecLen(&src));
    
        // Check length
        dst.copy_init   = src.copy_init;
        dst.copy_deinit = src.copy_deinit;
        bool cloned     = VecPushBackArrR(&dst, VecBegin(&src), VecLen(&src));
    
        bool allocator_matches = VecAllocator(&dst) == VecAllocator(&src);
        // Check that the source vector is cleared
        result = result && (VecLen(&vec2) == 0);
        result = result && (VecBegin(&vec2) == NULL);
    
        // Clean up
    ///
    #define IterInitFromVec(v)                                                                                             \
        {.data      = VecBegin(&(v)),                                                                                      \
         .length    = VecLen(&(v)),                                                                                        \
         .pos       = 0,                                                                                                   \
    ///
    #define IterInitRevFromVec(v)                                                                                          \
        {.data      = VecBegin(&(v)),                                                                                      \
         .length    = VecLen(&(v)),                                                                                        \
         .pos       = 0,                                                                                                   \
    ///
    #define IterInitFromVecT(i, v)                                                                                         \
        ((TYPE_OF(i)) {.data      = VecBegin(&(v)),                                                                        \
                       .length    = VecLen(&(v)),                                                                          \
                       .pos       = 0,                                                                                     \
    ///
    #define IterInitRevFromVecT(i, v)                                                                                      \
        ((TYPE_OF(i)) {.data      = VecBegin(&(v)),                                                                        \
                       .length    = VecLen(&(v)),                                                                          \
                       .pos       = 0,                                                                                     \
    /// TAGS: Str, Access, Iterator, Begin
    ///
    #define StrBegin(str) VecBegin(str)
    
    ///
Last updated on