Skip to content

ValidateVec

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)
    
    void ValidateStr(const Str *s) {
        return ValidateVec(s);
    }
    
    void ValidateStrs(const Strs *vs) {
        ValidateVec(vs);
        VecForeachPtr(vs, sp) {
            ValidateStr(sp);
    
    static inline size vec_aligned_size(GenericVec *v, size item_size) {
        ValidateVec(v);
    
        if (!v->alignment) {
    
    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 char *vec_ptr_at(GenericVec *v, size idx, size item_size) {
        ValidateVec(v);
    
        return v->data + vec_aligned_offset_at(v, idx, item_size);
    
    void deinit_vec(GenericVec *vec, size item_size) {
        ValidateVec(vec);
    
        if (vec->data) {
    
    void clear_vec(GenericVec *vec, size item_size) {
        ValidateVec(vec);
    
        if (vec->data) {
    // Reserve new space if n > capacity
    void reserve_vec(GenericVec *vec, size item_size, size n) {
        ValidateVec(vec);
    
        if (n > vec->capacity) {
    
    void reserve_pow2_vec(GenericVec *vec, size item_size, size n) {
        ValidateVec(vec);
    
        size n2 = 1;
    
    void reduce_space_vec(GenericVec *vec, size item_size) {
        ValidateVec(vec);
    
        if (vec->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);
    
        if (start + count > vec->length) {
    
    void fast_remove_range_vec(GenericVec *vec, void *removed_data, size item_size, size start, size count) {
        ValidateVec(vec);
    
        if (start + count > vec->length) {
    
    void qsort_vec(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;
    
    void resize_vec(GenericVec *vec, size item_size, size new_size) {
        ValidateVec(vec);
    
        if (new_size <= vec->capacity) {
    
        // 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");
    
        // Create a valid vector
    
        // This should not abort
        ValidateVec(&vec);
    
        // Clean up
    #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)                                                                                       \
        do {                                                                                                               \
            ValidateVec(v);                                                                                                \
            VEC_DATATYPE(v) *__ptr__val_##__LINE__ = &(lval);                                                              \
            VEC_DATATYPE(v) __tmp__val_##__LINE__  = (lval);                                                               \
    #define VecInsertR(v, rval, idx)                                                                                       \
        do {                                                                                                               \
            ValidateVec(v);                                                                                                \
            VEC_DATATYPE(v) __tmp__val_##__LINE__ = (rval);                                                                \
            insert_range_into_vec(GENERIC_VEC(v), (char *)&__tmp__val_##__LINE__, sizeof(VEC_DATATYPE(v)), (idx), 1);      \
    #define VecInsertFastL(v, val, idx)                                                                                    \
        do {                                                                                                               \
            ValidateVec(v);                                                                                                \
            VEC_DATATYPE(v) *__ptr_val_##__LINE__ = &(val);                                                                \
            {                                                                                                              \
    #define VecInsertFastR(v, val, idx)                                                                                    \
        do {                                                                                                               \
            ValidateVec(v);                                                                                                \
            VEC_DATATYPE(v) *__ptr_val_##__LINE__ = &(val);                                                                \
            {                                                                                                              \
    #define VecInsertRangeL(v, varr, idx, count)                                                                           \
        do {                                                                                                               \
            ValidateVec(v);                                                                                                \
            {                                                                                                              \
                if (varr == NULL) {                                                                                        \
    #define VecInsertRangeR(v, varr, idx, count)                                                                           \
        do {                                                                                                               \
            ValidateVec(v);                                                                                                \
            {                                                                                                              \
                if (varr == NULL) {                                                                                        \
    #define VecInsertRangeFastL(v, varr, idx, count)                                                                       \
        do {                                                                                                               \
            ValidateVec(v);                                                                                                \
            {                                                                                                              \
                if (varr == NULL) {                                                                                        \
    #define VecInsertRangeFastR(v, varr, idx, count)                                                                       \
        do {                                                                                                               \
            ValidateVec(v);                                                                                                \
            {                                                                                                              \
                if (varr == NULL) {                                                                                        \
    /// FAILURE : `abort`
    ///
    #define ValidateStrIters(siv) ValidateVec(siv);
    
    ///
Last updated on