Skip to content

Instantly share code, notes, and snippets.

@Ceasar
Created October 6, 2012 18:52
Show Gist options
  • Save Ceasar/3845783 to your computer and use it in GitHub Desktop.
Save Ceasar/3845783 to your computer and use it in GitHub Desktop.
A Python implement of a ring-buffer. NOTE: Doesn't work (appendleft and append can override each other's value since resizing only appends to end)
class RingBuffer(object):
def __init__(self, items=None):
self._left = 0
self._right = 0
self._length = 0
self._items = []
if items is not None:
for item in items:
self.append(item)
def __len__(self):
return self._length
@property
def empty(self):
return len(self) == 0
@property
def left(self):
return self._items[self._left]
@property
def right(self):
return self._items[self._right]
def _resize(self):
self._items.extend([None] * (len(self) or 1))
def append(self, item):
if not self.empty:
self._right += 1
if len(self) >= len(self._items):
self._resize()
self._items[self._right] = item
self._length += 1
def appendleft(self, item):
if not self.empty:
self._left -= 1
if len(self) >= len(self._items):
self._resize()
self._items[self._left] = item
self._length += 1
def pop(self):
val, self._items[self._right] = self._items[self._right], None
self._right -= 1
self._length -= 1
return val
def popleft(self):
val, self._items[self._left] = self._items[self._left], None
self._left += 1
self._length -= 1
return val
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment