first commit
This commit is contained in:
71
sring.py
Normal file
71
sring.py
Normal file
@@ -0,0 +1,71 @@
|
||||
class sring:
|
||||
|
||||
#don't mess with defaults when creating a new sring
|
||||
def __init__(self, dat, size=1, eprev=None, enext=None):
|
||||
self.dat = dat
|
||||
self.size = size
|
||||
if eprev is None:
|
||||
self.eprev = self
|
||||
self.enext = self
|
||||
else:
|
||||
self.eprev = eprev
|
||||
self.enext = enext
|
||||
|
||||
def __getitem__(self, index):
|
||||
return self.rotate(index).dat
|
||||
|
||||
def __delitem__(self, index):
|
||||
loc = self.rotate(index)
|
||||
loc.eprev.enext = loc.enext
|
||||
loc.enext.eprev = loc.eprev
|
||||
self.propsize(self.size-1)
|
||||
|
||||
def __str__(self):
|
||||
return str(self.cut())
|
||||
|
||||
def __len__(self):
|
||||
return self.size
|
||||
|
||||
def rotate(self, index):
|
||||
if not isinstance(index, int):
|
||||
raise TypeError('index must be an integer')
|
||||
ind = ((index + self.size / 2) % self.size) - self.size / 2
|
||||
if ind == 0:
|
||||
return self
|
||||
elif ind < 0:
|
||||
loc = self
|
||||
while ind != 0:
|
||||
loc = loc.eprev
|
||||
ind += 1
|
||||
return loc
|
||||
elif index > 0:
|
||||
loc = self
|
||||
while ind != 0:
|
||||
loc = loc.enext
|
||||
ind -= 1
|
||||
return loc
|
||||
|
||||
#inserts AFTER the given index
|
||||
def insert(self, dat, index=-1):
|
||||
target = self.rotate(index)
|
||||
tarnext = target.enext
|
||||
enew = sring(dat, eprev=target, enext = tarnext)
|
||||
target.enext = enew
|
||||
tarnext.eprev = enew
|
||||
self.propsize(self.size+1)
|
||||
|
||||
def cut(self, index=0):
|
||||
loc = self.rotate(index)
|
||||
data = [loc.dat]
|
||||
nex = loc.enext
|
||||
while nex != loc:
|
||||
data += [nex.dat]
|
||||
nex = nex.enext
|
||||
return data
|
||||
|
||||
def propsize(self, nsize):
|
||||
self.size = nsize
|
||||
loc = self.enext
|
||||
while loc != self:
|
||||
loc.size = nsize
|
||||
loc = loc.enext
|
||||
Reference in New Issue
Block a user