Skip to content
ListNodeRelative

ListNodeRelative

Description

Get the list node at signed offset ridx from base_node. Positive ridx walks forward through next pointers; negative walks backward through prev pointers. ridx == 0 returns base_node.

Parameters

Name Direction Description
base_node in Anchor node.
ridx in Signed relative offset.

Success

Returns the node at offset ridx.

Failure

Returns NULL when the offset walks past either end of the list.

Usage example (Cross-references)

Usage examples (Cross-references)
    
    static bool test_list_node_relative_null_fails(void) {
        WriteFmt("Testing ListNodeRelative with NULL node\n");
    
        ListNodeRelative(NULL, 1);
        WriteFmt("Testing ListNodeRelative with NULL node\n");
    
        ListNodeRelative(NULL, 1);
        return false;
    }
        GenericListNode *begin   = GENERIC_LIST_NODE(ListNodeBegin(&list));
        GenericListNode *end     = GENERIC_LIST_NODE(ListNodeEnd(&list));
        GenericListNode *same    = ListNodeRelative(ListNodeBegin(&list), 0);
        GenericListNode *rel_f2  = ListNodeRelative(ListNodeBegin(&list), 2);
        GenericListNode *rel_b2  = ListNodeRelative(ListNodeEnd(&list), -2);
        GenericListNode *end     = GENERIC_LIST_NODE(ListNodeEnd(&list));
        GenericListNode *same    = ListNodeRelative(ListNodeBegin(&list), 0);
        GenericListNode *rel_f2  = ListNodeRelative(ListNodeBegin(&list), 2);
        GenericListNode *rel_b2  = ListNodeRelative(ListNodeEnd(&list), -2);
        ListNode(int) *null_node = NULL;
        GenericListNode *same    = ListNodeRelative(ListNodeBegin(&list), 0);
        GenericListNode *rel_f2  = ListNodeRelative(ListNodeBegin(&list), 2);
        GenericListNode *rel_b2  = ListNodeRelative(ListNodeEnd(&list), -2);
        ListNode(int) *null_node = NULL;
        result = result && rel_f2 && ListNodeData(rel_f2) && (*(int *)ListNodeData(rel_f2) == 30);
        result = result && rel_b2 && ListNodeData(rel_b2) && (*(int *)ListNodeData(rel_b2) == 20);
        result = result && (ListNodeRelative(ListNodeBegin(&list), -1) == NULL);
        result = result && (ListNodeRelative(ListNodeEnd(&list), 1) == NULL);
        result = result && (ListNodeNext(null_node) == NULL);
        result = result && rel_b2 && ListNodeData(rel_b2) && (*(int *)ListNodeData(rel_b2) == 20);
        result = result && (ListNodeRelative(ListNodeBegin(&list), -1) == NULL);
        result = result && (ListNodeRelative(ListNodeEnd(&list), 1) == NULL);
        result = result && (ListNodeNext(null_node) == NULL);
        result = result && (ListNodePrev(null_node) == NULL);
    // head; assert we get a real node carrying the head's value.
    static bool test_relative_back_to_head_returns_head(void) {
        WriteFmt("Testing ListNodeRelative back-walk landing on head\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        // Tail is index 3 (value 40); -(len-1) = -3 lands exactly on head.
        GenericListNode *head_via_back = ListNodeRelative(ListNodeEnd(&list), -3);
    
        bool result = head_via_back != NULL;
Last updated on