authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-07-14 10:02:13-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-07-14 10:02:13-04:00
log2a719ee6c598b7096060168a0e7c93ae3e244008
tree256601da94f9a2fd05b793d78377999b6a8fa1f4
parent317ed57cb1e238664a123b940f4a50697653a9bb
parentb44332f5a663c8e96e546d6a2b6071bf96ce9bcb

Merge branch 'tgschultz-arraylist-remove'


1 files changed, 49 insertions(+), 2 deletions(-)

std/array_list.zig+49-2
...@@ -41,8 +41,8 @@ pub fn AlignedArrayList(comptime T: type, comptime A: u29) type {...@@ -41,8 +41,8 @@ pub fn AlignedArrayList(comptime T: type, comptime A: u29) type {
41 return self.items[0..self.len];41 return self.items[0..self.len];
42 }42 }
4343
44 pub fn at(self: Self, n: usize) T {44 pub fn at(self: Self, i: usize) T {
45 return self.toSliceConst()[n];45 return self.toSliceConst()[i];
46 }46 }
4747
48 /// Sets the value at index `i`, or returns `error.OutOfBounds` if48 /// Sets the value at index `i`, or returns `error.OutOfBounds` if
...@@ -102,6 +102,26 @@ pub fn AlignedArrayList(comptime T: type, comptime A: u29) type {...@@ -102,6 +102,26 @@ pub fn AlignedArrayList(comptime T: type, comptime A: u29) type {
102 new_item_ptr.* = item;102 new_item_ptr.* = item;
103 }103 }
104104
105 /// Removes the element at the specified index and returns it.
106 /// The empty slot is filled from the end of the list.
107 pub fn swapRemove(self: *Self, i: usize) T {
108 if (self.len - 1 == i) return self.pop();
109
110 const slice = self.toSlice();
111 const old_item = slice[i];
112 slice[i] = self.pop();
113 return old_item;
114 }
115
116 pub fn removeOrError(self: *Self, n: usize) !T {
117 if (n >= self.len) return error.OutOfBounds;
118 if (self.len - 1 == n) return self.pop();
119
120 var old_item = self.at(n);
121 try self.setOrError(n, self.pop());
122 return old_item;
123 }
124
105 pub fn appendSlice(self: *Self, items: []align(A) const T) !void {125 pub fn appendSlice(self: *Self, items: []align(A) const T) !void {
106 try self.ensureCapacity(self.len + items.len);126 try self.ensureCapacity(self.len + items.len);
107 mem.copy(T, self.items[self.len..], items);127 mem.copy(T, self.items[self.len..], items);
...@@ -232,6 +252,33 @@ test "basic ArrayList test" {...@@ -232,6 +252,33 @@ test "basic ArrayList test" {
232 assert(list.pop() == 33);252 assert(list.pop() == 33);
233}253}
234254
255test "std.ArrayList.swapRemove" {
256 var list = ArrayList(i32).init(debug.global_allocator);
257 defer list.deinit();
258
259 try list.append(1);
260 try list.append(2);
261 try list.append(3);
262 try list.append(4);
263 try list.append(5);
264 try list.append(6);
265 try list.append(7);
266
267 //remove from middle
268 assert(list.swapRemove(3) == 4);
269 assert(list.at(3) == 7);
270 assert(list.len == 6);
271
272 //remove from end
273 assert(list.swapRemove(5) == 6);
274 assert(list.len == 5);
275
276 //remove from front
277 assert(list.swapRemove(0) == 1);
278 assert(list.at(0) == 5);
279 assert(list.len == 4);
280}
281
235test "iterator ArrayList test" {282test "iterator ArrayList test" {
236 var list = ArrayList(i32).init(debug.global_allocator);283 var list = ArrayList(i32).init(debug.global_allocator);
237 defer list.deinit();284 defer list.deinit();