buffer/impls/
slice_ref.rs1use Buffer;
2use BufferRef;
3use ToBufferRef;
4use std::mem;
5use wildly_unsafe;
6
7pub 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 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}