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