| ... | @@ -101,6 +101,25 @@ pub fn AlignedArrayList(comptime T: type, comptime A: u29) type { | ... | @@ -101,6 +101,25 @@ pub fn AlignedArrayList(comptime T: type, comptime A: u29) type { |
| 101 | const new_item_ptr = try self.addOne(); | 101 | const new_item_ptr = try self.addOne(); |
| 102 | new_item_ptr.* = item; | 102 | new_item_ptr.* = item; |
| 103 | } | 103 | } |
| | 104 | |
| | 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 remove(self: *Self, n: usize) T { |
| | 108 | if(self.len - 1 == n) return self.pop(); |
| | 109 | |
| | 110 | var old_item = self.at(n); |
| | 111 | self.set(n, self.pop()); |
| | 112 | return old_item; |
| | 113 | } |
| | 114 | |
| | 115 | pub fn removeOrError(self: *Self, n: usize) !T { |
| | 116 | if(n >= self.len) return error.OutOfBounds; |
| | 117 | if(self.len - 1 == n) return self.pop(); |
| | 118 | |
| | 119 | var old_item = self.at(n); |
| | 120 | try self.setOrError(n, self.pop()); |
| | 121 | return old_item; |
| | 122 | } |
| 104 | | 123 | |
| 105 | pub fn appendSlice(self: *Self, items: []align(A) const T) !void { | 124 | pub fn appendSlice(self: *Self, items: []align(A) const T) !void { |
| 106 | try self.ensureCapacity(self.len + items.len); | 125 | try self.ensureCapacity(self.len + items.len); |
| ... | @@ -157,7 +176,7 @@ pub fn AlignedArrayList(comptime T: type, comptime A: u29) type { | ... | @@ -157,7 +176,7 @@ pub fn AlignedArrayList(comptime T: type, comptime A: u29) type { |
| 157 | it.count += 1; | 176 | it.count += 1; |
| 158 | return val; | 177 | return val; |
| 159 | } | 178 | } |
| 160 | | 179 | |
| 161 | pub fn reset(it: *Iterator) void { | 180 | pub fn reset(it: *Iterator) void { |
| 162 | it.count = 0; | 181 | it.count = 0; |
| 163 | } | 182 | } |
| ... | @@ -232,6 +251,33 @@ test "basic ArrayList test" { | ... | @@ -232,6 +251,33 @@ test "basic ArrayList test" { |
| 232 | assert(list.pop() == 33); | 251 | assert(list.pop() == 33); |
| 233 | } | 252 | } |
| 234 | | 253 | |
| | 254 | test "remove ArrayList test" { |
| | 255 | var list = ArrayList(i32).init(debug.global_allocator); |
| | 256 | defer list.deinit(); |
| | 257 | |
| | 258 | try list.append(1); |
| | 259 | try list.append(2); |
| | 260 | try list.append(3); |
| | 261 | try list.append(4); |
| | 262 | try list.append(5); |
| | 263 | try list.append(6); |
| | 264 | try list.append(7); |
| | 265 | |
| | 266 | //remove from middle |
| | 267 | assert(list.remove(3) == 4); |
| | 268 | assert(list.at(3) == 7); |
| | 269 | assert(list.len == 6); |
| | 270 | |
| | 271 | //remove from end |
| | 272 | assert(list.remove(5) == 6); |
| | 273 | assert(list.len == 5); |
| | 274 | |
| | 275 | //remove from front |
| | 276 | assert(list.remove(0) == 1); |
| | 277 | assert(list.at(0) == 5); |
| | 278 | assert(list.len == 4); |
| | 279 | } |
| | 280 | |
| 235 | test "iterator ArrayList test" { | 281 | test "iterator ArrayList test" { |
| 236 | var list = ArrayList(i32).init(debug.global_allocator); | 282 | var list = ArrayList(i32).init(debug.global_allocator); |
| 237 | defer list.deinit(); | 283 | defer list.deinit(); |