exercism/ruby/circular-buffer/circular_buffer.rb

52 lines
943 B
Ruby

# Class CircularBuffer
class CircularBuffer
class BufferEmptyException < RuntimeError
end
class BufferFullException < RuntimeError
end
def initialize(buffer_size)
@buffer = Array.new(buffer_size)
end
def read
raise BufferEmptyException if @front.nil?
value = @buffer[@front]
@buffer[@front] = nil
if @front == @back
@back = @front = nil
else
@front = next_index(@front)
end
value
end
def write(data, force = false)
raise BufferFullException if @buffer[next_index(@back)] && !force
@back = next_index(@back)
@front = 0 if @front.nil?
@buffer[@back] = data
end
def write!(data)
@front = next_index(@front) if @buffer[next_index(@front)]
write(data, true)
end
def clear
@buffer = Array.new(@buffer.size)
@front = @back = nil
end
private
def next_index(index)
return 0 if index.nil?
(index + 1) % @buffer.size
end
end