tcp.rs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. use Managed;
  2. /// A TCP stream ring buffer.
  3. #[derive(Debug)]
  4. pub struct SocketBuffer<'a> {
  5. storage: Managed<'a, [u8]>,
  6. read_at: usize,
  7. length: usize
  8. }
  9. impl<'a> SocketBuffer<'a> {
  10. /// Create a packet buffer with the given storage.
  11. pub fn new<T>(storage: T) -> SocketBuffer<'a>
  12. where T: Into<Managed<'a, [u8]>> {
  13. SocketBuffer {
  14. storage: storage.into(),
  15. read_at: 0,
  16. length: 0
  17. }
  18. }
  19. /// Enqueue a slice of octets up to the given size into the buffer, and return a pointer
  20. /// to the slice.
  21. ///
  22. /// The returned slice may be shorter than requested, as short as an empty slice,
  23. /// if there is not enough contiguous free space in the buffer.
  24. pub fn enqueue(&mut self, mut size: usize) -> &mut [u8] {
  25. let write_at = (self.read_at + self.length) % self.storage.len();
  26. // We can't enqueue more than there is free space.
  27. let free = self.storage.len() - self.length;
  28. if size > free { size = free }
  29. // We can't contiguously enqueue past the beginning of the storage.
  30. let until_end = self.storage.len() - write_at;
  31. if size > until_end { size = until_end }
  32. self.length += size;
  33. &mut self.storage[write_at..write_at + size]
  34. }
  35. /// Dequeue a slice of octets up to the given size from the buffer, and return a pointer
  36. /// to the slice.
  37. ///
  38. /// The returned slice may be shorter than requested, as short as an empty slice,
  39. /// if there is not enough contiguous filled space in the buffer.
  40. pub fn dequeue(&mut self, mut size: usize) -> &[u8] {
  41. let read_at = self.read_at;
  42. // We can't dequeue more than was queued.
  43. if size > self.length { size = self.length }
  44. // We can't contiguously dequeue past the end of the storage.
  45. let until_end = self.storage.len() - self.read_at;
  46. if size > until_end { size = until_end }
  47. self.read_at = (self.read_at + size) % self.storage.len();
  48. self.length -= size;
  49. &self.storage[read_at..read_at + size]
  50. }
  51. }
  52. #[cfg(test)]
  53. mod test {
  54. use super::*;
  55. #[test]
  56. fn test_buffer() {
  57. let mut buffer = SocketBuffer::new(vec![0; 8]); // ........
  58. buffer.enqueue(6).copy_from_slice(b"foobar"); // foobar..
  59. assert_eq!(buffer.dequeue(3), b"foo"); // ...bar..
  60. buffer.enqueue(6).copy_from_slice(b"ba"); // ...barba
  61. buffer.enqueue(4).copy_from_slice(b"zho"); // zhobarba
  62. assert_eq!(buffer.dequeue(6), b"barba"); // zho.....
  63. assert_eq!(buffer.dequeue(8), b"zho"); // ........
  64. buffer.enqueue(8).copy_from_slice(b"gefug"); // ...gefug
  65. }
  66. }