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 {...@@ -44,6 +44,11 @@ pub fn AlignedArrayList(comptime T: type, comptime A: u29) type {
44 return l.toSliceConst()[n];44 return l.toSliceConst()[n];
45 }45 }
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
47 pub fn count(self: *const Self) usize {52 pub fn count(self: *const Self) usize {
48 return self.len;53 return self.len;
49 }54 }
...@@ -162,6 +167,11 @@ test "basic ArrayList test" {...@@ -162,6 +167,11 @@ test "basic ArrayList test" {
162 var list = ArrayList(i32).init(debug.global_allocator);167 var list = ArrayList(i32).init(debug.global_allocator);
163 defer list.deinit();168 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
165 {175 {
166 var i: usize = 0;176 var i: usize = 0;
167 while (i < 10) : (i += 1) {177 while (i < 10) : (i += 1) {
...@@ -200,6 +210,20 @@ test "basic ArrayList test" {...@@ -200,6 +210,20 @@ test "basic ArrayList test" {
200210
201 list.appendSlice([]const i32{}) catch unreachable;211 list.appendSlice([]const i32{}) catch unreachable;
202 assert(list.len == 9);212 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);
203}227}
204228
205test "iterator ArrayList test" {229test "iterator ArrayList test" {