authorgravatar for wink@saville.comWink Saville <wink@saville.com> 2018-07-17 07:29:42-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-07-17 10:29:42-04:00
log3cbf59b4c1a431ebd1ccb0cf46fa37e367b8106e
tree08cea871245bf4200d59b509c71136b604fe5921
parentd1a60243c9e112ccd36334cec3ab55eea6f823a8

Add swapRemoveOrError (#1254)

* Add swapRemoveOrError, this mirrors setOrError.

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

std/array_list.zig+36
...@@ -113,6 +113,14 @@ pub fn AlignedArrayList(comptime T: type, comptime A: u29) type {...@@ -113,6 +113,14 @@ pub fn AlignedArrayList(comptime T: type, comptime A: u29) type {
113 return old_item;113 return old_item;
114 }114 }
115115
116 /// Removes the element at the specified index and returns it
117 /// or an error.OutOfBounds is returned. If no error then
118 /// the empty slot is filled from the end of the list.
119 pub fn swapRemoveOrError(self: *Self, i: usize) !T {
120 if (i >= self.len) return error.OutOfBounds;
121 return self.swapRemove(i);
122 }
123
116 pub fn appendSlice(self: *Self, items: []align(A) const T) !void {124 pub fn appendSlice(self: *Self, items: []align(A) const T) !void {
117 try self.ensureCapacity(self.len + items.len);125 try self.ensureCapacity(self.len + items.len);
118 mem.copy(T, self.items[self.len..], items);126 mem.copy(T, self.items[self.len..], items);
...@@ -270,6 +278,34 @@ test "std.ArrayList.swapRemove" {...@@ -270,6 +278,34 @@ test "std.ArrayList.swapRemove" {
270 assert(list.len == 4);278 assert(list.len == 4);
271}279}
272280
281test "std.ArrayList.swapRemoveOrError" {
282 var list = ArrayList(i32).init(debug.global_allocator);
283 defer list.deinit();
284
285 // Test just after initialization
286 assertError(list.swapRemoveOrError(0), error.OutOfBounds);
287
288 // Test after adding one item and remote it
289 try list.append(1);
290 assert((try list.swapRemoveOrError(0)) == 1);
291 assertError(list.swapRemoveOrError(0), error.OutOfBounds);
292
293 // Test after adding two items and remote both
294 try list.append(1);
295 try list.append(2);
296 assert((try list.swapRemoveOrError(1)) == 2);
297 assert((try list.swapRemoveOrError(0)) == 1);
298 assertError(list.swapRemoveOrError(0), error.OutOfBounds);
299
300 // Test out of bounds with one item
301 try list.append(1);
302 assertError(list.swapRemoveOrError(1), error.OutOfBounds);
303
304 // Test out of bounds with two items
305 try list.append(2);
306 assertError(list.swapRemoveOrError(2), error.OutOfBounds);
307}
308
273test "std.ArrayList.iterator" {309test "std.ArrayList.iterator" {
274 var list = ArrayList(i32).init(debug.global_allocator);310 var list = ArrayList(i32).init(debug.global_allocator);
275 defer list.deinit();311 defer list.deinit();