DoxigAlpha

orderedRemoveMany

Remove the elements indexed by sorted_indexes. The indexes to be removed correspond to the array list before deletion.

Asserts:

  • Each index to be removed is in bounds.
  • The indexes to be removed are sorted ascending.

Duplicates in sorted_indexes are allowed.

This operation is O(N).

Invalidates element pointers beyond the first deleted index.

Function parameters

Parameters

#
self:*Self
sorted_indexes:[]const usize

A MultiArrayList stores a list of a struct or tagged union type.

Functions

#
MultiArrayList
A MultiArrayList stores a list of a struct or tagged union type.

Source

Implementation

#
pub fn orderedRemoveMany(self: *Self, sorted_indexes: []const usize) void {
    if (sorted_indexes.len == 0) return;
    const slices = self.slice();
    var shift: usize = 1;
    for (sorted_indexes[0 .. sorted_indexes.len - 1], sorted_indexes[1..]) |removed, end| {
        if (removed == end) continue; // allows duplicates in `sorted_indexes`
        const start = removed + 1;
        const len = end - start; // safety checks `sorted_indexes` are sorted
        inline for (fields, 0..) |_, field_index| {
            const field_slice = slices.items(@enumFromInt(field_index));
            @memmove(field_slice[start - shift ..][0..len], field_slice[start..][0..len]); // safety checks initial `sorted_indexes` are in range
        }
        shift += 1;
    }
    const start = sorted_indexes[sorted_indexes.len - 1] + 1;
    const end = self.len;
    const len = end - start; // safety checks final `sorted_indexes` are in range
    inline for (fields, 0..) |_, field_index| {
        const field_slice = slices.items(@enumFromInt(field_index));
        @memmove(field_slice[start - shift ..][0..len], field_slice[start..][0..len]);
    }
    self.len = end - shift;
}