use SplitBackwardsIterator from stdlib

This commit is contained in:
Motiejus Jakštys 2022-07-09 17:49:11 +03:00
parent 9f884b96f7
commit ac71195144

View File

@ -74,10 +74,10 @@ pub fn iterator(self: *const ErrCtx) mem.SplitIterator(u8) {
return mem.split(u8, slice[0..last_byte], "\x00");
}
pub fn rev(self: *const ErrCtx) SplitIteratorRev(u8) {
pub fn rev(self: *const ErrCtx) mem.SplitBackwardsIterator(u8) {
const slice = self.buf.constSlice();
if (slice.len == 0) {
return SplitIteratorRev(u8){
return mem.SplitBackwardsIterator(u8){
.buffer = slice,
.index = null,
.delimiter = "\x00",
@ -85,7 +85,7 @@ pub fn rev(self: *const ErrCtx) SplitIteratorRev(u8) {
}
const last_byte = if (slice[slice.len - 1] == 0) (slice.len - 1) else slice.len;
return splitRev(u8, slice[0..last_byte], "\x00");
return mem.splitBackwards(u8, slice[0..last_byte], "\x00");
}
pub fn unwrap(self: *const ErrCtx) BoundedArray(u8, capacity * 2) {
@ -154,36 +154,3 @@ test "rev" {
try testing.expectEqualStrings("yadda xx", it.next().?);
try testing.expectEqual(it.next(), null);
}
// copied form https://github.com/ziglang/zig/pull/11908
pub fn splitRev(comptime T: type, buffer: []const T, delimiter: []const T) SplitIteratorRev(T) {
assert(delimiter.len != 0);
return SplitIteratorRev(T){
.index = buffer.len,
.buffer = buffer,
.delimiter = delimiter,
};
}
pub fn SplitIteratorRev(comptime T: type) type {
return struct {
buffer: []const T,
index: ?usize,
delimiter: []const T,
const Self = @This();
/// Returns a slice of the next field, or null if splitting is complete.
pub fn next(self: *Self) ?[]const T {
const end = self.index orelse return null;
const start = if (mem.lastIndexOf(T, self.buffer[0..end], self.delimiter)) |delim_start| blk: {
self.index = delim_start;
break :blk delim_start + self.delimiter.len;
} else blk: {
self.index = null;
break :blk 0;
};
return self.buffer[start..end];
}
};
}