ring.odin 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package container
  2. Ring :: struct($T: typeid) {
  3. next, prev: ^Ring(T),
  4. value: T,
  5. }
  6. ring_init :: proc(r: ^$R/Ring) -> ^R {
  7. r.prev, r.next = r, r;
  8. return r;
  9. }
  10. ring_next :: proc(r: ^$R/Ring) -> ^R {
  11. if r.next == nil {
  12. return ring_init(r);
  13. }
  14. return r.next;
  15. }
  16. ring_prev :: proc(r: ^$R/Ring) -> ^R {
  17. if r.prev == nil {
  18. return ring_init(r);
  19. }
  20. return r.prev;
  21. }
  22. ring_move :: proc(r: ^$R/Ring, n: int) -> ^R {
  23. r := r;
  24. if r.next == nil {
  25. return ring_init(r);
  26. }
  27. switch {
  28. case n < 0:
  29. for _ in n..<0 {
  30. r = r.prev;
  31. }
  32. case n > 0:
  33. for _ in 0..<n {
  34. r = r.next;
  35. }
  36. }
  37. return r;
  38. }
  39. ring_link :: proc(r, s: ^$R/Ring) -> ^R {
  40. n := ring_next(r);
  41. if s != nil {
  42. p := ring_prev(s);
  43. r.next = s;
  44. s.prev = r;
  45. n.prev = p;
  46. p.next = n;
  47. }
  48. return n;
  49. }
  50. ring_unlink :: proc(r: ^$R/Ring, n: int) -> ^R {
  51. if n <= 0 {
  52. return nil;
  53. }
  54. return ring_link(r, ring_move(r, n+1));
  55. }
  56. ring_len :: proc(r: ^$R/Ring) -> int {
  57. n := 0;
  58. if r != nil {
  59. n = 1;
  60. for p := ring_next(r); p != r; p = p.next {
  61. n += 1;
  62. }
  63. }
  64. return n;
  65. }