VecForeachReverseIdx

Table of Contents

VecForeachReverseIdx

Description

Iterate over each element var of given vector v at each index idx into the vector. The variables var and idx declared and defined by this macro. idx will start from v->length - 1 and will go till 0

Parameters

NameDirectionDescription
vin,outVector to iterate over.
varinName of variable to be used which’ll contain value at iterated index idx
idxinName of variable to be used for iterating over indices.

Usage example (Cross-references)

    // Test VecForeachReverseIdx macro
    bool test_vec_foreach_reverse_idx(void) {
    WriteFmt("Testing VecForeachReverseIdx\n");
    
    // Create a vector of integers
    // Use VecForeachReverseIdx to verify indices are correct in reverse
    bool result = true;
    VecForeachReverseIdx(&vec, item, idx) {
    result = result && (item == values[idx]);
    result = result && (VecAt(&vec, idx) == item);
    // Make idx go out of bounds in VecForeachReverseIdx by modifying vector during iteration
    bool test_vec_foreach_reverse_idx_out_of_bounds_access(void) {
    WriteFmt("Testing VecForeachReverseIdx where idx goes out of bounds (should crash)\n");
    
    typedef Vec(int) IntVec;
    
    // VecForeachReverseIdx has explicit bounds checking: if ((idx) >= (v)->length) LOG_FATAL(...)
    VecForeachReverseIdx(&vec, val, idx) {
    WriteFmt("Accessing idx {} (vec.length={}): {}\n", idx, vec.length, val);
    /// TAGS: Foreach, Vec, Iteration, Loop, Reverse
    ///
    #define VecForeachReverse(v, var) VecForeachReverseIdx((v), (var), UNPL(iter))
    
    ///
    /// idx[in]     : Name of the variable to be used for iterating over indices (i64).
    ///
    #define StrForeachReverseIdx(str, chr, idx) VecForeachReverseIdx((str), (chr), idx)
    
    ///
    if (VecLen(vec) > 0) {
    int sum = 0;
    VecForeachReverseIdx(vec, item, idx) {
    sum += item + (int)idx;
    }
    if (VecLen(vec) > 0) {
    size_t total_len = 0;
    VecForeachReverseIdx(vec, str, idx) {
    total_len += ZstrLen(str.data) + idx;
    }
    if (VecLen(vec) > 0) {
    size_t total_len = 0;
    VecForeachReverseIdx(vec, str, idx) {
    total_len += strlen(str) + idx;
    }

Share :

Related Posts

VecInitAlignedT

VecInitAlignedT Description Initialize given vector with given alignment. It is mandatory to initialize vectors before use. Not doing so is undefined behaviour. Provided alignment is used to keep all objects at an aligned memory location, avoiding UB in some cases. It’s recommended to use aligned vector when dealing with structs containing unions.

Read More

VecInitWithDeepCopyT

VecInitWithDeepCopyT Description Initialize given vector. Default alignment is 1 It is mandatory to initialize vectors before use. Not doing so is undefined behaviour.

Read More

VecInitWithDeepCopy

VecInitWithDeepCopy Description Initialize vector. Default alignment is 1 It is mandatory to initialize vectors before use. Not doing so is undefined behaviour.

Read More