authorgravatar for carl@astholm.seCarl Åstholm <carl@astholm.se> 2023-03-31 22:50:31+02:00
committergravatar for carl@astholm.seCarl Åstholm <carl@astholm.se> 2023-03-31 22:50:31+02:00
log3cd72951c037db69645a634fb063621512091ed3
tree862ca079ab56975776c1bf544748ab1c0cef0cf3
parent0bbc1ec2061b116093d3a85e955c5e6c1e7a28cd

std.mem.reverseIterator: add nextPtr()


1 files changed, 30 insertions(+), 0 deletions(-)

lib/std/mem.zig+30
......@@ -3014,6 +3014,7 @@ fn ReverseIterator(comptime T: type) type {
30143014 @compileError("expected slice or pointer to array, found '" ++ @typeName(T) ++ "'");
30153015 };
30163016 const Element = std.meta.Elem(Pointer);
3017 const ElementPointer = @TypeOf(&@as(Pointer, undefined)[0]);
30173018 return struct {
30183019 ptr: Pointer,
30193020 index: usize,
......@@ -3022,6 +3023,11 @@ fn ReverseIterator(comptime T: type) type {
30223023 self.index -= 1;
30233024 return self.ptr[self.index];
30243025 }
3026 pub fn nextPtr(self: *@This()) ?ElementPointer {
3027 if (self.index == 0) return null;
3028 self.index -= 1;
3029 return &self.ptr[self.index];
3030 }
30253031 };
30263032}
30273033
......@@ -3051,6 +3057,18 @@ test "reverseIterator" {
30513057 try testing.expectEqual(@as(?i32, 7), it.next());
30523058 try testing.expectEqual(@as(?i32, 3), it.next());
30533059 try testing.expectEqual(@as(?i32, null), it.next());
3060
3061 it = reverseIterator(slice);
3062 try testing.expect(trait.isConstPtr(@TypeOf(it.nextPtr().?)));
3063 try testing.expectEqual(@as(?i32, 7), it.nextPtr().?.*);
3064 try testing.expectEqual(@as(?i32, 3), it.nextPtr().?.*);
3065 try testing.expectEqual(@as(?*const i32, null), it.nextPtr());
3066
3067 var mut_slice: []i32 = &array;
3068 var mut_it = reverseIterator(mut_slice);
3069 mut_it.nextPtr().?.* += 1;
3070 mut_it.nextPtr().?.* += 2;
3071 try testing.expectEqual([2]i32{ 5, 8 }, array);
30543072 }
30553073 {
30563074 var array = [2]i32{ 3, 7 };
......@@ -3059,6 +3077,18 @@ test "reverseIterator" {
30593077 try testing.expectEqual(@as(?i32, 7), it.next());
30603078 try testing.expectEqual(@as(?i32, 3), it.next());
30613079 try testing.expectEqual(@as(?i32, null), it.next());
3080
3081 it = reverseIterator(ptr_to_array);
3082 try testing.expect(trait.isConstPtr(@TypeOf(it.nextPtr().?)));
3083 try testing.expectEqual(@as(?i32, 7), it.nextPtr().?.*);
3084 try testing.expectEqual(@as(?i32, 3), it.nextPtr().?.*);
3085 try testing.expectEqual(@as(?*const i32, null), it.nextPtr());
3086
3087 var mut_ptr_to_array: *[2]i32 = &array;
3088 var mut_it = reverseIterator(mut_ptr_to_array);
3089 mut_it.nextPtr().?.* += 1;
3090 mut_it.nextPtr().?.* += 2;
3091 try testing.expectEqual([2]i32{ 5, 8 }, array);
30623092 }
30633093}
30643094