Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.46 KB | None | 0 0
  1. class PList:
  2. class _Node:
  3. __slots__ = '_data', '_prev', '_next'
  4. def __init__(self, data, prev, next):
  5. self._data = data
  6. self._prev = prev
  7. self._next = next
  8. class Position:
  9. def __init__(self, plist, node):
  10. self._plist = plist
  11. self._node = node
  12. def data(self):
  13. return self._node._data
  14. def __eq__(self, other):
  15. return type(other) is type(self) and other._node is self._node
  16. def __ne__(self, other):
  17. return not (self == other)
  18. def _validate(self, p):
  19. if not isinstance(p,self.Position):
  20. raise TypeError("p must be proper Position type")
  21. if p._plist is not self:
  22. raise ValueError('p does not belong to this PList')
  23. if p._node._next is None:
  24. raise ValueError('p is no longer valid')
  25. return p._node
  26. def _make_position(self, node):
  27. if node is self._head or node is self._tail:
  28. return None
  29. else:
  30. return self.Position(self, node)
  31. def __init__(self):
  32. self._head = self._Node(None, None, None)
  33. self._head._next = self._tail = self._Node(None, self._head, None)
  34. self._size = 0
  35. def __len__(self):
  36. return self._size
  37. def is_empty(self):
  38. return self._size == 0
  39. def first(self):
  40. return self._make_position(self._head._next)
  41. def last(self):
  42. return self._make_position(self._tail._prev)
  43. def before(self, p):
  44. node = self._validate(p)
  45. return self._make_position(node._prev)
  46. def after(self, p):
  47. node = self._validate(p)
  48. return self._make_position(node._next)
  49. def __iter__(self):
  50. pos = self.first()
  51. while pos:
  52. yield pos.data()
  53. pos = self.after(pos)
  54. def _insert_after(self, data, node):
  55. newNode = self._Node(data, node, node._next)
  56. node._next._prev = newNode
  57. node._next = newNode
  58. self._size += 1
  59. return self._make_position(newNode)
  60. def add_first(self, data):
  61. return self._insert_after(data, self._head)
  62. def add_last(self, data):
  63. return self._insert_after(data, self._tail._prev)
  64. def add_before(self, p, data):
  65. node = self._validate(p)
  66. return self._insert_after(data, node._prev)
  67. def add_after(self, p, data):
  68. node = self._validate(p)
  69. return self._insert_after(data, node)
  70. def delete(self, p):
  71. node = self._validate(p)
  72. data = node._data
  73. node._prev._next = node._next
  74. node._next._prev = node._prev
  75. node._prev = node._next = node._data = None
  76. self._size -= 1
  77. return data
  78. def replace(self, p, data):
  79. node = self._valdiate(p)
  80. olddata = node._data
  81. node._data = data
  82. return olddata
  83. def rev_itr(self):
  84. pos = self.last()
  85. while pos:
  86. yield pos.data()
  87. pos = self.before(pos)
  88.  
  89. class Counters:
  90. class _Item:
  91. def __init__(self, name):
  92. self._name = name
  93. self._count = 0
  94. class Counter:
  95. def __init__(self, position):
  96. self._position = position
  97. def name(self):
  98. return self._position.data()._name
  99. def count(self):
  100. return self._position.data()._count
  101. def __init__(self):
  102. self._L = PList()
  103. def new_counter(self, name):
  104. self._L.add_last(Counters._Item(name))
  105. return Counters.Counter(self._L.last())
  106. def delete_counter(self,counter):
  107. self._L.delete(counter._position)
  108. counter._position = None
  109. def increment_counter(self, counter):
  110. counter._position.data()._count += 1
  111. before_position = self._L.before(counter._position)
  112. while (before_position and
  113. before_position.data()._count
  114. < counter.count()):
  115. new_position = self._L.add_before(before_position,counter._position.data())
  116. self._L.delete(counter._position)
  117. counter._position = new_position
  118. before_position=self._L.before(counter._position)
  119. def __iter__(self):
  120. position = self._L.first()
  121. while position:
  122. yield Counters.Counter(position)
  123. position = self._L.after(position)
  124.  
  125. C = Counters()
  126. D = Counters()
  127. cc = C.new_counter("A counter in C")
  128. D.increment_counter(cc)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement