authorgravatar for clownpriest@gmail.comArthur Elliott <clownpriest@gmail.com> 2018-06-07 10:00:27-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-06-09 11:42:41-04:00
loge0092ee4a573502a4110a6d4aeb7e7d3cdc8987b
tree4ba53c7de4f9616fc644750e468b316336784f6e
parent9046b5eac01540a783740451a6593ef0207c181e

add set function to arraylist

so you can set a value without growing the underlying buffer, with range safety checks

1 files changed, 24 insertions(+), 0 deletions(-)

std/array_list.zig+24
......@@ -44,6 +44,11 @@ pub fn AlignedArrayList(comptime T: type, comptime A: u29) type {
4444 return l.toSliceConst()[n];
4545 }
4646
47 pub fn set(self: *const Self, n: usize, item: *const T) !void {
48 if (n >= self.len) return error.OutOfBounds;
49 self.items[n] = item.*;
50 }
51
4752 pub fn count(self: *const Self) usize {
4853 return self.len;
4954 }
......@@ -162,6 +167,11 @@ test "basic ArrayList test" {
162167 var list = ArrayList(i32).init(debug.global_allocator);
163168 defer list.deinit();
164169
170 // setting on empty list is out of bounds
171 list.set(0, 1) catch |err| {
172 assert(err == error.OutOfBounds);
173 };
174
165175 {
166176 var i: usize = 0;
167177 while (i < 10) : (i += 1) {
......@@ -200,6 +210,20 @@ test "basic ArrayList test" {
200210
201211 list.appendSlice([]const i32{}) catch unreachable;
202212 assert(list.len == 9);
213
214 // can only set on indices < self.len
215 list.set(7, 33) catch unreachable;
216 list.set(8, 42) catch unreachable;
217
218 list.set(9, 99) catch |err| {
219 assert(err == error.OutOfBounds);
220 };
221 list.set(10, 123) catch |err| {
222 assert(err == error.OutOfBounds);
223 };
224
225 assert(list.pop() == 42);
226 assert(list.pop() == 33);
203227}
204228
205229test "iterator ArrayList test" {