Queue.lua 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. Queue = {}
  2. function Queue.new ()
  3. return {first = 1, last = 0}
  4. end
  5. function Queue.push (queue, value)
  6. local last = queue.last + 1
  7. queue.last = last
  8. queue[last] = value
  9. end
  10. function Queue.pop (queue)
  11. local first = queue.first
  12. if first > queue.last then error("queue is empty") end
  13. local value = queue[first]
  14. queue[first] = nil
  15. queue.first = first + 1
  16. -- resize internal array
  17. first = queue.first
  18. local last = queue.last
  19. if first * 2 > last then
  20. for i = first,last do
  21. queue[i - first + 1] = queue[i]
  22. queue[i] = nil
  23. end
  24. queue.first = 1
  25. queue.last = last - first + 1
  26. end
  27. return value
  28. end
  29. function Queue.push_back (queue, value)
  30. local first = queue.first
  31. if first > 1 then
  32. first = first - 1
  33. queue.first = first
  34. queue[first] = value
  35. else
  36. -- shift elements to right
  37. local last = queue.last
  38. for i = last,first,-1 do
  39. queue[i + 1] = queue[i]
  40. end
  41. queue[1] = value
  42. queue.first = 1
  43. queue.last = last + 1
  44. end
  45. end
  46. function Queue.remove (queue, index)
  47. local last = queue.last - 1
  48. queue.last = last
  49. for i = index,last-1 do
  50. queue[i] = queue[i + 1]
  51. end
  52. queue[last + 1] = nil
  53. end
  54. function Queue.size (queue)
  55. return queue.last - queue.first + 1
  56. end