-
Notifications
You must be signed in to change notification settings - Fork 4
/
ringbuffer.py
47 lines (41 loc) · 1.4 KB
/
ringbuffer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#! /usr/bin/python3
# -*- coding: utf-8 -*-
"""
Buffer ring class used in analogsensor_thread
"""
class RingBuffer:
""" class that implements a not-yet-full buffer """
def __init__(self,size_max):
self.max = size_max
self.data = []
class __Full:
""" class that implements a full buffer """
def append(self, x):
""" Append an element overwriting the oldest one. """
self.data[self.cur] = x
self.cur = (self.cur+1) % self.max
def get(self):
""" return list of elements in correct order """
return self.data[self.cur:]+self.data[:self.cur]
def append(self,x):
"""append an element at the end of the buffer"""
self.data.append(x)
if len(self.data) == self.max:
self.cur = 0
# Permanently change self's class from non-full to full
self.__class__ = self.__Full
def get(self):
""" Return a list of elements from the oldest to the newest. """
return self.data
## sample usage
# if __name__=='__main__':
# x=RingBuffer(5)
# x.append(1); x.append(2); x.append(3); x.append(4)
# print(x.__class__, x.get( ))
# x.append(5)
# print(x.__class__, x.get( ))
# x.append(6)
# print(x.data, x.get( ))
# x.append(7); x.append(8); x.append(9); x.append(10)
# print(x.data, x.get( ))