Skip to content

IterPeekAt

Description

Propagating peek at signed offset n along the iteration direction from the current position. n is scaled by dir so a peek of n targets the element a move of n would land on – n > 0 looks ahead in iteration order, n < 0 looks behind, for both forward and reverse iters. Does not advance the iterator. Writes the element at pos + dir * n to *out.

Success

*out is set, returns true.

Failure

pos + dir * n is outside [0, length). *out is not written, returns false.

Usage example (Cross-references)

Usage examples (Cross-references)
    /// TAGS: StrIter, Peek, Alias
    ///
    #define StrIterPeek(mi, out) IterPeekAt((mi), 0, (out))
    
    ///
    /// TAGS: StrIter, Peek, Offset, Alias
    ///
    #define StrIterPeekAt(mi, n, out) IterPeekAt((mi), (n), (out))
    
    ///
    /// TAGS: StrIter, Peek, Next
    ///
    #define StrIterPeekNext(mi, out) IterPeekAt((mi), 1, (out))
    
    ///
    /// TAGS: StrIter, Peek, Prev
    ///
    #define StrIterPeekPrev(mi, out) IterPeekAt((mi), -1, (out))
    
    #endif // MISRA_STD_UTILITY_STR_ITER_H
    #define IterMustPeekAt(mi, n, out)                                                                                     \
        do {                                                                                                               \
            if (!IterPeekAt((mi), (n), (out))) {                                                                           \
                LOG_FATAL("IterMustPeekAt: offset out of range");                                                          \
            }                                                                                                              \
        IterMove(&it, 2);
        u8 v;
        if (!IterPeekAt(&it, 0, &v) || v != 7) {
            return false;
        }
            return false;
        }
        if (!IterPeekAt(&it, 1, &v) || v != 8) {
            return false;
        }
            return false;
        }
        if (!IterPeekAt(&it, -2, &v) || v != 5) {
            return false;
        }
        BufIter  it     = BufIterFromMemory(buf, 2);
        u8       v      = 0xAA;
        if (IterPeekAt(&it, 2, &v)) {
            return false;
        }
            return false;
        }
        if (IterPeekAt(&it, -1, &v)) {
            return false;
        }
        u8 v = 0;
        // cur == -1, dir == -1, n == -1 -> target -1 + (-1)*(-1) = index 0 (value 10).
        if (!IterPeekAt(&it, -1, &v) || v != 10) {
            return false;
        }
        }
        // cur == -1, dir == -1, n == -3 -> target -1 + (-1)*(-3) = index 2 (value 30).
        return IterPeekAt(&it, -3, &v) && v == 30;
    }
        u8 v = 0;
        // cur == 2, n == 0 -> index 2 (value 30).
        if (!IterPeekAt(&it, 0, &v) || v != 30) {
            return false;
        }
        }
        // cur == 2, dir == -1, n == 2 -> target 2 + (-1)*2 = index 0 (value 10).
        return IterPeekAt(&it, 2, &v) && v == 10;
    }
Last updated on