Static_Array :: struct (T : Type, N : int) { array : [N] T; count : int; } operator *[] :: (sa : *Static_Array, index : int) -> *sa.T { assert(index < sa.count); return *sa.array[index]; } array_add :: (sa : *Static_Array, item : sa.T) { assert(sa.count + 1 < sa.N); sa.array[sa.count] = item; sa.count += 1; } array_add :: (sa : *Static_Array) -> *sa.T { assert(sa.count + 1 < sa.N); ptr := *sa.array[sa.count]; sa.count += 1; return ptr; } pop :: (sa : *Static_Array) -> sa.T { assert(sa.count > 0); elem := sa.array[sa.count - 1]; sa.count -= 1; return elem; } clear :: (sa : *Static_Array) { sa.count = 0; } to_array :: (sa : *Static_Array) -> []sa.T { array : []sa.T; array.count = sa.count; array.data = sa.array.data; return array; }