lists.zig (1188B)
1 pub const Error = error{ 2 BufferOverflow, 3 }; 4 5 pub fn StackRingBuffer(comptime T: type, comptime capacity: comptime_int) type { 6 return struct { 7 const Self = @This(); 8 9 items: [capacity]T, 10 write_idx: usize, 11 read_idx: usize, 12 count: usize, 13 14 pub fn init() Self { 15 return Self{ 16 .items = undefined, 17 .write_idx = 0, 18 .read_idx = 0, 19 .count = 0, 20 }; 21 } 22 23 pub fn push(self: *Self, value: T) !void { 24 if (self.count >= capacity) { 25 return Error.BufferOverflow; 26 } 27 28 self.items[self.write_idx] = value; 29 self.write_idx = (self.write_idx + 1) % capacity; 30 self.count += 1; 31 } 32 33 pub fn pop(self: *Self) ?T { 34 if (self.count == 0) { 35 return null; 36 } 37 38 const value = self.items[self.read_idx]; 39 self.read_idx = (self.read_idx + 1) % capacity; 40 self.count -= 1; 41 42 return value; 43 } 44 45 pub fn length(self: *const Self) usize { 46 return self.count; 47 } 48 }; 49 }