ReverseIterator
Fields of this type
Fields
- ptr:Pointer
- index:usize
Functions in this namespace
Functions
Source
Implementation
fn ReverseIterator(comptime T: type) type {
const Pointer = blk: {
switch (@typeInfo(T)) {
.pointer => |ptr_info| switch (ptr_info.size) {
.one => switch (@typeInfo(ptr_info.child)) {
.array => |array_info| {
var new_ptr_info = ptr_info;
new_ptr_info.size = .many;
new_ptr_info.child = array_info.child;
new_ptr_info.sentinel_ptr = array_info.sentinel_ptr;
break :blk @Type(.{ .pointer = new_ptr_info });
},
else => {},
},
.slice => {
var new_ptr_info = ptr_info;
new_ptr_info.size = .many;
break :blk @Type(.{ .pointer = new_ptr_info });
},
else => {},
},
else => {},
}
@compileError("expected slice or pointer to array, found '" ++ @typeName(T) ++ "'");
};
const Element = std.meta.Elem(Pointer);
const ElementPointer = @Type(.{ .pointer = ptr: {
var ptr = @typeInfo(Pointer).pointer;
ptr.size = .one;
ptr.child = Element;
ptr.sentinel_ptr = null;
break :ptr ptr;
} });
return struct {
ptr: Pointer,
index: usize,
pub fn next(self: *@This()) ?Element {
if (self.index == 0) return null;
self.index -= 1;
return self.ptr[self.index];
}
pub fn nextPtr(self: *@This()) ?ElementPointer {
if (self.index == 0) return null;
self.index -= 1;
return &self.ptr[self.index];
}
};
}