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
36dynamic! {
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}
94dynamic! {
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}