1use crate::serde::error::DataError;
2use anyhow::{ensure, Result};
3use auto_impl::auto_impl;
4use serde::Serialize;
5use std::mem::size_of;
6use std::ops::{Deref, DerefMut};
7
8#[auto_impl(&, &mut,Box)]
9pub trait WriteNumberFixed {
10 fn write(&self, data: &mut Data);
11 fn write_at(&self, idx: usize, data: &mut Data) -> Result<()>;
12}
13#[auto_impl(&, &mut,Box)]
14pub trait WriteNumberVar {
15 fn write(&self, data: &mut Data);
16}
17
18#[derive(Debug, Default)]
19pub struct Data {
20 buff: Vec<u8>,
21 pub mode: u8,
22}
23
24macro_rules! impl_number_fixed {
25 ($type:ty) => {
26 impl WriteNumberFixed for $type {
27 #[cfg(not(feature = "big_endian"))]
28 #[inline]
29 fn write(&self, data: &mut Data) {
30 unsafe {
31 let size = size_of::<$type>();
32 let len = data.check_reserve(size);
33 std::ptr::copy_nonoverlapping(
34 self.to_le_bytes().as_ptr(),
35 data.as_mut_ptr().add(len),
36 size,
37 );
38 data.buff.set_len(len.wrapping_add(size));
39 }
40 }
41 #[cfg(not(feature = "big_endian"))]
42 #[inline]
43 fn write_at(&self, idx: usize, data: &mut Data) -> Result<()> {
44 unsafe {
45 let size = size_of::<$type>();
46 ensure!(
47 idx.wrapping_add(size) <= data.len(),
48 "idx too max {}>{}",
49 idx.wrapping_add(size),
50 data.len()
51 );
52 std::ptr::copy_nonoverlapping(
53 self.to_le_bytes().as_ptr(),
54 data.as_mut_ptr().add(idx),
55 size,
56 );
57 Ok(())
58 }
59 }
60
61 #[cfg(feature = "big_endian")]
62 #[inline]
63 fn write(&self, data: &mut Data) {
64 unsafe {
65 let size = size_of::<$type>();
66 let len = data.check_reserve(size);
67 std::ptr::copy_nonoverlapping(
68 self.to_be_bytes().as_ptr(),
69 data.as_mut_ptr().add(len),
70 size,
71 );
72 data.buff.set_len(len.wrapping_add(size));
73 }
74 }
75 #[cfg(feature = "big_endian")]
76 #[inline]
77 fn write_at(&self, idx: usize, data: &mut Data) -> Result<()> {
78 unsafe {
79 let size = size_of::<$type>();
80 ensure!(
81 idx.wrapping_add(size) <= data.len(),
82 "idx too max {}>{}",
83 idx.wrapping_add(size),
84 data.len()
85 );
86 std::ptr::copy_nonoverlapping(
87 self.to_be_bytes().as_ptr(),
88 data.as_mut_ptr().add(idx),
89 size,
90 );
91 Ok(())
92 }
93 }
94 }
95 };
96}
97
98impl_number_fixed!(u8);
99impl_number_fixed!(i8);
100impl_number_fixed!(i16);
101impl_number_fixed!(u16);
102impl_number_fixed!(i32);
103impl_number_fixed!(u32);
104impl_number_fixed!(i64);
105impl_number_fixed!(u64);
106impl_number_fixed!(i128);
107impl_number_fixed!(u128);
108impl_number_fixed!(f32);
109impl_number_fixed!(f64);
110
111impl WriteNumberFixed for bool {
112 #[inline]
113 fn write(&self, data: &mut Data) {
114 let v = if *self { 1u8 } else { 0u8 };
115 data.write_fixed(v);
116 }
117
118 fn write_at(&self, idx: usize, data: &mut Data) -> Result<()> {
119 let v = if *self { 1u8 } else { 0u8 };
120 data.write_fixed_at(idx, v)
121 }
122}
123
124impl WriteNumberFixed for String {
125 #[inline]
126 fn write(&self, data: &mut Data) {
127 let buff = self.as_bytes();
128 data.write_fixed(buff.len() as u32);
129 data.write_buf(buff);
130 }
131
132 #[inline]
133 fn write_at(&self, idx: usize, data: &mut Data) -> Result<()> {
134 let buff = self.as_bytes();
135 data.write_fixed_at(idx, buff.len() as u32)?;
136 data.write_buf_at(idx + 4, buff)?;
137 Ok(())
138 }
139}
140
141impl WriteNumberFixed for &str {
142 #[inline]
143 fn write(&self, data: &mut Data) {
144 let buff = self.as_bytes();
145 data.write_fixed(buff.len() as u32);
146 data.write_buf(buff);
147 }
148
149 #[inline]
150 fn write_at(&self, idx: usize, data: &mut Data) -> Result<()> {
151 let buff = self.as_bytes();
152 data.write_fixed_at(idx, buff.len() as u32)?;
153 data.write_buf_at(idx + 4, buff)?;
154 Ok(())
155 }
156}
157
158impl<'a> WriteNumberFixed for &'a [u8] {
159 #[inline]
160 fn write(&self, data: &mut Data) {
161 let len = self.len() as u32;
162 data.write_fixed(len);
163 data.write_buf(self);
164 }
165
166 #[inline]
167 fn write_at(&self, idx: usize, data: &mut Data) -> Result<()> {
168 let len = self.len() as u32;
169 data.write_fixed_at(idx, len)?;
170 data.write_buf_at(idx + 4, self)?;
171 Ok(())
172 }
173}
174
175impl WriteNumberFixed for Vec<u8> {
176 fn write(&self, data: &mut Data) {
177 data.write_fixed(self.len() as u32);
178 data.write_buf(self);
179 }
180
181 fn write_at(&self, idx: usize, data: &mut Data) -> Result<()> {
182 data.write_fixed_at(idx, self.len() as u32)?;
183 data.write_buf_at(idx + 4, self)?;
184 Ok(())
185 }
186}
187
188impl WriteNumberVar for u16 {
189 #[inline]
190 fn write(&self, data: &mut Data) {
191 let mut value = *self;
192 let size = compute_raw_varint64_size(value as u64);
193 let current_len = data.check_reserve(size);
194 unsafe {
195 let mut len: usize = 1;
196 let mut ptr = data.as_mut_ptr().add(current_len);
197 while value >= 1 << 7 {
198 ptr.write((value & 0x7f | 0x80) as u8);
199 ptr = ptr.offset(1);
200 len += 1;
201 value >>= 7;
202 }
203 ptr.write(value as u8);
204 data.set_len(current_len + len);
205 }
206 }
207}
208impl WriteNumberVar for i16 {
209 #[inline]
210 fn write(&self, data: &mut Data) {
211 WriteNumberVar::write(&zig_zag_encode_u16(self), data);
212 }
213}
214impl WriteNumberVar for u32 {
215 #[inline]
216 fn write(&self, data: &mut Data) {
217 let mut value = *self;
218 let size = compute_raw_varint32_size(value);
219 let current_len = data.check_reserve(size);
220 unsafe {
221 let mut len: usize = 1;
222 let mut ptr = data.as_mut_ptr().add(current_len);
223 while value >= 1 << 7 {
224 ptr.write((value & 0x7f | 0x80) as u8);
225 ptr = ptr.offset(1);
226 len += 1;
227 value >>= 7;
228 }
229 ptr.write(value as u8);
230 data.set_len(current_len + len);
231 }
232 }
233}
234impl WriteNumberVar for i32 {
235 #[inline]
236 fn write(&self, data: &mut Data) {
237 WriteNumberVar::write(&zig_zag_encode_u32(self), data);
238 }
239}
240impl WriteNumberVar for u64 {
241 #[inline]
242 fn write(&self, data: &mut Data) {
243 let mut value = *self;
244 let size = compute_raw_varint64_size(value);
245 let current_len = data.check_reserve(size);
246 unsafe {
247 let mut len: usize = 1;
248 let mut ptr = data.as_mut_ptr().add(current_len);
249 while value >= 1 << 7 {
250 ptr.write((value & 0x7f | 0x80) as u8);
251 ptr = ptr.offset(1);
252 len += 1;
253 value >>= 7;
254 }
255 ptr.write(value as u8);
256 data.set_len(current_len + len);
257 }
258 }
259}
260impl WriteNumberVar for i64 {
261 #[inline]
262 fn write(&self, data: &mut Data) {
263 WriteNumberVar::write(&zig_zag_encode_u64(self), data);
264 }
265}
266
267#[inline(always)]
268fn zig_zag_encode_u16(v: &i16) -> u16 {
269 ((v << 1) ^ (v >> 15)) as u16
270}
271#[inline(always)]
272fn zig_zag_encode_u32(v: &i32) -> u32 {
273 ((v << 1) ^ (v >> 31)) as u32
274}
275#[inline(always)]
276fn zig_zag_encode_u64(v: &i64) -> u64 {
277 ((v << 1) ^ (v >> 63)) as u64
278}
279
280impl WriteNumberVar for String {
281 #[inline]
282 fn write(&self, data: &mut Data) {
283 let buff = self.as_bytes();
284 data.write_var_integer(buff.len() as u64);
285 data.write_buf(buff);
286 }
287}
288impl WriteNumberVar for &str {
289 #[inline]
290 fn write(&self, data: &mut Data) {
291 let buff = self.as_bytes();
292 data.write_var_integer(buff.len() as u64);
293 data.write_buf(buff);
294 }
295}
296
297impl WriteNumberVar for &[u8] {
298 #[inline]
299 fn write(&self, data: &mut Data) {
300 let len = self.len() as u64;
301 data.write_var_integer(len);
302 data.write_buf(self);
303 }
304}
305
306impl WriteNumberVar for Vec<u8> {
307 #[inline]
308 fn write(&self, data: &mut Data) {
309 let len = self.len() as u64;
310 data.write_var_integer(len);
311 data.write_buf(self);
312 }
313}
314
315impl Data {
316 #[inline]
317 pub fn new() -> Self {
318 Data {
319 buff: Vec::with_capacity(4096),
320 mode: 0,
321 }
322 }
323
324 #[inline]
325 pub fn with_len(len: usize, default: u8) -> Self {
326 let mut data = Data::new();
327 data.resize(len, default);
328 data
329 }
330
331 #[inline]
332 pub fn with_capacity(cap: usize) -> Data {
333 Data {
334 buff: Vec::with_capacity(cap),
335 mode: 0,
336 }
337 }
338
339 #[inline]
340 pub fn serialize<T: Serialize>(value: T) -> Result<Self, DataError> {
341 let mut data = Data::new();
342 data.serde_serialize(value)?;
343 Ok(data)
344 }
345
346 #[inline]
347 pub fn into_inner(self) -> Vec<u8> {
348 self.buff
349 }
350
351 #[inline]
352 pub fn write_buf(&mut self, buff: &[u8]) {
353 unsafe {
354 let size = buff.len();
355 let len = self.check_reserve(size);
356 std::ptr::copy_nonoverlapping(buff.as_ptr(), self.as_mut_ptr().add(len), size);
357 self.set_len(len.wrapping_add(size));
358 }
359 }
360
361 #[inline]
362 pub fn write_buf_at(&mut self, idx: usize, buff: &[u8]) -> Result<()> {
363 let size = buff.len();
364 ensure!(
365 idx.wrapping_add(size) <= self.len(),
366 "idx too max {}>{}",
367 idx.wrapping_add(size),
368 self.len()
369 );
370 unsafe {
371 std::ptr::copy_nonoverlapping(buff.as_ptr(), self.as_mut_ptr().add(idx), size);
372 }
373 Ok(())
374 }
375
376 #[inline]
377 pub fn write_fixed(&mut self, v: impl WriteNumberFixed) {
378 v.write(self)
379 }
380
381 #[inline]
382 pub fn write_fixed_at(&mut self, idx: usize, v: impl WriteNumberFixed) -> Result<()> {
383 v.write_at(idx, self)
384 }
385
386 #[inline]
387 pub fn write_var_integer(&mut self, v: impl WriteNumberVar) {
388 v.write(self);
389 }
390
391 #[inline]
392 pub fn check_reserve(&mut self, size: usize) -> usize {
393 let len = self.len();
394 let cap = self.capacity();
395 if size.wrapping_add(len) > cap {
396 self.reserve(size.wrapping_add(len));
397 }
398 len
399 }
400}
401
402impl From<Data> for Vec<u8> {
403 #[inline]
404 fn from(val: Data) -> Self {
405 val.buff
406 }
407}
408
409impl Deref for Data {
410 type Target = Vec<u8>;
411
412 #[inline]
413 fn deref(&self) -> &Self::Target {
414 &self.buff
415 }
416}
417
418impl DerefMut for Data {
419 #[inline]
420 fn deref_mut(&mut self) -> &mut Self::Target {
421 &mut self.buff
422 }
423}
424
425impl AsRef<[u8]> for Data {
426 #[inline]
427 fn as_ref(&self) -> &[u8] {
428 &self.buff
429 }
430}
431
432#[inline(always)]
434pub fn compute_raw_varint64_size(value: u64) -> usize {
435 if (value & (0xffffffffffffffffu64 << 7)) == 0 {
436 return 1;
437 }
438 if (value & (0xffffffffffffffffu64 << 14)) == 0 {
439 return 2;
440 }
441 if (value & (0xffffffffffffffffu64 << 21)) == 0 {
442 return 3;
443 }
444 if (value & (0xffffffffffffffffu64 << 28)) == 0 {
445 return 4;
446 }
447 if (value & (0xffffffffffffffffu64 << 35)) == 0 {
448 return 5;
449 }
450 if (value & (0xffffffffffffffffu64 << 42)) == 0 {
451 return 6;
452 }
453 if (value & (0xffffffffffffffffu64 << 49)) == 0 {
454 return 7;
455 }
456 if (value & (0xffffffffffffffffu64 << 56)) == 0 {
457 return 8;
458 }
459 if (value & (0xffffffffffffffffu64 << 63)) == 0 {
460 return 9;
461 }
462 10
463}
464
465#[inline(always)]
467pub fn compute_raw_varint32_size(value: u32) -> usize {
468 compute_raw_varint64_size(value as u64)
469}
470
471impl From<Vec<u8>> for Data {
472 fn from(buff: Vec<u8>) -> Self {
473 Data { buff, mode: 0 }
474 }
475}