-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdynamic_array.c
More file actions
92 lines (72 loc) · 1.71 KB
/
dynamic_array.c
File metadata and controls
92 lines (72 loc) · 1.71 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
#include "dynamic_array.h"
#include "utils.h"
struct DynamicArray
{
double *data;
size_t size;
size_t capacity;
};
DynamicArray *daCreate(size_t initialCapacity)
{
DynamicArray *da = safeMalloc(sizeof(DynamicArray), "Failed to allocate dynamic array");
da->size = 0;
if (initialCapacity == 0)
{
initialCapacity = DEFAULT_CAPACITY;
}
da->capacity = initialCapacity;
da->data = safeMalloc(sizeof(double) * da->capacity, "Failed to allocate data of dynamic array");
return da;
}
void daDestroy(DynamicArray *da)
{
if (!da) return;
free(da->data);
free(da);
}
void daAppend(DynamicArray *da, double value)
{
daIsNullCheck(da);
if (daNeedsResize(da->size, da->capacity))
{
da->capacity *= 2;
da->data = safeRealloc(da->data, sizeof(double) * da->capacity, "Failed to increase capacity of dynamic array");
}
da->data[da->size] = value;
da->size++;
}
double daGet(DynamicArray *da, size_t idx)
{
daIsNullCheck(da);
if (!daIndexInBounds(da->size, idx))
{
fprintf(stderr, "Error: Index %zu out of bounds (size: %zu)\n", idx, da->size);
exit(1);
}
return da->data[idx];
}
void daSet(DynamicArray *da, size_t idx, double value)
{
daIsNullCheck(da);
if (!daIndexInBounds(da->size, idx))
{
fprintf(stderr, "Error: Index %zu out of bounds (size: %zu)\n", idx, da->size);
exit(1);
}
da->data[idx] = value;
}
size_t daSize(DynamicArray *da)
{
daIsNullCheck(da);
return da->size;
}
void daPrint(DynamicArray *da)
{
daIsNullCheck(da);
printf("[");
for (size_t i = 0; i < da->size; i++)
{
printf("%f ", da->data[i]);
}
printf("]\n");
}