Skip to content

ValidateList

Description

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

Parameters

Name Direction Description
l in Pointer to List object to validate.

Success

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

Failure

abort with an error message.

Usage example (Cross-references)

Usage examples (Cross-references)
        }
    
        ValidateList(list);
    
        clear_list(list, item_size);
        }
    
        ValidateList(list);
    
        if (idx > list->length) {
        }
    
        ValidateList(list);
    
        if (count == 0) {
        }
    
        ValidateList(list);
    
        if (list->length < 2) {
        }
    
        ValidateList(list);
    
        GenericListNode *n1 = node_at_list(list, item_size, idx1);
        }
    
        ValidateList(list);
    
        u64 i = list->length / 2;
        }
    
        ValidateList(list);
    
        if (!count) {
        }
    
        ValidateList(list1);
        ValidateList(list2);
    
        ValidateList(list1);
        ValidateList(list2);
    
        if (list1 == list2) {
        }
    
        ValidateList(list);
    
        remove_range_list(list, NULL, item_size, 0, list->length);
        }
    
        ValidateList(list);
    
        if (idx >= list->length) {
        }
    
        ValidateList(list);
    
        if (idx >= list->length) {
        }
    
        ValidateList(list);
    
        GenericListNode *node = list->head;
        }
    
        ValidateList(list);
    
        u64 abs_target_idx = nidx + ridx;
        }
    
        ValidateList(list);
    
        if (target_idx >= list->length) {
        IntList list_d = ListInitWithDeepCopyT(list_d, tracked_copy_init, tracked_copy_deinit, &alloc);
    
        ValidateList(&list_a);
        ValidateList(&list_b);
        ValidateList(&list_c);
    
        ValidateList(&list_a);
        ValidateList(&list_b);
        ValidateList(&list_c);
        ValidateList(&list_d);
        ValidateList(&list_a);
        ValidateList(&list_b);
        ValidateList(&list_c);
        ValidateList(&list_d);
        ValidateList(&list_b);
        ValidateList(&list_c);
        ValidateList(&list_d);
    
        bool result = (ListCopyInit(&list_a) == NULL) && (ListCopyDeinit(&list_a) == NULL) && (ListLen(&list_a) == 0);
        IntList list_d = ListInitWithDeepCopyT(list_d, tracked_copy_init, tracked_copy_deinit, &alloc);
    
        ValidateList(&list_a);
        ValidateList(&list_b);
        ValidateList(&list_c);
    
        ValidateList(&list_a);
        ValidateList(&list_b);
        ValidateList(&list_c);
        ValidateList(&list_d);
        ValidateList(&list_a);
        ValidateList(&list_b);
        ValidateList(&list_c);
        ValidateList(&list_d);
        ValidateList(&list_b);
        ValidateList(&list_c);
        ValidateList(&list_d);
    
        bool result = (ListAllocator(&list_a)->retry_limit == 23) && (ListAllocator(&list_b)->retry_limit == 23);
    
    static bool test_validate_corrupt_empty_list_fails(void) {
        WriteFmt("Testing ValidateList on corrupt empty list\n");
    
        List(int) list = ListInit(get_test_alloc());
        list.head = (void *)1;
        MAGIC_MARK_DIRTY(&list);
        ValidateList(&list);
    
        return false;
    
    static bool test_validate_null_list_fails(void) {
        WriteFmt("Testing ValidateList on NULL list\n");
    
        ValidateList(NULL);
        WriteFmt("Testing ValidateList on NULL list\n");
    
        ValidateList(NULL);
        return false;
    }
    
    static bool test_validate_invalid_magic_fails(void) {
        WriteFmt("Testing ValidateList on invalid magic\n");
    
        List(int) list = ListInit(get_test_alloc());
        // uninitialised-handle path.
        list.__magic = 0;
        ValidateList(&list);
    
        return false;
    
    static bool test_validate_corrupt_nonempty_list_fails(void) {
        WriteFmt("Testing ValidateList on corrupt non-empty list\n");
    
        GenericListNode node = {0};
        g->tail   = NULL;
        MAGIC_MARK_DIRTY(&list);
        ValidateList(&list);
    
        return false;
    
    static bool test_validate_nonempty_head_null_fails(void) {
        WriteFmt("Testing ValidateList on non-empty NULL head\n");
    
        int             value = 1;
        g->length = 1;
        MAGIC_MARK_DIRTY(&list);
        ValidateList(&list);
    
        return false;
    
    static bool test_validate_head_prev_fails(void) {
        WriteFmt("Testing ValidateList on head prev corruption\n");
    
        int             value = 1;
        g->length = 1;
        MAGIC_MARK_DIRTY(&list);
        ValidateList(&list);
    
        return false;
    
    static bool test_validate_tail_next_fails(void) {
        WriteFmt("Testing ValidateList on tail next corruption\n");
    
        int             value = 1;
        g->length = 1;
        MAGIC_MARK_DIRTY(&list);
        ValidateList(&list);
    
        return false;
        IntList list = ListInit(&alloc);
    
        ValidateList(&list);
    
        // intentional bypass: __magic is the private sentinel ValidateList
    #define ListForeach(l, var)                                                                                                      \
        for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL)                                                                   \
            if ((ValidateList(UNPL(pl)), 1) && (UNPL(pl)->head))                                                                     \
                for (GenericListNode * UNPL(node) = (GenericListNode *)ListNodeBegin(UNPL(pl)); UNPL(node);                          \
                     UNPL(node)                   = ListNodeNext(UNPL(node)))                                                        \
    #define ListForeachPtr(l, var)                                                                                                 \
        for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL)                                                                 \
            if ((ValidateList(UNPL(pl)), 1) && (UNPL(pl)->head))                                                                   \
                for (GenericListNode * UNPL(node) = (GenericListNode *)ListNodeBegin(UNPL(pl)); UNPL(node);                        \
                     UNPL(node)                   = ListNodeNext(UNPL(node)))                                                      \
    #define ListForeachReverse(l, var)                                                                                               \
        for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL)                                                                   \
            if ((ValidateList(UNPL(pl)), 1) && (UNPL(pl)->tail))                                                                     \
                for (GenericListNode * UNPL(node) = (GenericListNode *)ListNodeEnd(UNPL(pl)); UNPL(node);                            \
                     UNPL(node)                   = ListNodePrev(UNPL(node)))                                                        \
    #define ListForeachPtrReverse(l, var)                                                                                          \
        for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL)                                                                 \
            if ((ValidateList(UNPL(pl)), 1) && (UNPL(pl)->tail))                                                                   \
                for (GenericListNode * UNPL(node) = (GenericListNode *)ListNodeEnd(UNPL(pl)); UNPL(node);                          \
                     UNPL(node)                   = ListNodePrev(UNPL(node)))                                                      \
    #define ListForeachInRange(l, var, start, end)                                                                                           \
        for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL)                                                                           \
            if ((ValidateList(UNPL(pl)), 1) && UNPL(pl)->head)                                                                               \
                for (GenericListNode * UNPL(node) = (GenericListNode *)ListNodeBegin(UNPL(pl)); UNPL(node);                                  \
                     UNPL(node)                   = ListNodeNext(UNPL(node)))                                                                \
    #define ListForeachPtrInRange(l, var, start, end)                                                                                        \
        for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL)                                                                           \
            if ((ValidateList(UNPL(pl)), 1) && UNPL(pl)->head)                                                                               \
                for (GenericListNode * UNPL(node) = (GenericListNode *)ListNodeBegin(UNPL(pl)); UNPL(node);                                  \
                     UNPL(node)                   = ListNodeNext(UNPL(node)))                                                                \
    #define ListForeachReverseInRange(l, var, start, end)                                                                                    \
        for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL)                                                                           \
            if ((ValidateList(UNPL(pl)), 1) && UNPL(pl)->tail)                                                                               \
                for (GenericListNode * UNPL(node) = (GenericListNode *)ListNodeEnd(UNPL(pl)); UNPL(node);                                    \
                     UNPL(node)                   = ListNodePrev(UNPL(node)))                                                                \
    #define ListForeachPtrReverseInRange(l, var, start, end)                                                                                 \
        for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL)                                                                           \
            if ((ValidateList(UNPL(pl)), 1) && UNPL(pl)->tail)                                                                               \
                for (GenericListNode * UNPL(node) = (GenericListNode *)ListNodeEnd(UNPL(pl)); UNPL(node);                                    \
                     UNPL(node)                   = ListNodePrev(UNPL(node)))                                                                \
    #define ListForeachIdx(l, var, idx)                                                                                      \
        for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL)                                                           \
            if ((ValidateList(UNPL(pl)), 1) && UNPL(pl)->head)                                                               \
                for (GenericListNode * UNPL(cursor) = NULL, *UNPL(node) = NULL; UNPL(pl); UNPL(pl) = NULL)                 \
                    for (u64 idx = 0, UNPL(cursor_idx) = 0, UNPL(resolved_idx) = 0; idx < UNPL(pl)->length;                \
    #define ListForeachPtrIdx(l, var, idx)                                                                                   \
        for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL)                                                           \
            if ((ValidateList(UNPL(pl)), 1) && UNPL(pl)->head)                                                               \
                for (GenericListNode * UNPL(cursor) = NULL, *UNPL(node) = NULL; UNPL(pl); UNPL(pl) = NULL)                 \
                    for (u64 idx = 0, UNPL(cursor_idx) = 0, UNPL(resolved_idx) = 0; idx < UNPL(pl)->length;                \
    #define ListForeachReverseIdx(l, var, idx)                                                                               \
        for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL)                                                           \
            if ((ValidateList(UNPL(pl)), 1) && UNPL(pl)->tail && UNPL(pl)->length > 0)                                      \
                for (GenericListNode * UNPL(cursor) = NULL, *UNPL(node) = NULL; UNPL(pl); UNPL(pl) = NULL)                 \
                    for (u64 idx = UNPL(pl)->length - 1, UNPL(cursor_idx) = 0, UNPL(resolved_idx) = 0;                     \
    #define ListForeachPtrReverseIdx(l, var, idx)                                                                            \
        for (TYPE_OF(l) UNPL(pl) = (l); UNPL(pl); UNPL(pl) = NULL)                                                           \
            if ((ValidateList(UNPL(pl)), 1) && UNPL(pl)->tail && UNPL(pl)->length > 0)                                      \
                for (GenericListNode * UNPL(cursor) = NULL, *UNPL(node) = NULL; UNPL(pl); UNPL(pl) = NULL)                 \
                    for (u64 idx = UNPL(pl)->length - 1, UNPL(cursor_idx) = 0, UNPL(resolved_idx) = 0;                     \
    ///
    #define ListInsertL(l, lval, idx)                                                                                      \
        (ValidateList(l),                                                                                                  \
         CHECK_TYPE_EQUIVALENCE(TYPE_OF(lval), LIST_DATA_TYPE(l)),                                                         \
         list_insert_one_l(GENERIC_LIST(l), &LVAL_AS(LIST_DATA_TYPE(l), lval), &(lval), sizeof(LIST_DATA_TYPE(l)), (idx)))
    ///
    #define ListInsertR(l, rval, idx)                                                                                      \
        (ValidateList(l),                                                                                                  \
         CHECK_TYPE_CONVERTIBLE(LIST_DATA_TYPE(l), rval),                                                                  \
         list_insert_one_r(GENERIC_LIST(l), &LVAL_AS(LIST_DATA_TYPE(l), rval), sizeof(LIST_DATA_TYPE(l)), (idx)))
    ///
    #define ListPushArrL(l, arr, count)                                                                                    \
        (ValidateList(l),                                                                                                  \
         CHECK_TYPE_EQUIVALENCE(TYPE_OF(*(arr)), LIST_DATA_TYPE(l)),                                                       \
         list_insert_range_l(GENERIC_LIST(l), (void *)(arr), sizeof(LIST_DATA_TYPE(l)), (count)))
    ///
    #define ListPushArrR(l, arr, count)                                                                                    \
        (ValidateList(l),                                                                                                  \
         CHECK_TYPE_CONVERTIBLE(const LIST_DATA_TYPE(l) *, arr),                                                           \
         list_insert_range_r(GENERIC_LIST(l), (const void *)(arr), sizeof(LIST_DATA_TYPE(l)), (count)))
    ///
    #define ListMergeL(l, l2)                                                                                              \
        (ValidateList(l),                                                                                                  \
         ValidateList(l2),                                                                                                 \
         CHECK_TYPE_EQUIVALENCE(LIST_DATA_TYPE(l2), LIST_DATA_TYPE(l)),                                                    \
    #define ListMergeL(l, l2)                                                                                              \
        (ValidateList(l),                                                                                                  \
         ValidateList(l2),                                                                                                 \
         CHECK_TYPE_EQUIVALENCE(LIST_DATA_TYPE(l2), LIST_DATA_TYPE(l)),                                                    \
         list_merge_l(GENERIC_LIST(l), GENERIC_LIST(l2), sizeof(LIST_DATA_TYPE(l))))
    ///
    #define ListMergeR(l, l2)                                                                                              \
        (ValidateList(l),                                                                                                  \
         ValidateList(l2),                                                                                                 \
         CHECK_TYPE_EQUIVALENCE(LIST_DATA_TYPE(l2), LIST_DATA_TYPE(l)),                                                    \
    #define ListMergeR(l, l2)                                                                                              \
        (ValidateList(l),                                                                                                  \
         ValidateList(l2),                                                                                                 \
         CHECK_TYPE_EQUIVALENCE(LIST_DATA_TYPE(l2), LIST_DATA_TYPE(l)),                                                    \
         list_merge_r(GENERIC_LIST(l), GENERIC_LIST(l2), sizeof(LIST_DATA_TYPE(l))))
Last updated on