Skip to main content

gin_tonic_core/
encoder.rs

1use crate::Encode;
2
3pub struct Encoder<'buf> {
4    buffer: &'buf mut [u8],
5    position: usize,
6}
7
8impl<'buf> Encoder<'buf> {
9    #[inline]
10    pub fn new(buffer: &'buf mut [u8]) -> Self {
11        Self {
12            buffer,
13            position: 0,
14        }
15    }
16
17    #[inline]
18    pub fn advance(&mut self, offset: usize) {
19        self.position += offset
20    }
21
22    #[inline]
23    pub fn position(&self) -> usize {
24        self.position
25    }
26
27    #[inline]
28    pub fn buffer_mut(&mut self) -> &mut [u8] {
29        &mut self.buffer[self.position..]
30    }
31}
32
33impl<'buf> Encode for Encoder<'buf> {
34    #[inline]
35    fn encode_sint32(&mut self, n: i32) {
36        let (data, size) = varint_simd::encode_zigzag(n);
37        self.buffer_mut()[0..size as usize].clone_from_slice(&data[0..size as usize]);
38        self.advance(size as usize);
39    }
40
41    #[inline]
42    fn encode_sint64(&mut self, n: i64) {
43        let (data, size) = varint_simd::encode_zigzag(n);
44        self.buffer_mut()[0..size as usize].clone_from_slice(&data[0..size as usize]);
45        self.advance(size as usize);
46    }
47
48    #[inline]
49    fn encode_uint32(&mut self, n: u32) {
50        let (data, size) = varint_simd::encode(n);
51        self.buffer_mut()[0..size as usize].clone_from_slice(&data[0..size as usize]);
52        self.advance(size as usize);
53    }
54
55    #[inline]
56    fn encode_uint64(&mut self, n: u64) {
57        let (data, size) = varint_simd::encode(n);
58        self.buffer_mut()[0..size as usize].clone_from_slice(&data[0..size as usize]);
59        self.advance(size as usize);
60    }
61
62    #[inline]
63    fn encode_sfixed32(&mut self, n: i32) {
64        self.buffer_mut()[0..std::mem::size_of::<i32>()].clone_from_slice(&n.to_le_bytes());
65        self.advance(std::mem::size_of::<i32>());
66    }
67
68    #[inline]
69    fn encode_sfixed64(&mut self, n: i64) {
70        self.buffer_mut()[0..std::mem::size_of::<i64>()].clone_from_slice(&n.to_le_bytes());
71        self.advance(std::mem::size_of::<i64>());
72    }
73
74    #[inline]
75    fn encode_fixed32(&mut self, n: u32) {
76        self.buffer_mut()[0..std::mem::size_of::<u32>()].clone_from_slice(&n.to_le_bytes());
77        self.advance(std::mem::size_of::<u32>());
78    }
79
80    #[inline]
81    fn encode_fixed64(&mut self, n: u64) {
82        self.buffer_mut()[0..std::mem::size_of::<u64>()].clone_from_slice(&n.to_le_bytes());
83        self.advance(std::mem::size_of::<u64>());
84    }
85
86    #[inline]
87    fn encode_float(&mut self, n: f32) {
88        self.buffer_mut()[0..std::mem::size_of::<f32>()].clone_from_slice(&n.to_le_bytes());
89        self.advance(std::mem::size_of::<f32>());
90    }
91
92    #[inline]
93    fn encode_double(&mut self, n: f64) {
94        self.buffer_mut()[0..std::mem::size_of::<f64>()].clone_from_slice(&n.to_le_bytes());
95        self.advance(std::mem::size_of::<f64>());
96    }
97
98    #[inline]
99    fn encode_bytes(&mut self, b: &[u8]) {
100        let len = b.len();
101        #[allow(clippy::cast_possible_truncation)]
102        self.encode_int32(len as i32);
103        self.buffer_mut()[0..len].clone_from_slice(b);
104        self.advance(len);
105    }
106}
107
108#[derive(Debug, Default)]
109pub(crate) struct SizeHint {
110    size: usize,
111}
112
113impl SizeHint {
114    #[inline]
115    pub fn size(&self) -> usize {
116        self.size
117    }
118}
119
120impl Encode for SizeHint {
121    #[inline]
122    fn encode_sint32(&mut self, n: i32) {
123        let (_, size) = varint_simd::encode_zigzag(n);
124        self.size += size as usize;
125    }
126
127    #[inline]
128    fn encode_sint64(&mut self, n: i64) {
129        let (_, size) = varint_simd::encode_zigzag(n);
130        self.size += size as usize;
131    }
132
133    #[inline]
134    fn encode_uint32(&mut self, n: u32) {
135        let (_, size) = varint_simd::encode(n);
136        self.size += size as usize;
137    }
138
139    #[inline]
140    fn encode_uint64(&mut self, n: u64) {
141        let (_, size) = varint_simd::encode(n);
142        self.size += size as usize;
143    }
144
145    #[inline]
146    fn encode_sfixed32(&mut self, _n: i32) {
147        self.size += std::mem::size_of::<i32>();
148    }
149
150    #[inline]
151    fn encode_sfixed64(&mut self, _n: i64) {
152        self.size += std::mem::size_of::<i64>();
153    }
154
155    #[inline]
156    fn encode_fixed32(&mut self, _n: u32) {
157        self.size += std::mem::size_of::<u32>();
158    }
159
160    #[inline]
161    fn encode_fixed64(&mut self, _n: u64) {
162        self.size += std::mem::size_of::<u64>();
163    }
164
165    #[inline]
166    fn encode_float(&mut self, _n: f32) {
167        self.size += std::mem::size_of::<f32>();
168    }
169
170    #[inline]
171    fn encode_double(&mut self, _n: f64) {
172        self.size += std::mem::size_of::<f64>();
173    }
174
175    #[inline]
176    fn encode_bytes(&mut self, b: &[u8]) {
177        #[allow(clippy::cast_possible_truncation)]
178        self.encode_int32(b.len() as i32);
179        self.size += b.len();
180    }
181}