gin_tonic_core/
encoder.rs1use 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}