Skip to content

ListDeinit

Description

Deinitialize a list and release every node back to its allocator. Element payloads are torn down through the configured copy_deinit handler when present.

After this call the list is empty and can either be re-initialized or discarded.

Parameters

Name Direction Description
v in,out Pointer to list to deinitialize.

Success

Returns to the caller. Every node has been freed back to the list’s allocator; head, tail, and length are reset; the allocator binding is unbound and replaced with AllocatorBind(DefaultAllocator()) so the list object can be safely re-initialized. When copy_deinit is configured it has been invoked on each previously-stored element.

Failure

Function cannot fail. A NULL v is a caller bug and aborts via LOG_FATAL.

Usage example (Cross-references)

Usage examples (Cross-references)
    
    void deinit_int_list(IntList *list) {
        ListDeinit(list);
    }
    
                ListMergeR(list, &temp);
                ListDeinit(&temp); // Clean up temp to prevent memory leak
                break;
            }
        result      = result && list_matches(GENERIC_LIST(&list), (const int[]) {10, 20, 30, 40, 50}, 5);
    
        ListDeinit(&list);
        return result;
    }
        result      = result && list_matches(GENERIC_LIST(&list), (const int[]) {10, 20, 30, 40, 50}, 5);
    
        ListDeinit(&list);
        return result;
    }
        result      = result && list_matches(GENERIC_LIST(&list), (const int[]) {10, 20, 30, 40, 50}, 5);
    
        ListDeinit(&list);
        return result;
    }
        result      = result && list_matches(GENERIC_LIST(&list), (const int[]) {10, 20, 30, 40, 50}, 5);
    
        ListDeinit(&list);
        return result;
    }
        result      = result && list_matches(GENERIC_LIST(&list), (const int[]) {10, 20, 30, 40, 50}, 5);
    
        ListDeinit(&list);
        return result;
    }
        }
    
        ListDeinit(&list);
        return count == 0;
    }
        result = result && list_matches(GENERIC_LIST(&list), (const int[]) {9}, 1);
    
        ListDeinit(&list);
        return result;
    }
        result = result && list_matches(GENERIC_LIST(&list), (const int[]) {4, 3, 2, 2, 1}, 5);
    
        ListDeinit(&list);
        return result;
    }
        result      = result && list_matches(GENERIC_LIST(&singleton), (const int[]) {42}, 1);
    
        ListDeinit(&empty);
        ListDeinit(&singleton);
        return result;
    
        ListDeinit(&empty);
        ListDeinit(&singleton);
        return result;
    }
        result = result && list_matches(GENERIC_LIST(&list), (const int[]) {9}, 1);
    
        ListDeinit(&list);
        result = result && (g_copy_deinit_count == 3);
        return result;
        result = result && list_matches(GENERIC_LIST(&list), (const int[]) {30}, 1);
    
        ListDeinit(&list);
        return result;
    }
        result = result && list_matches(GENERIC_LIST(&list), (const int[]) {10, 40, 30, 20}, 4);
    
        ListDeinit(&list);
        return result;
    }
        result      = result && (ListNodePrev(null_node) == NULL);
    
        ListDeinit(&list);
        return result;
    }
        result = result && (ListFind(&list, &missing, compare_ints) == SIZE_MAX);
    
        ListDeinit(&list);
        return result;
    }
        result      = result && (list_d.copy_init == tracked_copy_init) && (list_d.copy_deinit == tracked_copy_deinit);
    
        ListDeinit(&list_a);
        ListDeinit(&list_b);
        ListDeinit(&list_c);
    
        ListDeinit(&list_a);
        ListDeinit(&list_b);
        ListDeinit(&list_c);
        ListDeinit(&list_d);
        ListDeinit(&list_a);
        ListDeinit(&list_b);
        ListDeinit(&list_c);
        ListDeinit(&list_d);
        return result;
        ListDeinit(&list_b);
        ListDeinit(&list_c);
        ListDeinit(&list_d);
        return result;
    }
        result      = result && (list_c.copy_init == tracked_copy_init) && (list_d.copy_deinit == tracked_copy_deinit);
    
        ListDeinit(&list_a);
        ListDeinit(&list_b);
        ListDeinit(&list_c);
    
        ListDeinit(&list_a);
        ListDeinit(&list_b);
        ListDeinit(&list_c);
        ListDeinit(&list_d);
        ListDeinit(&list_a);
        ListDeinit(&list_b);
        ListDeinit(&list_c);
        ListDeinit(&list_d);
        return result;
        ListDeinit(&list_b);
        ListDeinit(&list_c);
        ListDeinit(&list_d);
        return result;
    }
    
    static bool test_list_deinit_with_deep_copy(void) {
        WriteFmt("Testing ListDeinit with deep copy\n");
    
        typedef List(int) IntList;
        result      = result && (ListAt(&list, 1) == 1009);
    
        ListDeinit(&list);
    
        result = result && (g_copy_deinit_count == 2);
                      (list.copy_deinit == NULL) && (list.length == 0) && (list.__magic == MISRA_LIST_MAGIC);
    
        ListDeinit(&list);
        return result;
    }
        result      = result && list_matches(GENERIC_LIST(&list), (const int[]) {60, 80, 40, 10, 30, 20, 50, 90, 70}, 9);
    
        ListDeinit(&list);
        return result;
    }
        result      = result && (arr[0] == 0) && (arr[1] == 0) && (arr[2] == 0);
    
        ListDeinit(&list);
        return result;
    }
        result      = result && (arr[0] == 4) && (arr[1] == 5) && (arr[2] == 6);
    
        ListDeinit(&list);
        return result;
    }
        result      = result && list_matches(GENERIC_LIST(&list), (const int[]) {1007, 1007, 1008, 1009}, 4);
    
        ListDeinit(&list);
        result = result && (g_copy_deinit_count == 4);
        return result;
        result = result && list_matches(GENERIC_LIST(&src), (const int[]) {1005}, 1);
    
        ListDeinit(&dest);
        ListDeinit(&src);
        result = result && (g_copy_deinit_count == 1);
    
        ListDeinit(&dest);
        ListDeinit(&src);
        result = result && (g_copy_deinit_count == 1);
        return result;
        result      = result && (ListLen(&src_a) == 0) && (src_a.head == NULL) && (src_a.tail == NULL);
    
        ListDeinit(&dest_l);
        ListDeinit(&src_l);
        ListDeinit(&dest_r);
    
        ListDeinit(&dest_l);
        ListDeinit(&src_l);
        ListDeinit(&dest_r);
        ListDeinit(&src_r);
        ListDeinit(&dest_l);
        ListDeinit(&src_l);
        ListDeinit(&dest_r);
        ListDeinit(&src_r);
        ListDeinit(&dest_a);
        ListDeinit(&src_l);
        ListDeinit(&dest_r);
        ListDeinit(&src_r);
        ListDeinit(&dest_a);
        ListDeinit(&src_a);
        ListDeinit(&dest_r);
        ListDeinit(&src_r);
        ListDeinit(&dest_a);
        ListDeinit(&src_a);
        return result;
        ListDeinit(&src_r);
        ListDeinit(&dest_a);
        ListDeinit(&src_a);
        return result;
    }
        result      = result && (ListLen(&empty_dest) == 0) && (ListLen(&empty_src) == 0);
    
        ListDeinit(&deep_dest);
        ListDeinit(&shallow_src);
        ListDeinit(&empty_dest);
    
        ListDeinit(&deep_dest);
        ListDeinit(&shallow_src);
        ListDeinit(&empty_dest);
        ListDeinit(&empty_src);
        ListDeinit(&deep_dest);
        ListDeinit(&shallow_src);
        ListDeinit(&empty_dest);
        ListDeinit(&empty_src);
        result = result && (g_copy_deinit_count == 2);
        ListDeinit(&shallow_src);
        ListDeinit(&empty_dest);
        ListDeinit(&empty_src);
        result = result && (g_copy_deinit_count == 2);
        return result;
        result = result && list.tail && list.tail->data && (*list.tail->data == 30);
    
        ListDeinit(&list);
        return result;
    }
        result = result && (ListLen(&list) == 0) && (list.head == NULL) && (list.tail == NULL);
    
        ListDeinit(&list);
        return result;
    }
        result = result && list.tail && list.tail->data && (*list.tail->data == 4);
    
        ListDeinit(&list);
        return result;
    }
        result      = result && (ListLen(&list) == 0) && (list.head == NULL) && (list.tail == NULL);
    
        ListDeinit(&list);
        return result;
    }
        result = result && (ListLen(&list) == 0) && (list.head == NULL) && (list.tail == NULL);
    
        ListDeinit(&list);
        return result;
    }
        result      = result && list_matches(GENERIC_LIST(&list), (const int[]) {4}, 1);
    
        ListDeinit(&list);
        result = result && (g_copy_deinit_count == 1);
        return result;
Last updated on