Skip to content

Instantly share code, notes, and snippets.

@britishtea
Created February 4, 2016 15:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save britishtea/7e4dc04f858ada7979b5 to your computer and use it in GitHub Desktop.
Save britishtea/7e4dc04f858ada7979b5 to your computer and use it in GitHub Desktop.
class RingBuffer
attr_reader :capacity, :size
def initialize(capacity)
@array = Array.new(capacity)
@capacity = capacity
@read_index = 0
@size = 0
end
def push(elem)
unless writeable?
return false
end
@size += 1
@array[next_index(@size)] = elem
return true
end
def peek
if empty?
return nil
end
return @array[next_index]
end
def pop
if empty?
return nil
end
@size -= 1
@read_index = next_index
return @array[@read_index]
end
def empty?
return @size == 0
end
private
def next_index(offset = 1)
return (@read_index + offset) % @capacity
end
def writeable?
return @read_index + @size < @capacity
end
end
require "cutest"
require "ring_buffer"
setup { RingBuffer.new(5) }
test "push" do |buffer|
assert_equal buffer.push(0), true
end
test "push when full" do |buffer|
5.times { |i| buffer.push(i) }
assert_equal buffer.push(5), false
end
test "pop" do |buffer|
buffer.push(0)
assert_equal buffer.pop, 0
end
test "pop when empty" do |buffer|
assert_equal buffer.pop, nil
buffer.push(0)
assert_equal buffer.pop, 0
end
test "fifo" do |buffer|
5.times { |i| buffer.push(i) }
5.times { |i| assert_equal buffer.pop, i }
assert_equal buffer.pop, nil
end
test "peek" do |buffer|
buffer.push(0)
assert_equal buffer.peek, 0
assert_equal buffer.peek, 0
end
test "peek when empty" do |buffer|
assert_equal buffer.peek, nil
assert_equal buffer.peek, nil
end
test "size" do |buffer|
assert_equal buffer.size, 0
buffer.push(0)
assert_equal buffer.size, 1
buffer.pop
assert_equal buffer.size, 0
end
test "empty?" do |buffer|
assert_equal buffer.empty?, true
buffer.push(0)
assert_equal buffer.empty?, false
buffer.pop
assert_equal buffer.empty?, true
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment