Skip to content

Instantly share code, notes, and snippets.

@maxcountryman
Created August 5, 2011 18:22
Show Gist options
  • Save maxcountryman/1128165 to your computer and use it in GitHub Desktop.
Save maxcountryman/1128165 to your computer and use it in GitHub Desktop.
A simple circular "ring" buffer class
class RingBuffer(object):
'''This data structure provides a circular "ring" queue, limited by
n-number of positions as `length`. Once the ring is full, i.e. the length
is exceed, the head of the queue is deleted. In this way we acheive a
first in, first out circular buffer.'''
def __init__(self, length):
self.queue = []
self.keys = []
self.length = length
def _set_keys(self):
self.keys = []
for d in self.queue:
self.keys += map(lambda k : k, d.iterkeys())
def __getitem__(self, key):
for d in self.queue:
item = ''.join([v for k, v in d.iteritems() if k == key])
return item
def __setitem__(self, key, value):
if key in self.keys:
raise Exception('Duplicate key found in ring')
d = {key : value}
if len(self.queue) < self.length:
self.queue.append(d)
else:
del self.queue[0]
self.queue.append(d)
return self._set_keys()
def __delitem__(self, key):
items = []
for i, d in enumerate(self.queue):
if key in d.keys():
del self.queue[i]
return self._set_keys()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment