Skip to content

VecPushBackR

Description

Append a single element to the end of the vector. R-value form.

Success

Returns true. The vector length grows by one; the value of val occupies the new tail.

Failure

Returns false on allocation failure. The vector is unchanged.

Usage example (Cross-references)

Usage examples (Cross-references)
            if (BitVecContainsAt(bv, pattern, i)) {
                size idx = (size)i;
                if (!VecPushBackR(out, idx))
                    return false;
            }
            } else {
                BitVecRun r = {.length = current_run_length, .value = current_value};
                if (!VecPushBackR(out, r))
                    return false;
                current_value      = bit;
        }
        BitVecRun r = {.length = current_run_length, .value = current_value};
        if (!VecPushBackR(out, r))
            return false;
        return true;
        }
    
        if (!VecPushBackR(&self->entries, entry)) {
            StrDeinit(&entry.module_path);
            return NULL;
        VecSinkCtx *s = (VecSinkCtx *)user;
        StackFrame  f = {.ip = ip};
        if (!VecPushBackR(s->vec, f)) {
            s->oom = true;
            return false;
            entry.has_sidecar = true;
        }
        if (!VecPushBackR(&self->cache, entry)) {
            if (entry.has_sidecar)
                ElfDeinit(&entry.sidecar);
                continue;
            }
            if (!VecPushBackR(&out->entries, e)) {
                ProcMapsDeinit(out);
                return false;
        }
    
        if (!VecPushBackR(&self->entries, entry)) {
            StrDeinit(&entry.module_path);
            return NULL;
                    e.is_ipv6 = true;
                }
                if (!VecPushBackR(table, e)) {
                    // VecPushBackR is R-form (copy semantics) -- on
                    // failure ownership of `e.name` stays with us. Release
                        if (parse_ipv4(StrBegin(&ip_buf), v4)) {
                            SocketAddr a = sockaddr_v4(v4, 53);
                            VecPushBackR(out, a);
                        } else if (parse_ipv6(StrBegin(&ip_buf), v6)) {
                            SocketAddr a = sockaddr_v6(v6, 53);
                        } else if (parse_ipv6(StrBegin(&ip_buf), v6)) {
                            SocketAddr a = sockaddr_v6(v6, 53);
                            VecPushBackR(out, a);
                        }
                    }
            if (rec->type == qtype) {
                SocketAddr a = qtype == DNS_TYPE_A ? sockaddr_v4(rec->ipv4, port) : sockaddr_v6(rec->ipv6, port);
                VecPushBackR(out, a);
                found = true;
            }
                if (StrLen(&e->name) > 0 && ZstrCompare(StrBegin(&e->name), nq) == 0) {
                    SocketAddr a = e->is_ipv6 ? sockaddr_v6(e->ip, port) : sockaddr_v4(e->ip, port);
                    VecPushBackR(out, a);
                    found = true;
                }
        SocketAddr direct;
        if (SocketAddrParse(&direct, spec, kind)) {
            VecPushBackR(out, direct);
            return true;
        }
            }
    
            if (!VecPushBackR(&req->headers, hh)) {
                HttpHeaderDeinit(&hh);
                LOG_ERROR("failed to push header");
        (void)maxprot;
        (void)initprot;
        if (!VecPushBackR(&ctx->out->segments, seg))
            return false;
            (void)reserved2;
            (void)reserved3;
            if (!VecPushBackR(&ctx->out->sections, sec))
                return false;
            // Must-precondition: the `IterIndex + SECT64_SIZE > IterLength`
            sym.type          = n_type;
            sym.section_index = n_sect;
            if (!VecPushBackR(&ctx->out->symbols, sym))
                return false;
        }
            s.info       = info;
            s.entry_size = entsize;
            if (!VecPushBackR(&self->sections, s)) {
                return false;
            }
            s.value         = value;
            s.size          = size_;
            if (!VecPushBackR(out, s)) {
                return false;
            }
            if (!pool_append(pool, dir, &off))
                return false;
            if (!VecPushBackR(&cs->dir_offsets, off))
                return false;
        }
            if (!pool_append(pool, name, &off))
                return false;
            if (!VecPushBackR(&cs->file_offsets, off))
                return false;
            if (!VecPushBackR(&cs->file_dir_idx, dir_idx))
            if (!VecPushBackR(&cs->file_offsets, off))
                return false;
            if (!VecPushBackR(&cs->file_dir_idx, dir_idx))
                return false;
        }
            }
        }
        if (!VecPushBackR(pending_file_offsets, file_off))
            return false;
        if (!VecPushBackR(pending_dir_offsets, dir_off))
        if (!VecPushBackR(pending_file_offsets, file_off))
            return false;
        if (!VecPushBackR(pending_dir_offsets, dir_off))
            return false;
            return false;
    
        if (!VecPushBackR(&out->entries, e))
            return false;
        (void)pool;
                    break;
                AbbrevAttr a = {.name = (u32)name, .form = (u32)form};
                if (!VecPushBackR(&e.attrs, a)) {
                    VecDeinit(&e.attrs);
                    return false;
                }
            }
            if (!VecPushBackR(out, e)) {
                VecDeinit(&e.attrs);
                return false;
                            return false;
                        PendingFn pf = {.low_pc = low_pc, .high_pc = hi, .name_offset_in_pool = offset};
                        if (!VecPushBackR(pending, pf))
                            return false;
                    }
                        .name    = StrBegin(&out->string_pool) + pf->name_offset_in_pool,
                };
                if (!VecPushBackR(&out->entries, f)) {
                    ok = false;
                    break;
                            return false;
                        }
                        if (!VecPushBackR(pending, pp)) {
                            AllocatorFree(BufAllocator(&self->data), buf);
                            return false;
                f.size       = next_rva >= f.rva ? next_rva - f.rva : 0;
            }
            if (!VecPushBackR(&self->functions, f)) {
                ok = false;
                break;
                BufIter body = BufIterFromMemory(IterDataAt(&section_cur, IterIndex(&section_cur)), length32 - 4);
                if (parse_cie(&body, cie_offset, &cie)) {
                    if (!VecPushBackR(&out->cies, cie)) {
                        DwarfCfiDeinit(out);
                        return false;
                BufIter  body = BufIterFromMemory(IterDataAt(&section_cur, IterIndex(&section_cur)), length32 - 4);
                if (parse_fde(&body, rec_start, cie_offset, out, section_data, eh->addr, &fde)) {
                    if (!VecPushBackR(&out->fdes, fde)) {
                        DwarfCfiDeinit(out);
                        return false;
            // The record carries owned Str/Vec fields; leaking it on a
            // push-failure path would orphan their backing allocations.
            if (!VecPushBackR(out, rec)) {
                DnsRecordDeinit(&rec);
                return false;
            (void)num_linenums;
    
            if (!VecPushBackR(&ctx->out->sections, s))
                return false;
        }
    
        for (int i = 0; i < 1024; i++) {
            if (!VecPushBackR(&v, i)) {
                ok = false;
                break;
        int values[] = {10, 20, 30, 40, 50};
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec, values[i]);
        }
        int values[] = {10, 20, 30, 40, 50};
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec, values[i]);
        }
        int even_values[] = {10, 20, 30, 40};
        for (int i = 0; i < 4; i++) {
            VecPushBackR(&vec, even_values[i]);
        }
        int values[] = {30, 10, 50, 20, 40};
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec, values[i]);
        }
        int values[] = {10, 20, 30, 40, 50};
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec, values[i]);
        }
        int values[] = {10, 20, 30, 40, 50};
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec, values[i]);
        }
        int values[] = {10, 20, 30, 40, 50};
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec, values[i]);
        }
        int values[] = {10, 20, 30, 40, 50};
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec, values[i]);
        }
        int values[] = {10, 20, 30, 40, 50};
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec, values[i]);
        }
        int values[] = {10, 20, 30, 40, 50};
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec, values[i]);
        }
        int values[] = {10, 20, 30, 40, 50};
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec, values[i]);
        }
        int values[] = {10, 20, 30, 40, 50};
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec, values[i]);
        }
        // Add some elements
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec, i * 10);
        }
        // Add some elements
        for (int i = 0; i < 6; i++) {
            VecPushBackR(&vec, i * 20);
        }
        // Add several elements
        for (int i = 0; i < 6; i++) {
            VecPushBackR(&vec, i * 15);
        }
        // Add several elements
        for (int i = 0; i < 7; i++) {
            VecPushBackR(&vec, i * 25);
        }
        // Add several elements
        for (int i = 0; i < 8; i++) {
            VecPushBackR(&vec, i * 35);
        }
        // Add several elements
        for (int i = 0; i < 9; i++) {
            VecPushBackR(&vec, i * 45);
        }
        // Add several elements
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec, i * 30);
        }
    
        for (int i = 0; i < 4096; i++) {
            if (!VecPushBackR(&v, i)) {
                ok = false;
                break;
            }
    
            VecPushBackR(&vec, 10);
            VecPushBackR(&vec, 20);
            VecPushBackR(&vec, 30);
    
            VecPushBackR(&vec, 10);
            VecPushBackR(&vec, 20);
            VecPushBackR(&vec, 30);
            VecPushBackR(&vec, 10);
            VecPushBackR(&vec, 20);
            VecPushBackR(&vec, 30);
    
            if (VecLen(&vec) != 3 || VecAt(&vec, 0) != 10 || VecAt(&vec, 1) != 20 || VecAt(&vec, 2) != 30) {
            item.id       = 1;
            item.value    = 3.14;
            VecPushBackR(&test_vec, item);
    
            if (VecLen(&test_vec) != 1 || VecAt(&test_vec, 0).id != 1 || VecAt(&test_vec, 0).value != 3.14f) {
            }
            AlignedItem item = {.a = 7, .b = 2.71828};
            VecPushBackR(&av, item);
            if (VecLen(&av) != 1 || VecAt(&av, 0).a != 7 || VecAt(&av, 0).b != 2.71828) {
                result = false;
        // outer-for update still runs.
        VecInitStack(int, breakable, 8) {
            VecPushBackR(&breakable, 1);
            if (VecLen(&breakable) != 1) {
                result = false;
    
        // Add some data
        VecPushBackR(&src, 1);
        VecPushBackR(&src, 2);
        VecPushBackR(&src, 3);
        // Add some data
        VecPushBackR(&src, 1);
        VecPushBackR(&src, 2);
        VecPushBackR(&src, 3);
        VecPushBackR(&src, 1);
        VecPushBackR(&src, 2);
        VecPushBackR(&src, 3);
    
        // Create a destination vector
        int values[] = {10, 20, 30, 40, 50};
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec, values[i]);
        }
        int values[] = {10, 20, 30, 40, 50};
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec, values[i]);
        }
        int values[] = {10, 20, 30, 40, 50};
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec, values[i]);
        }
        int values[] = {10, 20, 30, 40, 50};
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec, values[i]);
        }
    
        // Add the item to the vector
        VecPushBackR(&vec, item);
    
        // Check that the vector now has one item
    
        // Push items to the vector
        VecPushBackR(&vec, item1);
        VecPushFrontR(&vec, item2);
        VecPushBackR(&vec, item3);
        VecPushBackR(&vec, item1);
        VecPushFrontR(&vec, item2);
        VecPushBackR(&vec, item3);
    
        // Check vector length
    
        // Add item1 to the vector
        VecPushBackR(&vec, item1);
    
        // Insert item2 at index 0
    
        // Add items to vectors
        VecPushBackR(&vec1, item1);
        VecPushBackR(&vec2, item2);
        VecPushBackR(&vec2, item3);
        // Add items to vectors
        VecPushBackR(&vec1, item1);
        VecPushBackR(&vec2, item2);
        VecPushBackR(&vec2, item3);
        VecPushBackR(&vec1, item1);
        VecPushBackR(&vec2, item2);
        VecPushBackR(&vec2, item3);
    
        // Merge vec2 into vec1
        // Add some initial elements
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec, i * 10);
        }
        // Add some initial elements
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec2, i * 10);
        }
    
        // Test pushing to empty vector
        VecPushBackR(&vec, 10);
        bool result = (VecLen(&vec) == 1 && VecAt(&vec, 0) == 10);
        const int large_count = 1000;
        for (int i = 0; i < large_count; i++) {
            VecPushBackR(&vec, i);
        }
    
        // Push an element (should auto-resize)
        VecPushBackR(&vec, 42);
        result = result && (VecLen(&vec) == 1 && VecAt(&vec, 0) == 42);
    
        // Add some data
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
        // Add some data
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
        VecPushBackR(&vec, 40);
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
        VecPushBackR(&vec, 40);
        VecPushBackR(&vec, 50);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
        VecPushBackR(&vec, 40);
        VecPushBackR(&vec, 50);
        VecPushBackR(&vec, 30);
        VecPushBackR(&vec, 40);
        VecPushBackR(&vec, 50);
    
        // Check values using VecAt
    
        // Add some data
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
        // Add some data
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
    
        // Get pointers to elements
    
        // Add some data
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
        // Add some data
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
    
        // Check first and last elements
    
        // Add some data
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
        // Add some data
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
    
        // Get begin and end pointers
    
        // Add some data
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
        // Add some data
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
    
        // Check size and length after adding elements
    
        // Add some data
        VecPushBackR(&aligned_vec, 10);
        VecPushBackR(&aligned_vec, 20);
        // Add some data
        VecPushBackR(&aligned_vec, 10);
        VecPushBackR(&aligned_vec, 20);
    
        // Check size and length with alignment
        result       = result && !VecContains(&vec, &needle, compare_ints);
    
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
    
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 20);
        VecPushBackR(&vec, 30);
        VecPushBackR(&vec, 20);
    
        result = result && !VecEmpty(&vec);
        int values[] = {10, 20, 30, 40, 50};
        for (int i = 0; i < 5; i++) {
            VecPushBackR(&vec, values[i]);
        }
    
        // Push some elements first
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
        // Push some elements first
        VecPushBackR(&vec, 10);
        VecPushBackR(&vec, 20);
    
        // Push an array at a specific index
    
        // Test R-value insert operations
        VecPushBackR(&vec, LVAL(42));
    
        // Check that the element was added
        int    merge_vals[] = {140, 150, 160};
        for (int i = 0; i < 3; i++) {
            VecPushBackR(&vec2, merge_vals[i]);
        }
        size orig_count  = sizeof(originals) / sizeof(originals[0]);
        for (size i = 0; i < orig_count; i++) {
            VecPushBackR(&vec, originals[i]);
        }
    static inline bool BufPushBytes(Buf *b, const u8 *data, size n) {
        for (size i = 0; i < n; ++i) {
            if (!VecPushBackR(b, data[i])) {
                return false;
            }
    ///
    static inline bool BufWriteU8(Buf *b, u8 v) {
        return VecPushBackR(b, v);
    }
    ///
    static inline bool BufWriteU16LE(Buf *b, u16 v) {
        return VecPushBackR(b, (u8)(v & 0xFFu)) && VecPushBackR(b, (u8)((v >> 8) & 0xFFu));
    }
    ///
    static inline bool BufWriteU16BE(Buf *b, u16 v) {
        return VecPushBackR(b, (u8)((v >> 8) & 0xFFu)) && VecPushBackR(b, (u8)(v & 0xFFu));
    }
    static inline bool BufWriteU32LE(Buf *b, u32 v) {
        for (int i = 0; i < 4; ++i) {
            if (!VecPushBackR(b, (u8)((v >> (i * 8)) & 0xFFu))) {
                return false;
            }
    static inline bool BufWriteU32BE(Buf *b, u32 v) {
        for (int i = 3; i >= 0; --i) {
            if (!VecPushBackR(b, (u8)((v >> (i * 8)) & 0xFFu))) {
                return false;
            }
    static inline bool BufWriteU64LE(Buf *b, u64 v) {
        for (int i = 0; i < 8; ++i) {
            if (!VecPushBackR(b, (u8)((v >> (i * 8)) & 0xFFu))) {
                return false;
            }
    static inline bool BufWriteU64BE(Buf *b, u64 v) {
        for (int i = 7; i >= 0; --i) {
            if (!VecPushBackR(b, (u8)((v >> (i * 8)) & 0xFFu))) {
                return false;
            }
                byte_ |= 0x80;
            }
            if (!VecPushBackR(b, byte_)) {
                return false;
            }
                byte_ |= 0x80;
            }
            if (!VecPushBackR(b, byte_)) {
                return false;
            }
    static inline bool BufWriteZstr(Buf *b, Zstr s) {
        while (*s) {
            if (!VecPushBackR(b, (u8)*s)) {
                return false;
            }
            ++s;
        }
        return VecPushBackR(b, (u8)0);
    }
    #define VecMustPushBackR(v, val)                                                                                       \
        do {                                                                                                               \
            if (!VecPushBackR((v), (val))) {                                                                               \
                LOG_FATAL("VecMustPushBackR failed");                                                                      \
            }                                                                                                              \
    /// TAGS: Str, PushBack, Char, RValue
    ///
    #define StrPushBackR(str, rval) VecPushBackR((str), (rval))
    
    ///
Last updated on