Skip to content

Commit c7f9550

Browse files
Add std.mem.collapseRepeatsAll.
1 parent 27aba2d commit c7f9550

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

lib/std/mem.zig

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4141,6 +4141,42 @@ test collapseRepeats {
41414141
try testCollapseRepeats("//a///a////", '/', "/a/a/");
41424142
}
41434143

4144+
/// Collapse consecutive duplicates into one entry.
4145+
///
4146+
/// See also `collapseRepeats`
4147+
pub fn collapseRepeatsAll(comptime T: type, slice: []T) []T {
4148+
if (slice.len == 0) return slice;
4149+
4150+
var write_index: usize = 1;
4151+
for (slice[0 .. slice.len - 1], slice[1..]) |elem, next| {
4152+
if (elem != next) {
4153+
slice[write_index] = next;
4154+
write_index += 1;
4155+
}
4156+
}
4157+
return slice[0..write_index];
4158+
}
4159+
4160+
test collapseRepeatsAll {
4161+
try std.testing.expectEqualSlices(u8, &.{}, collapseRepeats(u8, &.{}));
4162+
{
4163+
var array: [1]u8 = .{0};
4164+
try std.testing.expectEqualSlices(u8, &.{0}, collapseRepeats(u8, &array));
4165+
}
4166+
{
4167+
var array: [2]u8 = .{ 0, 0 };
4168+
try std.testing.expectEqualSlices(u8, &.{0}, collapseRepeats(u8, &array));
4169+
}
4170+
{
4171+
var array: [2]u8 = .{ 0, 1 };
4172+
try std.testing.expectEqualSlices(u8, &.{ 0, 1 }, collapseRepeats(u8, &array));
4173+
}
4174+
{
4175+
var array: [10]u8 = .{ 1, 0, 1, 1, 10, 10, 10, 0, 0, 0 };
4176+
try std.testing.expectEqualSlices(u8, &.{ 1, 0, 1, 10, 0 }, collapseRepeats(u8, &array));
4177+
}
4178+
}
4179+
41444180
/// Calculate the size needed in an output buffer to perform a replacement.
41454181
/// The needle must not be empty.
41464182
pub fn replacementSize(comptime T: type, input: []const T, needle: []const T, replacement: []const T) usize {

0 commit comments

Comments
 (0)