binbuf/impls/
dynamic.rs

1use crate::{bytes_ptr, dynamic::{self}, BytesPtr, Dynamic};
2
3dynamic! {
4    buf! { pub struct SliceU8Buf<'a, P>(&'a [u8], P); }
5    impl<'a> I for &'a [u8] {
6        type Buf<P> = SliceU8Buf<'a, P>;
7    }
8}
9
10impl<'a> Dynamic for &'a [u8] {
11    fn len(&self) -> usize {
12        8 + (*self).len()
13    }
14    fn buf_len(buf: dynamic::BufConst<Self>) -> usize {
15        unsafe { dynamic::decode_ptr::<u64>(buf.0).0 as usize + 8 }
16    }
17    fn encode(&self, buf: dynamic::BufMut<Self>) -> usize {
18        unsafe {
19            let len = (*self).len();
20            dynamic::encode_ptr(buf.0, &(len as u64));
21            buf.0.range_at(8, len).copy_from_slice(self);
22            8 + len
23        }
24    }
25}
26
27impl<'a> dynamic::Decode for &'a [u8] {
28    fn decode(buf: dynamic::BufConst<Self>) -> (Self, usize) {
29        unsafe {
30            let len = dynamic::decode_ptr::<u64>(buf.0).0 as usize;
31            (buf.0.range_at(8, len).slice(), 8 + len)
32        }
33    }
34}
35
36// region: bytes_ptr
37dynamic! {
38    buf! { pub struct BytesPtrConstBuf<P>(bytes_ptr::Const, P); }
39    impl I for bytes_ptr::Const {
40        type Buf<P> = BytesPtrConstBuf<P>;
41    }
42}
43
44impl Dynamic for bytes_ptr::Const {
45    fn len(&self) -> usize {
46        8 + BytesPtr::len(*self)
47    }
48    fn buf_len(buf: dynamic::BufConst<Self>) -> usize {
49        unsafe { dynamic::decode_ptr::<u64>(buf.0).0 as usize + 8 }
50    }
51    fn encode(&self, buf: dynamic::BufMut<Self>) -> usize {
52        unsafe {
53            let len = BytesPtr::len(*self);
54            dynamic::encode_ptr(buf.0, &(len as u64));
55            buf.0.range_at(8, len).copy_from(*self);
56            8 + len
57        }
58    }
59}
60
61impl dynamic::Decode for bytes_ptr::Const {
62    fn decode(buf: dynamic::BufConst<Self>) -> (Self, usize) {
63        unsafe {
64            let len = dynamic::decode_ptr::<u64>(buf.0).0 as usize;
65            (buf.0.range_at(8, len), 8 + len)
66        }
67    }
68}
69
70
71dynamic! {
72    buf! { pub struct BytesPtrMutBuf<P>(bytes_ptr::Mut, P); }
73    impl I for bytes_ptr::Mut {
74        type Buf<P> = BytesPtrMutBuf<P>;
75    }
76}
77
78impl Dynamic for bytes_ptr::Mut {
79    fn len(&self) -> usize {
80        8 + BytesPtr::len(*self)
81    }
82    fn buf_len(buf: dynamic::BufConst<Self>) -> usize {
83        unsafe { dynamic::decode_ptr::<u64>(buf.0).0 as usize + 8 }
84    }
85    fn encode(&self, buf: dynamic::BufMut<Self>) -> usize {
86        unsafe {
87            let len = BytesPtr::len(*self);
88            dynamic::encode_ptr(buf.0, &(len as u64));
89            buf.0.range_at(8, len).copy_from(self.to_const());
90            8 + len
91        }
92    }
93}
94// endregion: bytes_ptr
95
96dynamic! {
97    buf! { pub struct StringBuf<P>(String, P); }
98    impl I for String {
99        type Buf<P> = StringBuf<P>;
100    }
101}
102
103impl Dynamic for String {
104    fn len(&self) -> usize {
105        8 + self.len()
106    }
107    fn buf_len(buf: dynamic::BufConst<Self>) -> usize {
108        unsafe { dynamic::ptr_len::<&[u8]>(buf.0) }
109    }
110    fn encode(&self, buf: dynamic::BufMut<Self>) -> usize {
111        unsafe { dynamic::encode_ptr(buf.0, &self.as_bytes()) }
112    }
113}
114
115impl dynamic::Decode for String {
116    fn decode(buf: dynamic::BufConst<Self>) -> (Self, usize) {
117        let (bytes, len) = unsafe { dynamic::decode_ptr::<&[u8]>(buf.0) };
118        (String::from_utf8_lossy(bytes).into_owned(), len)
119    }
120}