Skip to main content

expry/
raw_utils.rs

1#![allow(dead_code)]
2#![cfg_attr(not(feature = "std"), no_std)]
3
4use core::convert::Infallible;
5use std::fmt::Display;
6
7// from https://github.com/mzabaluev/unwrap-infallible/blob/master/src/lib.rs
8/// Unwrapping an infallible result into its success value.
9pub trait UnwrapInfallible {
10    /// Type of the `Ok` variant of the result.
11    type Ok;
12
13    /// Unwraps a result, returning the content of an `Ok`.
14    ///
15    /// Unlike `Result::unwrap`, this method is known to never panic
16    /// on the result types it is implemented for. Therefore, it can be used
17    /// instead of `unwrap` as a maintainability safeguard that will fail
18    /// to compile if the error type of the `Result` is later changed
19    /// to an error that can actually occur.
20    fn unwrap_infallible(self) -> Self::Ok;
21}
22impl<T> UnwrapInfallible for Result<T, Infallible> {
23    type Ok = T;
24    fn unwrap_infallible(self) -> T {
25        self.unwrap_or_else(|never| match never {})
26    }
27}
28
29#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)]
30pub struct MoreInputExpected {
31}
32impl std::error::Error for MoreInputExpected {
33}
34impl Display for MoreInputExpected {
35    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
36        write!(f, "MoreInputExpected")
37    }
38}
39
40#[derive(Debug, Copy, Clone, PartialEq, Eq)]
41pub struct EncodingError {
42    pub line_nr: u32,
43}
44#[allow(clippy::new_without_default)]
45impl EncodingError {
46    #[track_caller]
47    pub fn new() -> Self {
48        let location = core::panic::Location::caller();
49        Self {
50            line_nr: location.line(),
51        }
52    }
53}
54impl std::error::Error for EncodingError {
55}
56impl Display for EncodingError {
57    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
58        write!(f, "EncodingError at line {}", self.line_nr)
59    }
60}
61
62impl From<MoreInputExpected> for EncodingError {
63    #[track_caller]
64    fn from(_: MoreInputExpected) -> Self {
65        let location = core::panic::Location::caller();
66        Self {
67            line_nr: location.line(),
68        }
69    }
70}
71
72fn raw_read_bytes(reader: &[u8], size: usize) -> Result<(&[u8], &[u8]), MoreInputExpected> {
73    if reader.len() < size {
74        return Err(MoreInputExpected::default());
75    }
76    let value = &reader[0..size];
77    Ok((value, &reader[size..]))
78}
79fn raw_read_f32(reader: &[u8]) -> Result<(f32, &[u8]), MoreInputExpected> {
80    if reader.len() < 4 {
81        return Err(MoreInputExpected::default());
82    }
83    let mut array : [u8; 4] = reader[0..4]
84        .try_into()
85        .expect("not enough bytes for 4-byte float");
86    array.reverse();
87    let f = f32::from_le_bytes(array);
88    Ok((f, &reader[4..]))
89}
90fn raw_read_f64(reader: &[u8]) -> Result<(f64, &[u8]), MoreInputExpected> {
91    if reader.len() < 8 {
92        return Err(MoreInputExpected::default());
93    }
94    let mut array : [u8; 8] = reader[0..8]
95        .try_into()
96        .expect("not enough bytes for 8-byte float");
97    array.reverse();
98    let f = f64::from_le_bytes(array);
99    Ok((f, &reader[8..]))
100}
101fn raw_read_u8(reader: &[u8]) -> Result<(u8, &[u8]), MoreInputExpected> {
102    if reader.is_empty() {
103        return Err(MoreInputExpected::default());
104    }
105    let value = reader[0];
106    Ok((value, &reader[1..]))
107}
108pub fn remaining_length_of_var_int(first: u8) -> usize {
109    if (first & 0b10000000) == 0 {
110        return 0;
111    }
112    if (first & 0b11000000) == 0b10000000 {
113        return 1;
114    }
115    if (first & 0b11100000) == 0b11000000 {
116        return 2;
117    }
118    if (first & 0b11110000) == 0b11100000 {
119        return 3;
120    }
121    if (first & 0b11111000) == 0b11110000 {
122        return 4;
123    }
124    if (first & 0b11111100) == 0b11111000 {
125        return 5;
126    }
127    if (first & 0b11111110) == 0b11111100 {
128        return 6;
129    }
130    if first == 0b11111110 {
131        return 7;
132    }
133    8
134}
135pub fn raw_read_var_u64(reader: &[u8]) -> Result<(u64,&[u8]), MoreInputExpected> {
136    // optimize common cases
137    // if reader.len() >= 4 {
138    //     let first = reader[0] as u64;
139    //     if (first & 0b10000000) == 0 {
140    //         return Ok((first, &reader[1..]));
141    //     }
142    //     if (first & 0b11000000) == 0b10000000 {
143    //         return Ok((((first & 0b00111111) << 8) | reader[1] as u64, &reader[2..]));
144    //     }
145    //     if (first & 0b11100000) == 0b11000000 {
146    //         return Ok((
147    //             ((first & 0b00011111) << 16) | (reader[1] as u64) << 8 | (reader[2] as u64),
148    //             &reader[3..],
149    //         ));
150    //     }
151    //     if (first & 0b11110000) == 0b11100000 {
152    //         return Ok((
153    //             ((first & 0b00001111) << 24)
154    //                 | (reader[1] as u64) << 16
155    //                 | (reader[2] as u64) << 8
156    //                 | (reader[3] as u64),
157    //             &reader[4..],
158    //         ));
159    //     }
160    // }
161    let first = if let Some(first) = reader.first() {
162        *first as u64
163    } else {
164        return Err(MoreInputExpected::default());
165    };
166    // inspired by unicode. First bits indicate the length:
167    // if first bit is 0 -> length is 1 byte
168    // if first two bits are 10 -> length is 2 bytes
169    // if first three bits are 110 -> length is 3 bytes
170    // ...
171    // if all 8 bytes are 1's -> length is 9 bytes (so 64-bits int fits)
172    if (first & 0b10000000) == 0 {
173        return Ok((first,&reader[1..]));
174    }
175    // if size_of::<T>() < 2 {
176    //     return Err(EncodingError {});
177    // }
178    if (first & 0b11000000) == 0b10000000 {
179        if reader.len() < 2 {
180            return Err(MoreInputExpected::default());
181        }
182        let value = ((first & 0b00111111) << 8) | reader[1] as u64;
183        return Ok((value,&reader[2..]));
184    }
185    // if size_of::<T>() < 4 {
186    //     return Err(EncodingError {});
187    // }
188    if (first & 0b11100000) == 0b11000000 {
189        if reader.len() < 3 {
190            return Err(MoreInputExpected::default());
191        }
192        let value = ((first & 0b00011111) << 16) | (reader[1] as u64) << 8 | (reader[2] as u64);
193        return Ok((value,&reader[3..]));
194    }
195    if (first & 0b11110000) == 0b11100000 {
196        if reader.len() < 4 {
197            return Err(MoreInputExpected::default());
198        }
199        let value = ((first & 0b00001111) << 24)
200                | (reader[1] as u64) << 16
201                | (reader[2] as u64) << 8
202                | (reader[3] as u64);
203        return Ok((value,&reader[4..]));
204    }
205    // if size_of::<T>() < 8 {
206    //     return Err(EncodingError{});
207    // }
208    if (first & 0b11111000) == 0b11110000 {
209        if reader.len() < 5 {
210            return Err(MoreInputExpected::default());
211        }
212        let value = ((first & 0b00000111) << 32)
213                | (reader[1] as u64) << 24
214                | (reader[2] as u64) << 16
215                | (reader[3] as u64) << 8
216                | (reader[4] as u64);
217        return Ok((value,&reader[5..]));
218    }
219    if (first & 0b11111100) == 0b11111000 {
220        if reader.len() < 6 {
221            return Err(MoreInputExpected::default());
222        }
223        let value = ((first & 0b00000011) << 40)
224                | (reader[1] as u64) << 32
225                | (reader[2] as u64) << 24
226                | (reader[3] as u64) << 16
227                | (reader[4] as u64) << 8
228                | (reader[5] as u64);
229        return Ok((value,&reader[6..]));
230    }
231    if (first & 0b11111110) == 0b11111100 {
232        if reader.len() < 7 {
233            return Err(MoreInputExpected::default());
234        }
235        let value = ((first & 0b00000001) << 48)
236                | (reader[1] as u64) << 40
237                | (reader[2] as u64) << 32
238                | (reader[3] as u64) << 24
239                | (reader[4] as u64) << 16
240                | (reader[5] as u64) << 8
241                | (reader[6] as u64);
242        return Ok((value,&reader[7..]));
243    }
244    if first == 0b11111110 {
245        if reader.len() < 8 {
246            return Err(MoreInputExpected::default());
247        }
248        let value = (reader[1] as u64) << 48
249                | (reader[2] as u64) << 40
250                | (reader[3] as u64) << 32
251                | (reader[4] as u64) << 24
252                | (reader[5] as u64) << 16
253                | (reader[6] as u64) << 8
254                | (reader[7] as u64);
255        return Ok((value,&reader[8..]));
256    }
257    if reader.len() < 9 {
258        return Err(MoreInputExpected::default());
259    }
260    let value = u64::from_be_bytes(reader[1..9].try_into().unwrap());
261    Ok((value,&reader[9..]))
262}
263
264fn raw_read_u64(reader: &[u8], size: usize) -> Result<(u64,&[u8]), MoreInputExpected> {
265    if size > 8 || reader.len() < size {
266        return Err(MoreInputExpected::default());
267    }
268    let mut copy = [0u8; 8];
269    let offset = 8 - size;
270    copy[offset..8].copy_from_slice(&reader[0..size]);
271    let value = u64::from_be_bytes(copy);
272    Ok((value,&reader[size..]))
273}
274
275fn sign_extend(x: i64, nbits: u32) -> i64 {
276    debug_assert!(nbits <= 64);
277	let notherbits = core::mem::size_of_val(&x) as u32 * 8 - nbits;
278  	x.wrapping_shl(notherbits).wrapping_shr(notherbits)
279}
280
281fn raw_read_i64(reader: &[u8], size: usize) -> Result<(i64,&[u8]), MoreInputExpected> {
282    if size > 8 || reader.len() < size {
283        return Err(MoreInputExpected::default());
284    }
285    let mut copy = [0u8; 8];
286    let offset = 8 - size;
287    copy[offset..8].copy_from_slice(&reader[0..size]);
288    let value = i64::from_be_bytes(copy);
289    Ok((sign_extend(value, (size as u32) * 8),&reader[size..]))
290}
291
292fn raw_read_var_i64(reader: &[u8]) -> Result<(i64, &[u8]), MoreInputExpected> {
293    let first = reader[0] as u64;
294    let (v,reader) = raw_read_var_u64(reader)?;
295    let bits = if (first & 0b10000000) == 0 {
296        7
297    } else if (first & 0b11000000) == 0b10000000 {
298        14
299    } else if (first & 0b11100000) == 0b11000000 {
300        21
301    } else if (first & 0b11110000) == 0b11100000 {
302        28
303    } else if (first & 0b11111000) == 0b11110000 {
304        35
305    } else if (first & 0b11111100) == 0b11111000 {
306        42
307    } else if (first & 0b11111110) == 0b11111100 {
308        49
309    } else if (first & 0b11111111) == 0b11111110 {
310        56
311    } else {
312        64
313    };
314    Ok((sign_extend(v as i64, bits),reader))
315}
316
317/// Helper to easily read binary values from an u8-slice, triggering EncodingError on
318/// out-of-bounds errors.
319#[derive(Eq, PartialEq, Copy, Clone)]
320pub struct RawReader<'a> {
321    data: &'a [u8],
322}
323
324impl<'a> RawReader<'a> {
325    pub fn with<'b>(data: &'b [u8]) -> Self where 'b: 'a {
326        Self { data, }
327    }
328
329    pub fn read_u8(&mut self) -> Result<u8,MoreInputExpected> {
330        let (v,r) = raw_read_u8(self.data)?;
331        self.data = r;
332        Ok(v)
333    }
334
335    pub fn read_u64(&mut self, len: usize) -> Result<u64,MoreInputExpected> {
336        let (v,r) = raw_read_u64(self.data, len)?;
337        self.data = r;
338        Ok(v)
339    }
340    pub fn read_i64(&mut self, len: usize) -> Result<i64,MoreInputExpected> {
341        let (v,r) = raw_read_i64(self.data, len)?;
342        self.data = r;
343        Ok(v)
344    }
345    pub fn read_var_u64(&mut self) -> Result<u64,MoreInputExpected> {
346        let (v,r) = raw_read_var_u64(self.data)?;
347        self.data = r;
348        Ok(v)
349    }
350
351    pub fn read_var_i64(&mut self) -> Result<i64,MoreInputExpected> {
352        let (v,r) = raw_read_var_i64(self.data)?;
353        self.data = r;
354        Ok(v)
355    }
356
357    pub fn read_bytes(&mut self, len: usize) -> Result<&'a [u8],MoreInputExpected> {
358        let (v,r) = raw_read_bytes(self.data, len)?;
359        self.data = r;
360        Ok(v)
361    }
362
363    pub fn len(&self) -> usize {
364        self.data.len()
365    }
366
367    pub fn is_empty(&self) -> bool {
368        self.data.is_empty()
369    }
370
371    pub fn read_f32(&mut self) -> Result<f32,MoreInputExpected> {
372        let (v,r) = raw_read_f32(self.data)?;
373        self.data = r;
374        Ok(v)
375    }
376
377    pub fn read_f64(&mut self) -> Result<f64,MoreInputExpected> {
378        let (v,r) = raw_read_f64(self.data)?;
379        self.data = r;
380        Ok(v)
381    }
382
383    pub fn read_var_bytes(&mut self) -> Result<&'a [u8],MoreInputExpected> {
384        let length = self.read_var_u64()?;
385        self.read_bytes(length as usize)
386    }
387
388    pub fn skip(&mut self, length: usize) -> Result<(), MoreInputExpected> {
389        if length > self.data.len() {
390            return Err(MoreInputExpected::default());
391        }
392        self.data = &self.data[length..];
393        Ok(())
394    }
395
396    pub fn data(&self) -> &'a [u8] {
397        self.data
398    }
399
400    pub fn truncate(&mut self, max: usize) {
401        if self.data.len() > max {
402            self.data = &self.data[0..max];
403        }
404    }
405}
406
407pub const fn size_of_i64(i: i64) -> usize {
408    if -0x80 <= i && i <= 0x7F {
409        return 1;
410    }
411    if -0x8000 <= i && i <= 0x7FFF {
412        return 2;
413    }
414    if -0x800000 <= i && i <= 0x7FFFFF {
415        return 3;
416    }
417    if -0x80000000 <= i && i <= 0x7FFFFFFF {
418        return 4;
419    }
420    if -0x8000000000 <= i && i <= 0x7FFFFFFFFF {
421        return 5;
422    }
423    if -0x800000000000 <= i && i <= 0x7FFFFFFFFFFF {
424        return 6;
425    }
426    if -0x80000000000000 <= i && i <= 0x7FFFFFFFFFFFFF {
427        return 7;
428    }
429    8
430}
431
432pub const fn size_of_var_i64(i: i64) -> usize {
433    if -0x40 <= i && i <= 0x3F {
434        return 1;
435    }
436    if -0x2000 <= i && i <= 0x1FFF {
437        return 2;
438    }
439    if -0x100000 <= i && i <= 0x0FFFFF {
440        return 3;
441    }
442    if -0x08000000 <= i && i <= 0x07FFFFFF {
443        return 4;
444    }
445    if -0x0400000000 <= i && i <= 0x03FFFFFFFF {
446        return 5;
447    }
448    if -0x020000000000 <= i && i <= 0x01FFFFFFFFFF {
449        return 6;
450    }
451    if -0x01000000000000 <= i && i <= 0x00FFFFFFFFFFFF {
452        return 7;
453    }
454    if -0x0080000000000000 <= i && i <= 0x007FFFFFFFFFFFFF {
455        return 8;
456    }
457    9
458}
459
460pub const fn size_of_var_u64(i: u64) -> usize {
461    if i <= 0x7F {
462        return 1;
463    }
464    if i <= 0x3FFF {
465        return 2;
466    }
467    if i <= 0x1FFFFF {
468        return 3;
469    }
470    if i <= 0x0FFFFFFF {
471        return 4;
472    }
473    if i <= 0x07FFFFFFFF {
474        return 5;
475    }
476    if i <= 0x03FFFFFFFFFF {
477        return 6;
478    }
479    if i <= 0x01FFFFFFFFFFFF {
480        return 7;
481    }
482    if i <= 0x00FFFFFFFFFFFFFF {
483        return 8;
484    }
485    9
486}
487
488pub fn size_of_var_bytes(s: &[u8]) -> usize {
489    size_of_var_u64(s.len() as u64) + s.len()
490}
491
492fn write_var_u64(data: &mut [u8], i: u64) {
493    let len = data.len();
494    match len {
495        1 => {
496            data[0] = i as u8;
497            return;
498        },
499        2 => {
500            data[0] = (i >> 8) as u8 | 0b10000000;
501        },
502        3 => {
503            data[0] = (i >> 16) as u8 | 0b11000000;
504        },
505        4 => {
506            data[0] = (i >> 24) as u8 | 0b11100000;
507        },
508        5 => {
509            data[0] = (i >> 32) as u8 | 0b11110000;
510        },
511        6 => {
512            data[0] = (i >> 40) as u8 | 0b11111000;
513        },
514        7 => {
515            data[0] = (i >> 48) as u8 | 0b11111100;
516        },
517        8 => {
518            data[0] = (i >> 56) as u8 | 0b11111110;
519        },
520        9 => {
521            data[0] = 0xFF;
522        },
523        _ => {
524            panic!("write_var_u64() should always be called with 1 <= len <= 9");
525        },
526    }
527    data[1..len].copy_from_slice(&i.to_be_bytes()[9-len..8]);
528}
529
530pub struct ToRawUnsignedVar {
531    data: [u8; 9],
532    len: u8,
533}
534
535impl ToRawUnsignedVar {
536    pub fn with(number: u64) -> Self {
537        let mut data = [0; 9];
538        let len = size_of_var_u64(number);
539        write_var_u64(&mut data[0..len], number);
540        Self { data, len: len as u8 }
541    }
542}
543
544impl core::ops::Deref for ToRawUnsignedVar {
545    type Target = [u8];
546
547    fn deref(&self) -> &Self::Target {
548        &self.data[0..self.len as usize]
549    }
550}
551
552pub trait RawOutput<E> {
553    fn write_u8(&mut self, n: u8) -> Result<(),E>;
554    fn write_i64(&mut self, n: i64, size: usize) -> Result<(),E>;
555    fn write_u64(&mut self, i: u64, size: usize) -> Result<(),E>;
556    fn write_var_i64(&mut self, i: i64) -> Result<(),E>;
557    fn write_var_u64(&mut self, i: u64) -> Result<(),E>;
558    fn write_f32(&mut self, f: f32) -> Result<(),E>;
559    fn write_f64(&mut self, f: f64) -> Result<(),E>;
560    fn write_bytes(&mut self, s: &[u8]) -> Result<(),E>;
561    fn write_var_bytes(&mut self, s: &[u8]) -> Result<(),E>;
562    fn swap_range(&mut self, a: usize, b: usize) -> Result<(),E>;
563    fn pos(&self) -> usize;
564}
565
566pub fn write_with_header<T,E,E2,Output,Header,Body>(writer: &mut Output, header: Header, body: Body) -> Result<T,E2>
567where
568    Output: RawOutput<E>,
569    Header: FnOnce(&mut Output, u64) -> Result<(),E>,
570    Body: FnOnce(&mut Output) -> Result<T,E2>,
571    E2: std::convert::From<E>,
572{
573    let start = writer.pos();
574    let retval = body(writer)?;
575    let end = writer.pos();
576    let length = end - start;
577    header(writer, length as u64)?;
578    writer.swap_range(start, end)?;
579    Ok(retval)
580}
581
582
583pub struct RawWriterLength {
584    len: usize,
585}
586
587impl RawWriterLength {
588    pub const fn new() -> Self { Self { len: 0 } }
589
590    pub const fn length(&self) -> usize {
591        self.len
592    }
593}
594
595impl Default for RawWriterLength {
596    fn default() -> Self {
597        Self::new()
598    }
599}
600
601impl RawOutput<Infallible> for RawWriterLength {
602    fn write_u8(&mut self, _: u8) -> Result<(),Infallible> {
603        self.len += 1;
604        Ok(())
605    }
606    fn write_i64(&mut self, _: i64, size: usize) -> Result<(),Infallible> {
607        self.len += size;
608        Ok(())
609    }
610
611    fn write_u64(&mut self, _: u64, size: usize) -> Result<(),Infallible> {
612        self.len += size;
613        Ok(())
614    }
615
616    fn write_var_i64(&mut self, i: i64) -> Result<(),Infallible> {
617        self.len += size_of_var_i64(i);
618        Ok(())
619    }
620
621    fn write_var_u64(&mut self, i: u64) -> Result<(),Infallible> {
622        self.len += size_of_var_u64(i);
623        Ok(())
624    }
625
626    fn write_f32(&mut self, _: f32) -> Result<(),Infallible> {
627        self.len += 4;
628        Ok(())
629    }
630
631    fn write_f64(&mut self, _: f64) -> Result<(),Infallible> {
632        self.len += 8;
633        Ok(())
634    }
635
636    fn write_bytes(&mut self, s: &[u8]) -> Result<(),Infallible> {
637        self.len += s.len();
638        Ok(())
639    }
640
641    fn write_var_bytes(&mut self, s: &[u8]) -> Result<(),Infallible> {
642        self.len += size_of_var_u64(s.len() as u64) + s.len();
643        Ok(())
644    }
645
646    fn swap_range(&mut self, _a: usize, _b: usize) -> Result<(),Infallible> {
647        Ok(())
648    }
649
650    fn pos(&self) -> usize {
651        self.len
652    }
653}
654
655
656/// Helper to easily write binary values to a mut u8-slice, triggering EncodingError on
657/// out-of-bounds errors.
658pub struct RawWriter<'a> {
659    data: &'a mut [u8],
660    pos: usize,
661}
662
663impl<'a> RawOutput<EncodingError> for RawWriter<'a> {
664    fn write_u8(&mut self, n: u8) -> Result<(),EncodingError> {
665        self.check(1)?;
666        self.data[self.pos] = n;
667        self.skip(1)
668    }
669
670    fn write_i64(&mut self, i: i64, size: usize) -> Result<(),EncodingError> {
671        self.check(size)?;
672        let i = i.to_be_bytes();
673        let offset = 8 - size;
674        for p in 0 .. size {
675            self.data[self.pos + p] = i[offset + p];
676        }
677        self.skip(size)
678    }
679
680    fn write_u64(&mut self, i: u64, size: usize) -> Result<(),EncodingError> {
681        self.check(size)?;
682        self.data[self.pos .. self.pos + size].copy_from_slice(&i.to_be_bytes()[8-size..8]);
683        self.skip(size)
684    }
685
686    fn write_var_i64(&mut self, i: i64) -> Result<(),EncodingError> {
687        if (-0x40..=0x3F).contains(&i) { // 1 byte
688            return self.write_u8((i as u8) & 0x7F);
689        }
690        if (-0x2000..=0x1FFF).contains(&i) { // 2 bytes
691            return self.write_u64(((i as u64) & 0x3FFF) | (0b10000000 << 8), 2);
692        }
693        if (-0x100000..=0x0FFFFF).contains(&i) { // 3 bytes
694            return self.write_u64(((i as u64) & 0x1FFFFF) | (0b11000000 << 16), 3);
695        }
696        if (-0x08000000..=0x07FFFFFF).contains(&i) { // 4 bytes
697            return self.write_u64(((i as u64) & 0x0FFFFFFF) | (0b11100000 << 24), 4);
698        }
699        if (-0x0400000000..=0x03FFFFFFFF).contains(&i) { // 5 bytes
700            return self.write_u64(((i as u64) & 0x07FFFFFFFF) | (0b11110000 << 32), 5);
701        }
702        if (-0x020000000000..=0x01FFFFFFFFFF).contains(&i) { // 6 bytes
703            return self.write_u64(((i as u64) & 0x03FFFFFFFFFF) | (0b11111000 << 40), 6);
704        }
705        if (-0x01000000000000..=0x00FFFFFFFFFFFF).contains(&i) { // 7 bytes
706            return self.write_u64(((i as u64) & 0x01FFFFFFFFFFFF) | (0b11111100 << 48), 7);
707        }
708        if (-0x0080000000000000..=0x007FFFFFFFFFFFFF).contains(&i) { // 8 bytes
709            return self.write_u64(((i as u64) & 0x00FFFFFFFFFFFFFF) | (0b11111110 << 56), 8);
710        }
711        self.check(9)?;
712        self.data[self.pos] = 0xFF;
713        self.data[self.pos + 1..self.pos + 9].copy_from_slice(&i.to_be_bytes());
714        self.skip(9)
715    }
716
717    fn write_var_u64(&mut self, i: u64) -> Result<(),EncodingError> {
718        let len = size_of_var_u64(i);
719        self.check(len)?;
720        write_var_u64(&mut self.data[self.pos..self.pos + len], i);
721        self.skip(len)
722    }
723
724    fn write_f32(&mut self, f: f32) -> Result<(),EncodingError> {
725        self.check(4)?;
726        let mut f = f.to_le_bytes();
727        f.reverse();
728        self.data[self.pos..self.pos + 4].copy_from_slice(&f);
729        self.skip(4)
730    }
731
732    fn write_f64(&mut self, f: f64) -> Result<(),EncodingError> {
733        self.check(8)?;
734        let mut f = f.to_le_bytes();
735        f.reverse();
736        self.data[self.pos..self.pos + 8].copy_from_slice(&f);
737        self.skip(8)
738    }
739
740    fn write_bytes(&mut self, s: &[u8]) -> Result<(),EncodingError> {
741        self.check(s.len())?;
742        self.data[self.pos..self.pos + s.len()].copy_from_slice(s);
743        self.skip(s.len())
744    }
745
746    fn write_var_bytes(&mut self, s: &[u8]) -> Result<(),EncodingError> {
747        self.write_var_u64(s.len() as u64)?;
748        self.write_bytes(s)
749    }
750
751    fn swap_range(&mut self, a: usize, b: usize) -> Result<(),EncodingError> {
752        if a >= self.pos || b >= self.pos || a > b {
753            return Err(EncodingError{ line_nr: line!(), });
754        }
755        self.data[a..self.pos].rotate_left(b - a);
756        Ok(())
757    }
758
759    fn pos(&self) -> usize {
760        self.pos
761    }
762}
763
764impl<'a> RawWriter<'a> {
765    pub fn with_uninit(data: &'a mut [std::mem::MaybeUninit<u8>]) -> Self {
766        unsafe {
767            Self { data: crate::memorypool::MemoryScope::slice_assume_init_mut(data), pos: 0, }
768        }
769    }
770    pub fn with(data: &'a mut [u8]) -> Self {
771        Self { data, pos: 0, }
772    }
773    pub fn check(&mut self, len: usize) -> Result<(),EncodingError> {
774        if self.pos + len <= self.data.len() {
775            Ok(())
776        } else {
777            Err(EncodingError { line_nr: line!()})
778        }
779    }
780    pub fn left(&self) -> usize {
781        self.data.len() - self.pos
782    }
783    fn skip(&mut self, n: usize) -> Result<(), EncodingError> {
784        self.pos += n;
785        Ok(())
786    }
787    pub fn build(self) -> &'a mut [u8] {
788        &mut self.data[0..self.pos]
789    }
790}
791
792pub struct RawScopedArrayBuilder<'a,'c> {
793    pub data: crate::memorypool::ScopedArrayBuilder<'a,'c,u8>,
794    pos: usize,
795}
796
797impl<'a,'c> RawOutput<Infallible> for RawScopedArrayBuilder<'a,'c> {
798    fn write_u8(&mut self, n: u8) -> Result<(),Infallible> {
799        self.extend(1);
800        self.data.as_mut_slice()[self.pos] = n;
801        self.skip(1)
802    }
803
804    fn write_i64(&mut self, i: i64, size: usize) -> Result<(),Infallible> {
805        self.extend(size);
806        let i = i.to_be_bytes();
807        let offset = 8 - size;
808        for p in 0 .. size {
809            self.data.as_mut_slice()[self.pos + p] = i[offset + p];
810        }
811        self.skip(size)
812    }
813
814    fn write_u64(&mut self, i: u64, size: usize) -> Result<(),Infallible> {
815        self.extend(size);
816        self.data.as_mut_slice()[self.pos .. self.pos + size].copy_from_slice(&i.to_be_bytes()[8-size..8]);
817        self.skip(size)
818    }
819
820    fn write_var_i64(&mut self, i: i64) -> Result<(),Infallible> {
821        if (-0x40..=0x3F).contains(&i) { // 1 byte
822            return self.write_u8((i as u8) & 0x7F);
823        }
824        if (-0x2000..=0x1FFF).contains(&i) { // 2 bytes
825            return self.write_u64(((i as u64) & 0x3FFF) | (0b10000000 << 8), 2);
826        }
827        if (-0x100000..=0x0FFFFF).contains(&i) { // 3 bytes
828            return self.write_u64(((i as u64) & 0x1FFFFF) | (0b11000000 << 16), 3);
829        }
830        if (-0x08000000..=0x07FFFFFF).contains(&i) { // 4 bytes
831            return self.write_u64(((i as u64) & 0x0FFFFFFF) | (0b11100000 << 24), 4);
832        }
833        if (-0x0400000000..=0x03FFFFFFFF).contains(&i) { // 5 bytes
834            return self.write_u64(((i as u64) & 0x07FFFFFFFF) | (0b11110000 << 32), 5);
835        }
836        if (-0x020000000000..=0x01FFFFFFFFFF).contains(&i) { // 6 bytes
837            return self.write_u64(((i as u64) & 0x03FFFFFFFFFF) | (0b11111000 << 40), 6);
838        }
839        if (-0x01000000000000..=0x00FFFFFFFFFFFF).contains(&i) { // 7 bytes
840            return self.write_u64(((i as u64) & 0x01FFFFFFFFFFFF) | (0b11111100 << 48), 7);
841        }
842        if (-0x0080000000000000..=0x007FFFFFFFFFFFFF).contains(&i) { // 8 bytes
843            return self.write_u64(((i as u64) & 0x00FFFFFFFFFFFFFF) | (0b11111110 << 56), 8);
844        }
845        self.extend(9);
846        self.data.as_mut_slice()[self.pos] = 0xFF;
847        self.data.as_mut_slice()[self.pos + 1..self.pos + 9].copy_from_slice(&i.to_be_bytes());
848        self.skip(9)
849    }
850
851    fn write_var_u64(&mut self, i: u64) -> Result<(),Infallible> {
852        let len = size_of_var_u64(i);
853        self.extend(len);
854        write_var_u64(&mut self.data.as_mut_slice()[self.pos..self.pos + len], i);
855        self.skip(len)
856    }
857
858    fn write_f32(&mut self, f: f32) -> Result<(),Infallible> {
859        self.extend(4);
860        let mut f = f.to_le_bytes();
861        f.reverse();
862        self.data.as_mut_slice()[self.pos..self.pos + 4].copy_from_slice(&f);
863        self.skip(4)
864    }
865
866    fn write_f64(&mut self, f: f64) -> Result<(),Infallible> {
867        self.extend(8);
868        let mut f = f.to_le_bytes();
869        f.reverse();
870        self.data.as_mut_slice()[self.pos..self.pos + 8].copy_from_slice(&f);
871        self.skip(8)
872    }
873
874    fn write_bytes(&mut self, s: &[u8]) -> Result<(),Infallible> {
875        self.extend(s.len());
876        self.data.as_mut_slice()[self.pos..self.pos + s.len()].copy_from_slice(s);
877        self.skip(s.len())
878    }
879
880    fn write_var_bytes(&mut self, s: &[u8]) -> Result<(),Infallible> {
881        self.write_var_u64(s.len() as u64)?;
882        self.write_bytes(s)
883    }
884
885    fn swap_range(&mut self, a: usize, b: usize) -> Result<(),Infallible> {
886        // if a >= self.pos || b >= self.pos || a > b {
887        //     return Err(EncodingError{ line_nr: line!(), });
888        // }
889        self.data.as_mut_slice()[a..self.pos].rotate_left(b - a);
890        Ok(())
891    }
892
893    fn pos(&self) -> usize {
894        self.pos
895    }
896}
897
898impl<'a,'c> RawScopedArrayBuilder<'a,'c> {
899    pub fn new(scope: &'a mut crate::memorypool::MemoryScope<'c>) -> Self {
900        Self { data: crate::memorypool::ScopedArrayBuilder::new(scope), pos: 0 }
901    }
902    pub fn with_capacity(scope: &'a mut crate::memorypool::MemoryScope<'c>, capacity: usize) -> Self {
903        Self { data: crate::memorypool::ScopedArrayBuilder::with_capacity(scope, capacity), pos: 0 }
904    }
905    pub fn extend(&mut self, len: usize) {
906        self.data.extend(len, 0u8);
907    }
908    fn skip(&mut self, n: usize) -> Result<(),Infallible> {
909        self.pos += n;
910        Ok(())
911    }
912    pub fn build(self) -> &'c mut [u8] {
913        self.data.build()
914    }
915    pub fn len(&self) -> usize {
916        self.pos
917    }
918    pub fn is_empty(&self) -> bool {
919        self.pos == 0
920    }
921    pub fn as_slice(&self) -> &[u8] {
922        &self.data.as_slice()[..self.pos]
923    }
924}
925#[derive(Clone,Debug)]
926pub struct RawString {
927    pub data: Vec<u8>,
928}
929
930impl RawOutput<Infallible> for RawString {
931    fn write_u8(&mut self, n: u8) -> Result<(),Infallible> {
932        self.data.push(n);
933        Ok(())
934    }
935
936    fn write_i64(&mut self, i: i64, size: usize) -> Result<(),Infallible> {
937        let i = i.to_be_bytes();
938        let offset = 8 - size;
939        self.data.extend_from_slice(&i[offset..8]);
940        Ok(())
941    }
942
943    fn write_u64(&mut self, i: u64, size: usize) -> Result<(),Infallible> {
944        self.data.extend_from_slice(&i.to_be_bytes()[8-size..8]);
945        Ok(())
946    }
947
948    fn write_var_i64(&mut self, i: i64) -> Result<(),Infallible> {
949        if (-0x40..=0x3F).contains(&i) { // 1 byte
950            return self.write_u8((i as u8) & 0x7F);
951        }
952        if (-0x2000..=0x1FFF).contains(&i) { // 2 bytes
953            return self.write_u64(((i as u64) & 0x3FFF) | (0b10000000 << 8), 2);
954        }
955        if (-0x100000..=0x0FFFFF).contains(&i) { // 3 bytes
956            return self.write_u64(((i as u64) & 0x1FFFFF) | (0b11000000 << 16), 3);
957        }
958        if (-0x08000000..=0x07FFFFFF).contains(&i) { // 4 bytes
959            return self.write_u64(((i as u64) & 0x0FFFFFFF) | (0b11100000 << 24), 4);
960        }
961        if (-0x0400000000..=0x03FFFFFFFF).contains(&i) { // 5 bytes
962            return self.write_u64(((i as u64) & 0x07FFFFFFFF) | (0b11110000 << 32), 5);
963        }
964        if (-0x020000000000..=0x01FFFFFFFFFF).contains(&i) { // 6 bytes
965            return self.write_u64(((i as u64) & 0x03FFFFFFFFFF) | (0b11111000 << 40), 6);
966        }
967        if (-0x01000000000000..=0x00FFFFFFFFFFFF).contains(&i) { // 7 bytes
968            return self.write_u64(((i as u64) & 0x01FFFFFFFFFFFF) | (0b11111100 << 48), 7);
969        }
970        if (-0x0080000000000000..=0x007FFFFFFFFFFFFF).contains(&i) { // 8 bytes
971            return self.write_u64(((i as u64) & 0x00FFFFFFFFFFFFFF) | (0b11111110 << 56), 8);
972        }
973        self.data.push(0xFF);
974        self.data.extend_from_slice(&i.to_be_bytes());
975        Ok(())
976    }
977
978    fn write_var_u64(&mut self, i: u64) -> Result<(),Infallible> {
979        let len = size_of_var_u64(i);
980        let pos = self.data.len();
981        self.data.resize_with(self.data.len() + len, || 0u8);
982        write_var_u64(&mut self.data.as_mut_slice()[pos..pos + len], i);
983        Ok(())
984    }
985
986    fn write_f32(&mut self, f: f32) -> Result<(),Infallible> {
987        let mut f = f.to_le_bytes();
988        f.reverse();
989        self.data.extend_from_slice(&f);
990        Ok(())
991    }
992
993    fn write_f64(&mut self, f: f64) -> Result<(),Infallible> {
994        let mut f = f.to_le_bytes();
995        f.reverse();
996        self.data.extend_from_slice(&f);
997        Ok(())
998    }
999
1000    fn write_bytes(&mut self, s: &[u8]) -> Result<(),Infallible> {
1001        self.data.extend_from_slice(s);
1002        Ok(())
1003    }
1004
1005    fn write_var_bytes(&mut self, s: &[u8]) -> Result<(),Infallible> {
1006        self.write_var_u64(s.len() as u64)?;
1007        self.write_bytes(s)
1008    }
1009
1010    fn swap_range(&mut self, a: usize, b: usize) -> Result<(),Infallible> {
1011        // if a >= self.pos || b >= self.pos || a > b {
1012        //     return Err(EncodingError{ line_nr: line!(), });
1013        // }
1014        let len = self.data.len();
1015        self.data[a..len].rotate_left(b - a);
1016        Ok(())
1017    }
1018
1019    fn pos(&self) -> usize {
1020        self.data.len()
1021    }
1022}
1023
1024impl RawString {
1025    pub fn new() -> Self {
1026        Self { data: Vec::new(), }
1027    }
1028    pub fn with_capacity(capacity: usize) -> Self {
1029        Self { data: Vec::with_capacity(capacity), }
1030    }
1031    pub fn shrink_to_fit(&mut self) {
1032        self.data.shrink_to_fit();
1033    }
1034    pub fn build(self) -> Vec<u8> {
1035        self.data
1036    }
1037    pub fn len(&self) -> usize {
1038        self.data.len()
1039    }
1040    pub fn is_empty(&self) -> bool {
1041        self.data.is_empty()
1042    }
1043    pub fn as_slice(&self) -> &[u8] {
1044        &self.data.as_slice()[..self.len()]
1045    }
1046    pub fn truncate(&mut self, len: usize) {
1047        self.data.truncate(len);
1048    }
1049    pub fn clear(&mut self) {
1050        self.data.clear()
1051    }
1052}
1053
1054impl Default for RawString {
1055    fn default() -> Self {
1056        Self::new()
1057    }
1058}
1059
1060#[cfg(test)]
1061mod tests {
1062    use crate::*;
1063
1064    #[test]
1065    fn fixed_signed_int_test() {
1066        let mut buffer = [0u8; 9];
1067        for i in -16384..=16384 {
1068            println!("testing {}", i);
1069            let mut writer = RawWriter::with(&mut buffer[..]);
1070            writer.write_i64(i, 2).unwrap();
1071            let writer_len = writer.left();
1072            let mut reader = RawReader::with(&buffer[..]);
1073            let r = reader.read_i64(2).unwrap();
1074            assert_eq!(i, r);
1075            assert_eq!(writer_len, reader.len());
1076        }
1077        let i : i64 = 36028797018963968;
1078        println!("leading zeros of {} = {}", i, i.leading_zeros());
1079        let size = size_of_i64(i);
1080        println!("testing {} with size {}", i, size);
1081        let mut writer = RawWriter::with(&mut buffer[..]);
1082        writer.write_i64(i, size).unwrap();
1083        let writer_len = writer.left();
1084        let mut reader = RawReader::with(&buffer[..]);
1085        let r = reader.read_i64(size).unwrap();
1086        assert_eq!(i, r);
1087        assert_eq!(writer_len, reader.len());
1088    }
1089    #[quickcheck]
1090    fn quickcheck_fixed_signed(v: i64) -> bool {
1091        let mut buffer = [0u8; 9];
1092        let size = size_of_i64(v);
1093        let mut writer = RawWriter::with(&mut buffer[..]);
1094        writer.write_i64(v, size).unwrap();
1095        let writer_len = writer.left();
1096        let mut reader = RawReader::with(&buffer[..]);
1097        let r = reader.read_i64(size).unwrap();
1098        r == v && writer_len == reader.len()
1099    }
1100
1101    #[test]
1102    fn var_signed_int_test() {
1103        let mut buffer = [0u8; 9];
1104        for i in -65536..=65536 {
1105            let mut writer = RawWriter::with(&mut buffer[..]);
1106            writer.write_var_i64(i).unwrap();
1107            let writer_left = writer.left();
1108            let mut reader = RawReader::with(&buffer[..]);
1109            let r = reader.read_var_i64().unwrap();
1110            println!("checking {}: {:?}", i, r);
1111            assert_eq!(writer_left, reader.len());
1112            assert_eq!(i, r);
1113        }
1114        for i in [2199023255552_i64, 1048576_i64] {
1115            println!("testing {}", i);
1116            let expected_len = size_of_var_i64(i);
1117            let mut writer = RawWriter::with(&mut buffer[..]);
1118            writer.write_var_i64(i).unwrap();
1119            let writer_left = writer.left();
1120            assert_eq!(expected_len, buffer.len() - writer_left);
1121            let mut reader = RawReader::with(&buffer[..]);
1122            let r = reader.read_var_i64().unwrap();
1123            println!("buffer: {:x?}", &buffer[0..expected_len]);
1124            assert_eq!(reader.len(), writer_left);
1125            assert_eq!(i, r);
1126        }
1127    }
1128    #[quickcheck]
1129    fn quickcheck_i64_var(v: i64) -> bool {
1130        let mut buffer = [0u8; 9];
1131        let expected_len = size_of_var_i64(v);
1132        let mut writer = RawWriter::with(&mut buffer[..]);
1133        writer.write_var_i64(v).unwrap();
1134        let writer_left = writer.left();
1135        let mut reader = RawReader::with(&buffer[..]);
1136        let r = reader.read_var_i64().unwrap();
1137        expected_len == buffer.len() - writer_left && reader.len() == writer_left && r == v
1138    }
1139
1140    #[test]
1141    fn var_unsigned_int_test() {
1142        let mut buffer = [0u8; 9];
1143        for i in 0..=0x0FFFF {
1144            let mut writer = RawWriter::with(&mut buffer[..]);
1145            writer.write_var_u64(i).unwrap();
1146            let writer_left = writer.left();
1147            let mut reader = RawReader::with(&buffer[..]);
1148            let r = reader.read_var_u64().unwrap();
1149            assert_eq!(writer_left, reader.len());
1150            assert_eq!(r, i);
1151        }
1152    }
1153    #[quickcheck]
1154    fn quickcheck_u64_var(v: u64) -> bool {
1155        let mut buffer = [0u8; 9];
1156        let mut writer = RawWriter::with(&mut buffer[..]);
1157        writer.write_var_u64(v).unwrap();
1158        let writer_left = writer.left();
1159        let mut reader = RawReader::with(&buffer[..]);
1160        let r = reader.read_var_u64().unwrap();
1161        writer_left == reader.len() && r == v
1162    }
1163
1164}