Files
lib_compiler/examples/sandbox/dynamic_array.lc
2024-04-13 15:29:53 +02:00

49 lines
1.1 KiB
Plaintext

ArrayOfName :: struct {
data: *Name;
len: int;
cap: int;
}
TryGrowingNameArray :: proc(arr: *ArrayOfName) {
if (arr.len + 1 > arr.cap) {
cap := arr.cap * 2;
if (cap == 0) cap = 16;
arr.data = libc.realloc(arr.data, sizeof(arr.data[0]) * :libc.size_t(cap));
arr.cap = cap;
}
}
AddName :: proc(arr: *ArrayOfName, item: Name) {
TryGrowingNameArray(arr);
arr.data[arr.len] = item;
arr.len += 1;
}
InsertName :: proc(a: *ArrayOfName, item: Name, index: int) {
if index == a.len {
AddName(a, item);
return;
}
libc.assert(index < a.len);
libc.assert(index >= 0);
TryGrowingNameArray(a);
right_len := :libc.size_t(a.len - index);
libc.memmove(&a.data[index + 1], &a.data[index], sizeof(a.data[0]) * right_len);
a.data[index] = item;
a.len += 1;
}
GetLastName :: proc(a: ArrayOfName): *Name {
libc.assert(a.len > 0);
result := &a.data[a.len - 1];
return result;
}
PopName :: proc(a: *ArrayOfName): Name {
a.len -= 1;
result := a.data[a.len];
return result;
}