Merge branch 'tgschultz-arraylist-remove'
This commit is contained in:
commit
2a719ee6c5
@ -41,8 +41,8 @@ pub fn AlignedArrayList(comptime T: type, comptime A: u29) type {
|
||||
return self.items[0..self.len];
|
||||
}
|
||||
|
||||
pub fn at(self: Self, n: usize) T {
|
||||
return self.toSliceConst()[n];
|
||||
pub fn at(self: Self, i: usize) T {
|
||||
return self.toSliceConst()[i];
|
||||
}
|
||||
|
||||
/// 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 {
|
||||
new_item_ptr.* = item;
|
||||
}
|
||||
|
||||
/// Removes the element at the specified index and returns it.
|
||||
/// The empty slot is filled from the end of the list.
|
||||
pub fn swapRemove(self: *Self, i: usize) T {
|
||||
if (self.len - 1 == i) return self.pop();
|
||||
|
||||
const slice = self.toSlice();
|
||||
const old_item = slice[i];
|
||||
slice[i] = self.pop();
|
||||
return old_item;
|
||||
}
|
||||
|
||||
pub fn removeOrError(self: *Self, n: usize) !T {
|
||||
if (n >= self.len) return error.OutOfBounds;
|
||||
if (self.len - 1 == n) return self.pop();
|
||||
|
||||
var old_item = self.at(n);
|
||||
try self.setOrError(n, self.pop());
|
||||
return old_item;
|
||||
}
|
||||
|
||||
pub fn appendSlice(self: *Self, items: []align(A) const T) !void {
|
||||
try self.ensureCapacity(self.len + items.len);
|
||||
mem.copy(T, self.items[self.len..], items);
|
||||
@ -232,6 +252,33 @@ test "basic ArrayList test" {
|
||||
assert(list.pop() == 33);
|
||||
}
|
||||
|
||||
test "std.ArrayList.swapRemove" {
|
||||
var list = ArrayList(i32).init(debug.global_allocator);
|
||||
defer list.deinit();
|
||||
|
||||
try list.append(1);
|
||||
try list.append(2);
|
||||
try list.append(3);
|
||||
try list.append(4);
|
||||
try list.append(5);
|
||||
try list.append(6);
|
||||
try list.append(7);
|
||||
|
||||
//remove from middle
|
||||
assert(list.swapRemove(3) == 4);
|
||||
assert(list.at(3) == 7);
|
||||
assert(list.len == 6);
|
||||
|
||||
//remove from end
|
||||
assert(list.swapRemove(5) == 6);
|
||||
assert(list.len == 5);
|
||||
|
||||
//remove from front
|
||||
assert(list.swapRemove(0) == 1);
|
||||
assert(list.at(0) == 5);
|
||||
assert(list.len == 4);
|
||||
}
|
||||
|
||||
test "iterator ArrayList test" {
|
||||
var list = ArrayList(i32).init(debug.global_allocator);
|
||||
defer list.deinit();
|
||||
|
Loading…
x
Reference in New Issue
Block a user