From 42f5119f428ecb570a6d023adf38685da0f262d6 Mon Sep 17 00:00:00 2001 From: scbj Date: Mon, 6 Oct 2025 15:25:34 +0200 Subject: [PATCH] (zig) fixed output of `vector.drain()` --- zig/src/main.zig | 15 ++++++++------- zig/src/vector.zig | 19 ++++++++++++++++--- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/zig/src/main.zig b/zig/src/main.zig index 5c94afd..a650c96 100644 --- a/zig/src/main.zig +++ b/zig/src/main.zig @@ -6,18 +6,19 @@ const fs = std.fs; const vec = @import("vector.zig"); pub fn main() !void { - var GPA = std.heap.GeneralPurposeAllocator(.{}){}; - const allocator = GPA.allocator(); - var temp = try vec.vector(u8).new(allocator); + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); + var test_vector = try vec.vector(u8).new(allocator); for (0..12) |n| { - try temp.push(@truncate(n)); + try test_vector.push(@truncate(n)); } - std.debug.print("{X}\n", .{temp.array[0..temp.length]}); + std.debug.print("{X}\n", .{test_vector.array[0..test_vector.length]}); - const blargh = try temp.drain(.{3, 6}); + const blargh: []u8 = try test_vector.drain(.{3, 6}); + defer allocator.free(blargh); std.debug.print("drained slice: {X}\n", .{blargh}); - std.debug.print("vector after drain: {X}\n", .{temp.array[0..temp.length]}); + std.debug.print("vector after drain: {X}\n", .{test_vector.array[0..test_vector.length]}); } diff --git a/zig/src/vector.zig b/zig/src/vector.zig index 804c35c..1d002b3 100644 --- a/zig/src/vector.zig +++ b/zig/src/vector.zig @@ -9,6 +9,7 @@ pub fn vector(comptime T: type) type const VectorError: type = error { OutOfBounds, + FailedToAllocateMemory, }; allocator: std.mem.Allocator, @@ -36,6 +37,11 @@ pub fn vector(comptime T: type) type }; } + pub fn len(self: *Self) usize + { + return self.length; + } + pub fn push(self: *Self, item: VectorType) !void { if (self.length >= self.array.len) @@ -65,10 +71,17 @@ pub fn vector(comptime T: type) type return VectorError.OutOfBounds; } + const slice_length: usize = range[1] - range[0] + 1; + const slice: []VectorType = self.allocator.alloc(VectorType, slice_length) + catch + { + return VectorError.FailedToAllocateMemory; + }; + // TODO: return array instead of pointer - const slice: []VectorType = self.array[range[0]..range[1]]; - @memmove(self.array.ptr, self.array[range[1]..]); - self.length -= range[1] - range[0] + 1; + @memcpy(slice.ptr, self.array[range[0]..range[1] + 1]); + @memmove(self.array.ptr + range[0], self.array[range[1]..self.length]); + self.length -= slice_length; return slice; }