1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#ifndef __LIST_H__
#define __LIST_H__
#include <stddef.h>
/**
* A growable array of pointers.
* Can store values of any pointer type (e.g. vector_t*, body_t*).
* The list automatically grows its internal array when more capacity is needed.
*/
typedef struct list list_t;
/**
* A function that can be called on list elements to release their resources.
* Examples: free, body_free
*/
typedef void (*free_func_t)(void *);
/**
* Allocates memory for a new list with space for the given number of elements.
* The list is initially empty.
* Asserts that the required memory was allocated.
*
* @param initial_size the number of elements to allocate space for
* @param freer if non-NULL, a function to call on elements in the list
* in list_free() when they are no longer in use
* @return a pointer to the newly allocated list
*/
list_t *list_init(size_t initial_size, free_func_t freer);
/**
* Releases the memory allocated for a list.
*
* @param list a pointer to a list returned from list_init()
*/
void list_free(list_t *list);
void list_free_data(list_t *list);
/**
* Gets the size of a list (the number of occupied elements).
* Note that this is NOT the list's capacity.
*
* @param list a pointer to a list returned from list_init()
* @return the number of elements in the list
*/
size_t list_size(list_t *list);
/**
* Gets the element at a given index in a list.
* Asserts that the index is valid, given the list's current size.
*
* @param list a pointer to a list returned from list_init()
* @param index an index in the list (the first element is at 0)
* @return the element at the given index, as a void*
*/
void *list_get(list_t *list, size_t index);
/**
* Removes the element at a given index in a list and returns it,
* moving all subsequent elements towards the start of the list.
* Asserts that the index is valid, given the list's current size.
*
* @param list a pointer to a list returned from list_init()
* @return the element at the given index in the list
*/
void *list_remove(list_t *list, size_t index);
/**
* Appends an element to the end of a list.
* If the list is filled to capacity, resizes the list to fit more elements
* and asserts that the resize succeeded.
* Also asserts that the value being added is non-NULL.
*
* @param list a pointer to a list returned from list_init()
* @param value the element to add to the end of the list
*/
void list_add(list_t *list, void *value);
#endif // #ifndef __LIST_H__