buffer/impls/
slice_ref.rs

1use Buffer;
2use BufferRef;
3use ToBufferRef;
4use std::mem;
5use wildly_unsafe;
6
7/// The intermediate step from a byte slice reference to a `BufferRef`.
8pub struct SliceRefBuffer<'data> {
9    slice: &'data mut &'data mut [u8],
10    initialized: usize,
11}
12
13impl<'d> SliceRefBuffer<'d> {
14    fn new(slice: &'d mut &'d mut [u8]) -> SliceRefBuffer<'d> {
15        SliceRefBuffer {
16            slice: slice,
17            initialized: 0,
18        }
19    }
20    fn buffer<'s>(&'s mut self) -> BufferRef<'d, 's> {
21        unsafe {
22            // This is unsafe, we now have two unique (mutable) references to
23            // the same `Vec`. However, we will only access `self.vec.len`
24            // through `self` and only the contents through the `BufferRef`.
25            BufferRef::new(wildly_unsafe(self.slice), &mut self.initialized)
26        }
27    }
28}
29
30impl<'d> Drop for SliceRefBuffer<'d> {
31    fn drop(&mut self) {
32        let slice = mem::replace(self.slice, &mut []);
33        *self.slice = &mut slice[..self.initialized];
34    }
35}
36
37impl<'d> Buffer<'d> for &'d mut &'d mut [u8] {
38    type Intermediate = SliceRefBuffer<'d>;
39    fn to_to_buffer_ref(self) -> Self::Intermediate {
40        SliceRefBuffer::new(self)
41    }
42}
43
44impl<'d> ToBufferRef<'d> for SliceRefBuffer<'d> {
45    fn to_buffer_ref<'s>(&'s mut self) -> BufferRef<'d, 's> {
46        self.buffer()
47    }
48}