Skip to content
VecInsertRangeR

VecInsertRangeR

Description

Insert a contiguous range of elements at the given index, preserving order. R-value form: the source range is treated as read-only input and is not zeroed.

Parameters

Name Direction Description
v in,out Vector handle.
varr in Pointer to the source array. Must be non-NULL when count > 0.
idx in Position in [0, length].
count in Number of elements to insert.

Success

Returns true. The vector length grows by count; copies of the source elements now occupy indices [idx, idx + count); previous elements at and after idx have shifted right by count. The source range is untouched.

Failure

Returns false on allocation failure. The vector is unchanged.

Usage example (Cross-references)

Usage examples (Cross-references)
    /// TAGS: Vec, PushBack, Range, RValue
    ///
    #define VecPushBackArrR(v, arr, count) VecInsertRangeR((v), (arr), (v)->length, (count))
    
    ///
    /// TAGS: Vec, PushFront, Range, RValue
    ///
    #define VecPushFrontArrR(v, arr, count) VecInsertRangeR((v), (arr), 0, (count))
    
    ///
    #define VecMustInsertRangeR(v, varr, idx, count)                                                                       \
        do {                                                                                                               \
            if (!VecInsertRangeR((v), (varr), (idx), (count))) {                                                           \
                LOG_FATAL("VecMustInsertRangeR failed");                                                                   \
            }                                                                                                              \
    #define StrInsertMany(...) OVERLOAD(StrInsertMany, __VA_ARGS__)
    #define StrInsertMany_3(str, zstr, idx)                                                                            \
        _Generic((zstr), Zstr: VecInsertRangeR((str), (Zstr)(zstr), (idx), ZstrLen((Zstr)(zstr))), char *: VecInsertRangeR((str), (Zstr)(zstr), (idx), ZstrLen((Zstr)(zstr))))
    #define StrInsertMany_4(str, cstr, cstr_len, idx)                                                                  \
        _Generic((cstr), Zstr: VecInsertRangeR((str), (Zstr)(cstr), (idx), (cstr_len)), char *: VecInsertRangeR((str), (Zstr)(cstr), (idx), (cstr_len)))
        _Generic((zstr), Zstr: VecInsertRangeR((str), (Zstr)(zstr), (idx), ZstrLen((Zstr)(zstr))), char *: VecInsertRangeR((str), (Zstr)(zstr), (idx), ZstrLen((Zstr)(zstr))))
    #define StrInsertMany_4(str, cstr, cstr_len, idx)                                                                  \
        _Generic((cstr), Zstr: VecInsertRangeR((str), (Zstr)(cstr), (idx), (cstr_len)), char *: VecInsertRangeR((str), (Zstr)(cstr), (idx), (cstr_len)))
    
    ///
    /// TAGS: Str, Insert, Range, RValue
    ///
    #define StrInsertRangeR(str, varr, idx, count) VecInsertRangeR((str), (varr), (idx), (count))
    
    ///
                        values[i] = (i32)extract_u32(data, offset, data_size);
                    }
                    VecInsertRangeR(vec, values, idx, count);
                }
                break;
        // Push an array at a specific index
        int values[] = {30, 40, 50};
        VecInsertRangeR(&vec, values, 1, 3);
    
        // Check length
    
        // Insert range in the middle
        VecInsertRangeR(&vec, VecBegin(&src), 1, VecLen(&src));
    
        // Check length
        for (size i = 0; i < n; i++) {
            TrackItem it = {tags[i], NULL};
            VecInsertRangeR(&v, &it, VecLen(&v), 1);
        }
        return v;
        u64    one = 1;
    
        bool ret = VecInsertRangeR(&vec, &one, 0, (size)-1);
    
        bool result = (ret == false) && (VecLen(&vec) == 0);
    
        u64  newv = 99;
        bool ret  = VecInsertRangeR(&vec, &newv, 0, 1);
    
        bool result = ret && (VecLen(&vec) == 4) && (VecAt(&vec, 0) == 99) && (VecAt(&vec, 1) == 10) &&
    
        u64  newv = 77;
        bool ret  = VecInsertRangeR(&vec, &newv, 0, 1);
    
        // The original at index 0 (11) must survive at index 1 after the insert.
        for (size i = 0; i < N; i++) {
            u64 v = (u64)i;
            VecInsertRangeR(&vec, &v, VecLen(&vec), 1);
        }
    
        u64  newv = 999999;
        bool ret  = VecInsertRangeR(&vec, &newv, N - 1, 1); // insert just before the last element
    
        bool result = ret && (VecLen(&vec) == N + 1) && (VecAt(&vec, 0) == 0) && (VecAt(&vec, N - 2) == (u64)(N - 2)) &&
        reset_tracking(0);
        TrackItem it  = {100, NULL};
        bool      ret = VecInsertRangeR(&vec, &it, 0, 1);
    
        bool result = (ret == false) && (ti_deinit_count == 0) && (VecLen(&vec) == 3);
            {102, NULL}
        };
        bool ret = VecInsertRangeR(&vec, items, VecLen(&vec), 3);
    
        bool result = (ret == false) && (ti_deinit_count == 2) && (VecLen(&vec) == 3);
            {101, NULL}
        };
        bool ret = VecInsertRangeR(&vec, items, VecLen(&vec), 2);
    
        bool result = (ret == false) && (ti_deinit_count == 1) && (VecLen(&vec) == 3);
            {101, NULL}
        };
        bool ret = VecInsertRangeR(&vec, items, VecLen(&vec), 2);
    
        bool result = (ret == false) && (ti_deinit_count == 1) && (g_deinit_saw_zero == false) && (VecLen(&vec) == 3);
            {102, NULL}
        };
        bool ret = VecInsertRangeR(&vec, items, VecLen(&vec), 3);
    
        bool result = (ret == false) && (ti_deinit_count == 2) && (VecLen(&vec) == 3);
            {102, NULL}
        };
        bool ret = VecInsertRangeR(&vec, items, 1, 3);
    
        bool result = (ret == false) && (ti_deinit_count == 2) && deinit_tags_contain(100) && deinit_tags_contain(101) &&
            {101, NULL}
        };
        bool ret = VecInsertRangeR(&vec, items, VecLen(&vec), 2);
    
        bool result = (ret == false) && (ti_deinit_count == 1) && (VecLen(&vec) == 3);
        reset_tracking(0);
        TrackItem it  = {100, NULL};
        bool      ret = VecInsertRangeR(&vec, &it, 1, 1);
    
        bool result = (ret == false) && (VecLen(&vec) == 3) && (VecAt(&vec, 0).tag == 1) && (VecAt(&vec, 1).tag == 2) &&
        reset_tracking(0);
        TrackItem it  = {100, NULL};
        bool      ret = VecInsertRangeR(&vec, &it, 1, 1);
    
        bool result = (ret == false) && (VecLen(&vec) == 3) && (VecAt(&vec, 0).tag == 1) && (VecAt(&vec, 1).tag == 2) &&
        for (size i = 0; i < N; i++) {
            TrackItem it = {(int)(i + 1), NULL};
            VecInsertRangeR(&vec, &it, VecLen(&vec), 1);
        }
        reset_tracking(0);
        TrackItem it  = {-100, NULL};
        bool      ret = VecInsertRangeR(&vec, &it, N - 1, 1);
    
        bool result = (ret == false) && (VecLen(&vec) == N) && (VecAt(&vec, 0).tag == 1) &&
        reset_tracking(0);
        TrackItem it  = {100, NULL};
        bool      ret = VecInsertRangeR(&vec, &it, 1, 1);
    
        bool result = (ret == false) && (VecLen(&vec) == 3) && (VecAt(&vec, 0).tag == 1) && (VecAt(&vec, 1).tag == 2) &&
        g_fail_at    = 1;
        Elem add[2]  = {{.value = 1000}, {.value = 2000}};
        bool ok      = VecInsertRangeR(&vec, add, 1, 2);
    
        bool result = (ok == false) && (VecLen(&vec) == length_before);
Last updated on