Skip to content

ListAt

Description

Data in node at given index in given list This is a more expensive call. Fetches pointer to data twice and then dereferences. Better use ListPtrAt instead.

Parameters

Name Direction Description
l in List to get data from.
idx in Index to get data at.

Success

Data from node in list at given index.

Failure

Empty object.

Usage example (Cross-references)

Usage examples (Cross-references)
                uint16_t idx = extract_u16(data, offset, data_size);
                if (idx < ListLen(list)) {
                    volatile i32 value = ListAt(list, idx);
                    (void)value; // Prevent optimization
                }
    
        bool result = (g_copy_init_count == 2);
        result      = result && (ListAt(&list, 0) == 1007);
        result      = result && (ListAt(&list, 1) == 1009);
        bool result = (g_copy_init_count == 2);
        result      = result && (ListAt(&list, 0) == 1007);
        result      = result && (ListAt(&list, 1) == 1009);
    
        ListDeinit(&list);
        bool result = ListPtrAt(&list, 0) && (*ListPtrAt(&list, 0) == 10);
        result      = result && ListPtrAt(&list, 3) && (*ListPtrAt(&list, 3) == 40);
        result      = result && (ListAt(&list, 1) == 20);
        result      = result && (ListAt(&list, 2) == 30);
        result      = result && (ListFirst(&list) == 10);
        result      = result && ListPtrAt(&list, 3) && (*ListPtrAt(&list, 3) == 40);
        result      = result && (ListAt(&list, 1) == 20);
        result      = result && (ListAt(&list, 2) == 30);
        result      = result && (ListFirst(&list) == 10);
        result      = result && (ListLast(&list) == 40);
    
    static bool test_list_at_out_of_bounds_fails(void) {
        WriteFmt("Testing ListAt out of bounds\n");
    
        List(int) list = ListInit(get_test_alloc());
        List(int) list = ListInit(get_test_alloc());
        ListPushBackR(&list, 10);
        (void)ListAt(&list, 1);
    
        return false;
    
    #ifdef __cplusplus
    #    define ListAt(l, idx) (ListPtrAt((l), (idx)) ? *ListPtrAt((l), (idx)) : (LIST_DATA_TYPE(l) {0}))
    #else
    ///
    /// TAGS: List, First, Access
    ///
    #define ListFirst(l) ListAt((l), 0)
    
    ///
    /// TAGS: List, Last, Access
    ///
    #define ListLast(l) ListAt((l), (l)->length - 1)
    
    ///
Last updated on