BattleQueue.lua 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. BattleQueue = {}
  2. function BattleQueue.New()
  3. local o = {}
  4. setmetatable(o, BattleQueue)
  5. BattleQueue.__index = BattleQueue
  6. o.head = -1
  7. o.rear = -1
  8. o.list = {}
  9. o.size = 0
  10. return o
  11. end
  12. function BattleQueue:Enqueue(e)
  13. if self.size == 0 then
  14. self.head = 0
  15. self.rear = 1
  16. self.size = 1
  17. self.list[self.rear] = e
  18. else
  19. self.rear = self.rear + 1
  20. self.list[self.rear] = e
  21. self.size = self.size + 1
  22. end
  23. end
  24. function BattleQueue:Dequeue()
  25. if self.size == 0 then
  26. error("lua queue is isEmpty")
  27. return nil
  28. end
  29. self.size = self.size - 1
  30. self.head = self.head + 1
  31. return self.list[self.head]
  32. end
  33. function BattleQueue:Clear()
  34. --self.list = {}
  35. self.size = 0
  36. self.head = -1
  37. self.rear = -1
  38. end
  39. function BattleQueue:Count()
  40. return self.size
  41. end
  42. function BattleQueue:Foreach(func)
  43. for i = self.head + 1, self.rear do
  44. if func then
  45. func(self.list[i])
  46. end
  47. end
  48. end
  49. function BattleQueue:Contain(e)
  50. for i = self.head + 1, self.rear do
  51. if e == self.list[i] then
  52. return true
  53. end
  54. end
  55. return false
  56. end
  57. --浅克隆
  58. function BattleQueue:Clone()
  59. local _quen = BattleQueue.New()
  60. for i = self.head + 1, self.rear do
  61. _quen:Enqueue(self.list[i])
  62. end
  63. return _quen
  64. end
  65. --删除index元素
  66. function BattleQueue:Delete(index)
  67. if index > self.size then return nil end
  68. local obj = self.list[index]
  69. -- 队尾移动
  70. for i = index, self.rear do
  71. self.list[i] = self.list[i+1]
  72. end
  73. self.size = self.size - 1
  74. self.rear = self.rear - 1
  75. return obj
  76. end
  77. --删除对象元素
  78. function BattleQueue:DeleteObj(obj)
  79. local searchfunc = function(_obj)
  80. return obj == _obj
  81. end
  82. local index = self:SearchIndex(searchfunc)
  83. if index < 0 then return nil end
  84. return self:Delete(index)
  85. end
  86. --删除对象元素
  87. function BattleQueue:DeleteObjBy(obj,Icompare)
  88. local searchfunc = function(_obj)
  89. return Icompare(obj,_obj)
  90. end
  91. local index = self:SearchIndex(searchfunc)
  92. if index < 0 then return nil end
  93. return self:Delete(index)
  94. end
  95. function BattleQueue:DeleteFunc(func)
  96. local IsNul = false
  97. while not IsNul do
  98. local index = self:SearchIndex(func)
  99. if index < 0 then
  100. IsNul = true
  101. else
  102. self:Delete(index)
  103. end
  104. end
  105. end
  106. -- 查找Icompare元素 返回下标
  107. function BattleQueue:SearchIndex(Icompare)
  108. if self.size < 0 then return -1 end
  109. for i = self.head + 1, self.rear do
  110. if Icompare and Icompare(self.list[i]) then
  111. return i
  112. end
  113. end
  114. return -1
  115. end
  116. -- 查找Icompare元素 返回对象
  117. function BattleQueue:SearchObject(Icompare)
  118. if self.size < 0 then return nil end
  119. for i = self.head + 1, self.rear do
  120. if Icompare and Icompare(self.list[i]) then
  121. return self.list[i]
  122. end
  123. end
  124. return nil
  125. end