Init new repository
This commit is contained in:
49
examples/sandbox/dynamic_array.lc
Normal file
49
examples/sandbox/dynamic_array.lc
Normal file
@@ -0,0 +1,49 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user