1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
// DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE // Version 2, December 2004 // // Copyleft (ↄ) meh. <meh@schizofreni.co> | http://meh.schizofreni.co // // Everyone is permitted to copy and distribute verbatim or modified // copies of this license document, and changing it is allowed as long // as the name is changed. // // DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE // TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION // // 0. You just DO WHAT THE FUCK YOU WANT TO. use crate::error::*; /// A buffer to build packets in. /// /// A `Buffer` is composed of multiple layers, internally an `offset` and /// `length` is used to keep track of the current layer, `data()` and /// `data_mut()` will always return a slice to the current layer. /// /// # Example /// /// ``` /// use packet::buffer::{self, Buffer}; /// /// // Create a new dynamic buffer, `buffer::Dynamic` is backed by a `Vec<u8>`. /// let mut buffer = buffer::Dynamic::new(); /// /// // Create a new layer for 20 bytes, calling `next()` increases the offset /// // and zeroes the underlying memory. /// buffer.next(20); /// /// // Get more memory in the buffer. /// buffer.more(4); /// /// // Get the backing data for the buffer. /// let data = buffer.into_inner(); /// assert_eq!(data.len(), 24); /// ``` pub trait Buffer { /// Inner type used by the buffer. type Inner: AsMut<[u8]>; /// Convert the buffer into the inner type. fn into_inner(self) -> Self::Inner; /// Go to the next layer requesting the given size, zeroeing the layer. fn next(&mut self, size: usize) -> Result<()>; /// Request more memory for the same layer, zeroeing the new buffer area. fn more(&mut self, size: usize) -> Result<()>; /// Clear the buffer. fn clear(&mut self); /// Number of bytes used by the whole buffer. fn used(&self) -> usize; /// Offset from the beginning of the whole buffer. fn offset(&self) -> usize; /// Length of the current layer. fn length(&self) -> usize; /// Get a slice over the current layer. fn data(&self) -> &[u8]; /// Get a mutable slice over the current layer. fn data_mut(&mut self) -> &mut [u8]; } mod dynamic; pub use self::dynamic::Buffer as Dynamic; mod slice; pub use self::slice::Buffer as Slice;