Skip to content

ValidateVec

Description

Validate whether a given Vec object is valid. Not foolproof but will work most of the time. Aborts if provided Vec is not valid.

Parameters

Name Direction Description
i in Pointer to Vec object to validate.

Success

Continue execution, meaning given Vec object is most probably a valid Vec.

Failure

abort

Usage example (Cross-references)

Usage examples (Cross-references)
            u64                     neighbor_i;
    
            ValidateVec(&slot->out_neighbors);
            ValidateVec(&slot->in_neighbors);
    
            ValidateVec(&slot->out_neighbors);
            ValidateVec(&slot->in_neighbors);
    
            if (graph_slot_is_occupied(slot)) {
    
    static inline size vec_aligned_size(GenericVec *v, size item_size) {
        ValidateVec(v);
        // Stack-init vecs (no allocator) keep element stride at
        // `sizeof(T)`: their backing buffer is a `_Alignas(T) char[]`,
    
    static inline size vec_aligned_offset_at(GenericVec *v, size idx, size item_size) {
        ValidateVec(v);
        return idx * vec_aligned_size(v, item_size);
    }
    
    static inline u8 *vec_ptr_at(GenericVec *v, size idx, size item_size) {
        ValidateVec(v);
    
        return (u8 *)v->data + vec_aligned_offset_at(v, idx, item_size);
    
    static inline const u8 *vec_const_ptr_at(const GenericVec *v, size idx, size item_size) {
        ValidateVec(v);
    
        return (const u8 *)v->data + vec_aligned_offset_at((GenericVec *)v, idx, item_size);
        size aligned_size;
    
        ValidateVec(vec);
    
        // Stack-init vecs have no allocator and own no heap storage:
        size aligned_size;
    
        ValidateVec(vec);
    
        aligned_size = vec_aligned_size(vec, item_size);
        size aligned_size;
    
        ValidateVec(vec);
    
        aligned_size = vec_aligned_size(vec, item_size);
    
    bool reserve_pow2_vec(GenericVec *vec, size item_size, size n) {
        ValidateVec(vec);
    
        if (n == 0) {
        size aligned_size;
    
        ValidateVec(vec);
    
        // Same rationale as `deinit_vec`: a stack-init vec has no
    
    bool clone_vec(GenericVec *dst, const GenericVec *src, size item_size) {
        ValidateVec(dst);
        ValidateVec(src);
    bool clone_vec(GenericVec *dst, const GenericVec *src, size item_size) {
        ValidateVec(dst);
        ValidateVec(src);
    
        if (src->length == 0) {
        }
    
        ValidateVec(vec);
    
        if (idx > vec->length) {
        }
    
        ValidateVec(vec);
    
        if (idx > vec->length) {
    
    void remove_range_vec(GenericVec *vec, void *removed_data, size item_size, size start, size count) {
        ValidateVec(vec);
    
        // `start + count` can wrap if both are huge -- a wrapped sum
    
    void fast_remove_range_vec(GenericVec *vec, void *removed_data, size item_size, size start, size count) {
        ValidateVec(vec);
    
        // `start + count` can wrap if both are huge -- a wrapped sum
    
    void vec_sort(GenericVec *vec, size item_size, GenericCompare comp) {
        ValidateVec(vec);
    
        if (vec_aligned_size(vec, item_size) != item_size) {
    
    void swap_vec(GenericVec *vec, size item_size, size idx1, size idx2) {
        ValidateVec(vec);
    
        if (idx1 >= vec->length || idx2 >= vec->length) {
    
    void reverse_vec(GenericVec *vec, size item_size) {
        ValidateVec(vec);
    
        size i = vec->length / 2;
    
    size find_idx_vec(GenericVec *vec, const void *item_data, size item_size, GenericCompare comp) {
        ValidateVec(vec);
    
        if (!item_data || !comp) {
    
    bool resize_vec(GenericVec *vec, size item_size, size new_size) {
        ValidateVec(vec);
    
        if (new_size <= vec->capacity) {
    
    void ValidateStr(const Str *s) {
        return ValidateVec(s);
    }
    
    void ValidateStrs(const Strs *vs) {
        ValidateVec(vs);
        VecForeachPtr(vs, sp) {
            ValidateStr(sp);
    
        // Validate both vectors
        ValidateVec(&s1);
        ValidateVec(&s2);
        // Validate both vectors
        ValidateVec(&s1);
        ValidateVec(&s2);
    
        // Check that the strings were merged correctly
    // Test ValidateVec macro
    bool test_vec_validate(void) {
        WriteFmt("Testing ValidateVec macro\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        // This should not abort
        ValidateVec(&vec);
    
        // Clean up
    /// TAGS: StrIter, Validate, API
    ///
    #define ValidateStrIters(siv) ValidateVec(siv)
    
    // ---------------------------------------------------------------------------
    #define VecForeachIdx(v, var, idx)                                                                                     \
        for (TYPE_OF(v) UNPL(pv) = (v); UNPL(pv); UNPL(pv) = NULL)                                                         \
            if ((ValidateVec(UNPL(pv)), 1) && UNPL(pv)->length > 0)                                                        \
                for (u64 idx = 0, UNPL(d) = 1; UNPL(d); UNPL(d)--)                                                         \
                    for (VEC_DATATYPE(UNPL(pv)) var = {0}; idx < UNPL(pv)->length && (var = VecAt(UNPL(pv), idx), 1); idx++)
    #define VecForeachReverseIdx(v, var, idx)                                                                              \
        for (TYPE_OF(v) UNPL(pv) = (v); UNPL(pv); UNPL(pv) = NULL)                                                         \
            if ((ValidateVec(UNPL(pv)), 1) && UNPL(pv)->length > 0)                                                        \
                for (u64 idx = UNPL(pv)->length; idx-- > 0 && idx < UNPL(pv)->length;)                                     \
                    for (u8 UNPL(run_once) = 1; UNPL(run_once); UNPL(run_once) = 0)                                        \
    #define VecForeachPtrIdx(v, var, idx)                                                                                  \
        for (TYPE_OF(v) UNPL(pv) = (v); UNPL(pv); UNPL(pv) = NULL)                                                         \
            if ((ValidateVec(UNPL(pv)), 1) && UNPL(pv)->length > 0)                                                        \
                for (u64 idx = 0, UNPL(d) = 1; UNPL(d); UNPL(d)--)                                                         \
                    for (VEC_DATATYPE(UNPL(pv)) *var = NULL; idx < UNPL(pv)->length && (var = VecPtrAt(UNPL(pv), idx), 1); \
    #define VecForeachPtrReverseIdx(v, var, idx)                                                                           \
        for (TYPE_OF(v) UNPL(pv) = (v); UNPL(pv); UNPL(pv) = NULL)                                                         \
            if ((ValidateVec(UNPL(pv)), 1) && UNPL(pv)->length > 0)                                                        \
                for (u64 idx = UNPL(pv)->length; idx-- > 0 && idx < UNPL(pv)->length;)                                     \
                    for (u8 UNPL(run_once) = 1; UNPL(run_once); UNPL(run_once) = 0)                                        \
    #define VecForeachInRangeIdx(v, var, idx, start, end)                                                                  \
        for (TYPE_OF(v) UNPL(pv) = (v); UNPL(pv); UNPL(pv) = NULL)                                                         \
            if ((ValidateVec(UNPL(pv)), 1) && UNPL(pv)->length > 0)                                                        \
                for (u64 UNPL(s) = (start), UNPL(e) = (end), idx = UNPL(s), UNPL(d) = 1;                                   \
                     UNPL(s) <= idx && idx < UNPL(e) && idx < UNPL(pv)->length && UNPL(s) <= UNPL(e);                      \
    #define VecForeachPtrInRangeIdx(v, var, idx, start, end)                                                               \
        for (TYPE_OF(v) UNPL(pv) = (v); UNPL(pv); UNPL(pv) = NULL)                                                         \
            if ((ValidateVec(UNPL(pv)), 1) && UNPL(pv)->length > 0)                                                        \
                for (u64 UNPL(s) = (start), UNPL(e) = (end), idx = UNPL(s), UNPL(d) = 1;                                   \
                     idx >= UNPL(s) && idx < UNPL(e) && idx < UNPL(pv)->length && UNPL(s) <= UNPL(e);                      \
    ///
    #define VecInsertL(v, lval, idx)                                                                                       \
        (ValidateVec(v),                                                                                                   \
         CHECK_TYPE_EQUIVALENCE(TYPE_OF(lval), VEC_DATATYPE(v)),                                                           \
         vec_insert_one_l(GENERIC_VEC(v), &LVAL_AS(VEC_DATATYPE(v), lval), &(lval), sizeof(VEC_DATATYPE(v)), (idx), true))
    ///
    #define VecInsertR(v, rval, idx)                                                                                       \
        (ValidateVec(v),                                                                                                   \
         CHECK_TYPE_CONVERTIBLE(VEC_DATATYPE(v), rval),                                                                    \
         vec_insert_one_r(GENERIC_VEC(v), &LVAL_AS(VEC_DATATYPE(v), rval), sizeof(VEC_DATATYPE(v)), (idx), true))
    ///
    #define VecInsertFastL(v, lval, idx)                                                                                   \
        (ValidateVec(v),                                                                                                   \
         CHECK_TYPE_EQUIVALENCE(TYPE_OF(lval), VEC_DATATYPE(v)),                                                           \
         vec_insert_one_l(                                                                                                 \
    ///
    #define VecInsertFastR(v, rval, idx)                                                                                   \
        (ValidateVec(v),                                                                                                   \
         CHECK_TYPE_CONVERTIBLE(VEC_DATATYPE(v), rval),                                                                    \
         vec_insert_one_r(GENERIC_VEC(v), &LVAL_AS(VEC_DATATYPE(v), rval), sizeof(VEC_DATATYPE(v)), (idx), false))
    ///
    #define VecInsertRangeL(v, varr, idx, count)                                                                           \
        (ValidateVec(v),                                                                                                   \
         CHECK_TYPE_EQUIVALENCE(TYPE_OF(*(varr)), VEC_DATATYPE(v)),                                                        \
         vec_insert_range_l(GENERIC_VEC(v), (void *)(varr), sizeof(VEC_DATATYPE(v)), (idx), (count), true))
    ///
    #define VecInsertRangeR(v, varr, idx, count)                                                                           \
        (ValidateVec(v),                                                                                                   \
         CHECK_TYPE_CONVERTIBLE(const VEC_DATATYPE(v) *, varr),                                                            \
         vec_insert_range_r(GENERIC_VEC(v), (const void *)(varr), sizeof(VEC_DATATYPE(v)), (idx), (count), true))
    ///
    #define VecInsertRangeFastL(v, varr, idx, count)                                                                       \
        (ValidateVec(v),                                                                                                   \
         CHECK_TYPE_EQUIVALENCE(TYPE_OF(*(varr)), VEC_DATATYPE(v)),                                                        \
         vec_insert_range_l(GENERIC_VEC(v), (void *)(varr), sizeof(VEC_DATATYPE(v)), (idx), (count), false))
    ///
    #define VecInsertRangeFastR(v, varr, idx, count)                                                                       \
        (ValidateVec(v),                                                                                                   \
         CHECK_TYPE_CONVERTIBLE(const VEC_DATATYPE(v) *, varr),                                                            \
         vec_insert_range_r(GENERIC_VEC(v), (const void *)(varr), sizeof(VEC_DATATYPE(v)), (idx), (count), false))
    ///
    #define VecMergeL(v, v2)                                                                                               \
        (ValidateVec(v), ValidateVec(v2), vec_merge_l(GENERIC_VEC(v), GENERIC_VEC(v2), sizeof(VEC_DATATYPE(v))))
    
    ///
    ///
    #define VecMergeR(v, v2)                                                                                               \
        (ValidateVec(v), ValidateVec(v2), vec_merge_r(GENERIC_VEC(v), GENERIC_VEC(v2), sizeof(VEC_DATATYPE(v))))
    
    ///
    ///
    #define VecInitClone(vd, vs)                                                                                           \
        (ValidateVec(vd),                                                                                                  \
         ValidateVec(vs),                                                                                                  \
         VecDeinit(vd),                                                                                                    \
    #define VecInitClone(vd, vs)                                                                                           \
        (ValidateVec(vd),                                                                                                  \
         ValidateVec(vs),                                                                                                  \
         VecDeinit(vd),                                                                                                    \
         *(vd) = (TYPE_OF(*(vd))) {.length      = 0,                                                                       \
Last updated on