sylveos

Toy Operating System
Log | Files | Refs

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 }