源战役客户端
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

225 righe
3.3 KiB

4 settimane fa
  1. local setmetatable = setmetatable
  2. local assert = assert
  3. local list = {}
  4. list.__index = list
  5. function list:new()
  6. return setmetatable({length = 0}, self)
  7. end
  8. setmetatable(list, {__call = list.new})
  9. function list:clear()
  10. self.length = 0
  11. self.first = nil
  12. self.last = nil
  13. end
  14. function list:push(v)
  15. local t = {value = v}
  16. if self.last then
  17. self.last._next = t
  18. t._prev = self.last
  19. self.last = t
  20. else
  21. self.first = t
  22. self.last = t
  23. end
  24. self.length = self.length + 1
  25. end
  26. function list:pop()
  27. if not self.last then return end
  28. local t = self.last
  29. if t._prev then
  30. t._prev._next = nil
  31. self.last = t._prev
  32. t._prev = nil
  33. else
  34. self.first = nil
  35. self.last = nil
  36. end
  37. self.length = self.length - 1
  38. return t.value
  39. end
  40. function list:unshift(v)
  41. local t = {value = v}
  42. if self.first then
  43. self.first._prev = t
  44. t._next = self.first
  45. self.first = t
  46. else
  47. self.first = t
  48. self.last = t
  49. end
  50. self.length = self.length + 1
  51. end
  52. function list:shift()
  53. if not self.first then return end
  54. local t = self.first
  55. if t._next then
  56. t._next._prev = nil
  57. self.first = t._next
  58. t._next = nil
  59. else
  60. self.first = nil
  61. self.last = nil
  62. end
  63. self.length = self.length - 1
  64. return t.value
  65. end
  66. function list:remove(iter)
  67. if iter._next then
  68. if iter._prev then
  69. iter._next._prev = iter._prev
  70. iter._prev._next = iter._next
  71. else
  72. assert(iter == self.first)
  73. iter._next._prev = nil
  74. self.first = iter._next
  75. end
  76. elseif iter._prev then
  77. assert(iter == self.last)
  78. iter._prev._next = nil
  79. self.last = iter._prev
  80. else
  81. assert(iter == self.first and iter == self.last)
  82. self.first = nil
  83. self.last = nil
  84. end
  85. self.length = self.length - 1
  86. return iter
  87. end
  88. function list:find(v, iter)
  89. if iter == nil then
  90. iter = self.first
  91. end
  92. while iter do
  93. if v == iter.value then
  94. return iter
  95. end
  96. iter = iter._next
  97. end
  98. return nil
  99. end
  100. function list:findlast(v, iter)
  101. if iter == nil then
  102. iter = self.last
  103. end
  104. while iter do
  105. if v == iter.value then
  106. return iter
  107. end
  108. iter = iter._prev
  109. end
  110. return nil
  111. end
  112. function list:next(iter)
  113. if iter then
  114. if iter._next ~= nil then
  115. return iter._next, iter._next.value
  116. end
  117. elseif self.first then
  118. return self.first, self.first.value
  119. end
  120. return nil
  121. end
  122. function list:items()
  123. return self.next, self
  124. end
  125. function list:prev(iter)
  126. if iter then
  127. if iter._prev ~= nil then
  128. return iter._prev, iter._prev.value
  129. end
  130. elseif self.last then
  131. return self.last, self.last.value
  132. end
  133. return nil
  134. end
  135. function list:reverse_items()
  136. return self.prev, self
  137. end
  138. function list:erase(value)
  139. local iter = self:find(value)
  140. if iter then
  141. self:remove(iter)
  142. end
  143. end
  144. function list:insert(v, iter)
  145. assert(v)
  146. if not iter then
  147. return self:push(value)
  148. end
  149. local t = {value = v}
  150. if iter._next then
  151. iter._next._prev = t
  152. t._next = iter._next
  153. else
  154. self.last = t
  155. end
  156. t._prev = iter
  157. iter._next = t
  158. self.length = self.length + 1
  159. end
  160. function list:head()
  161. if self.first ~= nil then
  162. return self.first.value
  163. end
  164. return nil
  165. end
  166. function list:tail()
  167. if self.last ~= nil then
  168. return self.last.value
  169. end
  170. return nil
  171. end
  172. function list:clone()
  173. local t = list:New()
  174. for item in self.items() do
  175. t:push(item.value)
  176. end
  177. return t
  178. end
  179. ilist = list.items
  180. -- rilist = list.reverse_items
  181. return list