| 29 | |
| 30 | |
| 31 | class Circle: |
| 32 | def __init__(self, size, default=0): |
| 33 | self.list = [default] * size |
| 34 | self.maxsize = size |
| 35 | self.size = 0 |
| 36 | self.offset = 0 |
| 37 | |
| 38 | def append(self, elem): |
| 39 | if self.size < self.maxsize: |
| 40 | self.list[self.size] = elem |
| 41 | self.size += 1 |
| 42 | else: |
| 43 | self.list[self.offset] = elem |
| 44 | self.offset = (self.offset + 1) % self.maxsize |
| 45 | |
| 46 | def __getitem__(self, val): |
| 47 | if isinstance(val, int): |
| 48 | if 0 > val or val >= self.size: |
| 49 | raise IndexError("Index out of range") |
| 50 | return ( |
| 51 | self.list[val] |
| 52 | if self.size < self.maxsize |
| 53 | else self.list[(self.offset + val) % self.maxsize] |
| 54 | ) |
| 55 | elif isinstance(val, slice): |
| 56 | start, stop, step = val.start, val.stop, val.step |
| 57 | if step is None: |
| 58 | step = 1 |
| 59 | if start is None: |
| 60 | start = 0 |
| 61 | if stop is None: |
| 62 | stop = self.size |
| 63 | if start < 0: |
| 64 | start = self.size + start |
| 65 | if stop < 0: |
| 66 | stop = self.size + stop |
| 67 | |
| 68 | indices = range(start, stop, step) |
| 69 | return [ |
| 70 | self.list[(self.offset + i) % self.maxsize] |
| 71 | for i in indices |
| 72 | if i < self.size |
| 73 | ] |
| 74 | else: |
| 75 | raise TypeError("Invalid argument type") |
| 76 | |
| 77 | |
| 78 | if __name__ == "__main__": |
no outgoing calls
no test coverage detected
searching dependent graphs…