Guest User

Untitled

a guest
Dec 10th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.56 KB | None | 0 0
  1. /// Definition for singly-linked list.
  2. public class ListNode<ValueType> {
  3. public var val: ValueType?
  4. public var next: ListNode?
  5. public let id = UUID()
  6. public init(_ val: ValueType?) {
  7. self.val = val
  8. self.next = nil
  9. }
  10. }
  11.  
  12. class RingBuffer<ValueType> {
  13.  
  14. private var writeNode: ListNode<ValueType>
  15. private var readNode: ListNode<ValueType>
  16.  
  17. init?(size: Int) {
  18. guard size > 1 else { return nil }
  19.  
  20. let headNode = ListNode<ValueType>(nil)
  21. var currentNode: ListNode = headNode
  22.  
  23. for _ in 1..<size {
  24. currentNode.next = ListNode(nil)
  25. currentNode = currentNode.next!
  26. }
  27. currentNode.next = headNode
  28.  
  29. writeNode = headNode
  30. readNode = headNode
  31. }
  32.  
  33. func insert(val: ValueType) {
  34. if writeNode.val != nil { // overwrite val
  35. readNode = writeNode.next!
  36. }
  37. writeNode.val = val
  38. writeNode = writeNode.next!
  39. }
  40.  
  41. func pop() -> ValueType? {
  42. if let val = readNode.val {
  43. readNode.val = nil
  44. readNode = readNode.next!
  45. return val
  46. } else {
  47. return nil
  48. }
  49. }
  50.  
  51. func getBufferString() -> String {
  52. var currentNode = readNode
  53. var bufferString = ""
  54.  
  55. repeat {
  56. if !bufferString.isEmpty { bufferString += "->" }
  57. let val = currentNode.val == nil ? "EMPTY" : "\(currentNode.val!)"
  58. bufferString += val
  59. currentNode = currentNode.next!
  60. } while currentNode.id != readNode.id
  61.  
  62. bufferString += "⏎"
  63.  
  64. return bufferString
  65. }
  66.  
  67. func currentBuffer() -> ValueType? {
  68. return readNode.val
  69. }
  70.  
  71. func nextBuffer() -> ValueType? {
  72. return readNode.next!.val
  73. }
  74.  
  75. }
Add Comment
Please, Sign In to add comment