musli_common/int/
continuation.rs1#![allow(unused)]
23
24use musli::de;
25use musli::Context;
26
27use crate::int;
28use crate::reader::Reader;
29use crate::writer::Writer;
30
31use super::Unsigned;
32
33const MASK_BYTE: u8 = 0b0111_1111;
34const CONT_BYTE: u8 = 0b1000_0000;
35
36#[inline(never)]
38pub fn decode<'de, C, R, T>(cx: &C, mut r: R) -> Result<T, C::Error>
39where
40 C: ?Sized + Context,
41 R: Reader<'de>,
42 T: int::Unsigned,
43{
44 let mut b = r.read_byte(cx)?;
45
46 if b & 0b1000_0000 == 0 {
47 return Ok(T::from_byte(b));
48 }
49
50 let mut value = T::from_byte(b & MASK_BYTE);
51 let mut shift = 0u32;
52
53 while b & CONT_BYTE == CONT_BYTE {
54 shift += 7;
55
56 if shift >= T::BITS {
57 return Err(cx.message("Bits overflow"));
58 }
59
60 b = r.read_byte(cx)?;
61 value = value.wrapping_add(T::from_byte(b & MASK_BYTE).wrapping_shl(shift));
62 }
63
64 Ok(value)
65}
66
67#[inline(never)]
69pub fn encode<C, W, T>(cx: &C, mut w: W, mut value: T) -> Result<(), C::Error>
70where
71 C: ?Sized + Context,
72 W: Writer,
73 T: int::Unsigned,
74{
75 let mut b = value.as_byte();
76
77 if value < T::from_byte(0b1000_0000) {
78 w.write_byte(cx, b)?;
79 return Ok(());
80 }
81
82 loop {
83 value = value >> 7;
84
85 if value.is_zero() {
86 w.write_byte(cx, b & MASK_BYTE)?;
87 break;
88 }
89
90 w.write_byte(cx, b | CONT_BYTE)?;
91 b = value.as_byte();
92 }
93
94 Ok(())
95}