Created
June 4, 2010 16:41
-
-
Save prepor/425639 to your computer and use it in GitHub Desktop.
Simple ruby implementation of Cirqle Queue and FIFO
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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