utils.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package llama
  2. type node[T any] struct {
  3. t T
  4. next *node[T]
  5. prev *node[T]
  6. }
  7. type deque[T any] struct {
  8. head *node[T]
  9. tail *node[T]
  10. size int
  11. capacity int
  12. }
  13. func (d *deque[T]) Empty() bool {
  14. return d.size == 0
  15. }
  16. func (d *deque[T]) Len() int {
  17. return d.size
  18. }
  19. func (d *deque[T]) Cap() int {
  20. return d.capacity
  21. }
  22. func (d *deque[T]) Push(t T) {
  23. if d.capacity > 0 && d.size >= d.capacity {
  24. d.PopLeft()
  25. }
  26. n := node[T]{t: t}
  27. if d.head != nil {
  28. n.next = d.head
  29. d.head.prev = &n
  30. d.head = &n
  31. } else {
  32. d.head = &n
  33. d.tail = &n
  34. }
  35. d.size++
  36. }
  37. func (d *deque[T]) PushLeft(t T) {
  38. if d.capacity > 0 && d.size >= d.capacity {
  39. d.Pop()
  40. }
  41. n := node[T]{t: t}
  42. if d.tail != nil {
  43. n.prev = d.tail
  44. d.tail.next = &n
  45. d.tail = &n
  46. } else {
  47. d.head = &n
  48. d.tail = &n
  49. }
  50. d.size++
  51. }
  52. func (d *deque[T]) Pop() *T {
  53. if d.Empty() {
  54. return nil
  55. }
  56. head := d.head
  57. d.head = head.next
  58. if d.head != nil {
  59. d.head.prev = nil
  60. } else {
  61. d.tail = nil
  62. }
  63. d.size--
  64. return &head.t
  65. }
  66. func (d *deque[T]) PopLeft() *T {
  67. if d.Empty() {
  68. return nil
  69. }
  70. tail := d.tail
  71. d.tail = tail.prev
  72. if d.tail != nil {
  73. d.tail.next = nil
  74. } else {
  75. d.head = nil
  76. }
  77. d.size--
  78. return &tail.t
  79. }
  80. func (d *deque[T]) Data() (data []T) {
  81. for n := d.head; n != nil; n = n.next {
  82. data = append(data, n.t)
  83. }
  84. return data
  85. }