-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlist.c
More file actions
117 lines (102 loc) · 2.54 KB
/
list.c
File metadata and controls
117 lines (102 loc) · 2.54 KB
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include "list.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
void list_expand(List *list)
{
list->capacity *= 2;
list->data = (void **)realloc(list->data, list->capacity * sizeof(void *));
assert(list->data != NULL);
}
void list_add(List *list, void *item)
{
if (list->size == list->capacity)
list_expand(list);
list->data[list->size++] = item;
}
void *list_get(List *list, size_t index)
{
assert(index < list->size);
return list->data[index];
}
void list_destroy(List *list)
{
free(list->data);
free(list);
}
void list_remove(List *list, size_t index)
{
assert(index < list->size);
for (size_t i = index; i < list->size - 1; i++)
list->data[i] = list->data[i + 1];
list->size--;
}
List *create_list(size_t initial_capacity, bool growable)
{
List *list = (List *)malloc(sizeof(List));
assert(list != NULL);
list->capacity = initial_capacity;
list->size = 0;
list->is_growable = growable;
list->is_unmodifiable = false;
list->data = (void **)malloc(initial_capacity * sizeof(void *));
assert(list->data != NULL);
list->add = list_add;
list->get = list_get;
list->destroy = list_destroy;
list->remove = list_remove;
list->expand = list_expand;
return list;
}
List *list_empty(size_t capacity, bool growable)
{
return create_list(capacity, growable);
}
List *list_filled(size_t capacity, void *element, bool growable)
{
List *list = create_list(capacity, growable);
for (int i = 0; i < capacity; i++)
{
list->data[i] = element;
list->size++;
}
return list;
}
List *list_from(void **elements, size_t capacity, bool growable)
{
List *list = create_list(capacity, growable);
for (int i = 0; i < capacity; i++)
{
list->data[i] = elements[i];
list->size++;
}
return list;
}
List *list_generate(size_t capacity, void *(*generator)(int), bool growable)
{
List *list = create_list(capacity, growable);
for (int i = 0; i < capacity; i++)
{
list->data[i] = generator(i);
list->size++;
}
return list;
}
List *list_unmodifiable(void **elements, int capacity)
{
List *list = create_list(capacity, false);
list->is_unmodifiable = true;
for (int i = 0; i < capacity; i++)
{
list->data[i] = elements[i];
list->size++;
}
return list;
}
const ListClass ListFactory = {
.empty = list_empty,
.filled = list_filled,
.from = list_from,
.generate = list_generate,
.unmodifiable = list_unmodifiable,
};