Unify SliceIter, SliceIterConst and SliceIterOwned into SliceIter

This commit is contained in:
Luuk Machielse 2025-12-08 08:49:24 +01:00
parent fed67e2571
commit ae512b5ae7

View file

@ -2,17 +2,11 @@ const std = @import("std");
pub fn iter(comptime T: type) type {
return struct {
pub fn fromSlice(slice: anytype) Iterator(
if (@typeInfo(@TypeOf(slice)).pointer.is_const) SliceIterConst(T) else SliceIter(T),
) {
pub fn fromSlice(slice: anytype) Iterator(SliceIter(T, .value)) {
return .{ .inner = .{ .slice = slice } };
}
pub fn fromSliceOwned(slice: []const T) Iterator(SliceIterOwned(T)) {
return .{ .inner = .{ .slice = slice } };
}
test fromSliceOwned {
test fromSlice {
const expectEqual = std.testing.expectEqual;
var it = iter(i32).fromSliceOwned(&.{ 1, 3, 2, 4 });
@ -381,53 +375,31 @@ pub fn Once(comptime T: type) type {
};
}
pub fn SliceIter(comptime T: type) type {
return struct {
slice: []T,
index: usize = 0,
pub const SliceItemType = enum { value, ptr, const_ptr };
pub const Item = *T;
pub fn SliceIter(comptime T: type, comptime item_type: SliceItemType) type {
return struct {
slice: switch (item_type) {
.value, .const_ptr => []const T,
.ptr => []T,
},
i: usize = 0,
pub const Item = switch (item_type) {
.value => T,
.ptr => *T,
.const_ptr => *const T,
};
const Self = @This();
pub fn next(self: *Self) ?Item {
if (self.index >= self.slice.len) return null;
defer self.index += 1;
return &self.slice[self.index];
}
};
}
pub fn SliceIterConst(comptime T: type) type {
return struct {
slice: []const T,
index: usize = 0,
pub const Item = *const T;
const Self = @This();
pub fn next(self: *Self) ?Item {
if (self.index >= self.slice.len) return null;
defer self.index += 1;
return &self.slice[self.index];
}
};
}
pub fn SliceIterOwned(comptime T: type) type {
return struct {
slice: []const T,
index: usize = 0,
pub const Item = T;
const Self = @This();
pub fn next(self: *Self) ?Item {
if (self.index >= self.slice.len) return null;
defer self.index += 1;
return self.slice[self.index];
if (self.i >= self.slice.len) return null;
defer self.i += 1;
return switch (item_type) {
.value => self.slice[self.i],
.ptr, .const_ptr => &self.slice[self.i],
};
}
};
}