Skip to content

Instantly share code, notes, and snippets.

@prepor
Created June 4, 2010 16:41
Show Gist options
  • Save prepor/425639 to your computer and use it in GitHub Desktop.
Save prepor/425639 to your computer and use it in GitHub Desktop.
Simple ruby implementation of Cirqle Queue and FIFO
class CircleQueue
include Enumerable
class Head
attr_accessor :first, :last
def initialize
self.first = self
self.last = self
end
end
class Element
attr_accessor :prev, :next
attr_accessor :params
def initialize(params = {})
@params = params
end
end
attr_accessor :head, :size
def initialize(*elements)
self.head = Head.new
@size = 0
end
def first
head.first
end
def last
head.last
end
def remove(element)
if element.next == head
head.last = element.prev
else
element.next.prev = element.prev
end
if element.prev == head
head.first = element.next
else
element.prev.next = element.next
end
@size -= 1
end
def push(element)
element.next = head
element.prev = head.last
if head.first == head
head.first = element
else
head.last.next = element
end
head.last = element
@size += 1
end
def unshift(element)
element.next = head.first
element.prev = head
if head.last == head
head.last = element
else
head.first.prev = element
end
head.first = element
@size += 1
end
def shift
if size > 0
element = first
remove element
element
else
nil
end
end
def pop
if size > 0
element = last
remove element
element
else
nil
end
end
def each(&block)
current = head.first
while(current != head)
block.call(current)
current = current.next
end
end
end
class FIFO < CircleQueue
attr_accessor :max_size
def initialize(max_size)
super
@max_size = max_size
end
def push(element)
super(element)
if size > max_size
remove head.first
end
end
def unshift(element)
super(element)
if size > max_size
remove head.last
end
end
end
require 'pp'
qu = CircleQueue.new
qu.push CircleQueue::Element.new(:name => "test1")
qu.push CircleQueue::Element.new(:name => "test2")
qu.unshift CircleQueue::Element.new(:name => 'test3')
qu.each do |el|
pp el.params
end
qu = FIFO.new 5
qu.push CircleQueue::Element.new(:name => "test1")
qu.push CircleQueue::Element.new(:name => "test2")
qu.push CircleQueue::Element.new(:name => "test3")
qu.push CircleQueue::Element.new(:name => "test4")
qu.push CircleQueue::Element.new(:name => "test5")
qu.push CircleQueue::Element.new(:name => "test6")
qu.each do |el|
pp el.params
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment