qubit_io/ext/
leb128_write_ext.rs1use std::io::{
12 Result,
13 Write,
14};
15
16use crate::codec::{
17 Leb128Codec,
18 NonStrict,
19};
20
21macro_rules! write_leb128_value {
22 ($writer:expr, $value:expr, $ty:ty) => {
23 write_leb128::<{ Leb128Codec::<$ty, NonStrict>::REQUIRED_MIN_BUFFER_LEN }, _, _, _>(
24 $writer,
25 $value,
26 |bytes, value| {
27 unsafe { Leb128Codec::<$ty, NonStrict>::write_unchecked(bytes, 0, value) }
29 },
30 )
31 };
32}
33
34pub trait Leb128WriteExt: Write {
42 #[inline]
44 fn write_uleb_u8(&mut self, value: u8) -> Result<()> {
45 write_leb128_value!(self, value, u8)
46 }
47
48 #[inline]
50 fn write_uleb_u16(&mut self, value: u16) -> Result<()> {
51 write_leb128_value!(self, value, u16)
52 }
53
54 #[inline]
56 fn write_uleb_u32(&mut self, value: u32) -> Result<()> {
57 write_leb128_value!(self, value, u32)
58 }
59
60 #[inline]
62 fn write_uleb_u64(&mut self, value: u64) -> Result<()> {
63 write_leb128_value!(self, value, u64)
64 }
65
66 #[inline]
68 fn write_uleb_u128(&mut self, value: u128) -> Result<()> {
69 write_leb128_value!(self, value, u128)
70 }
71
72 #[inline]
74 fn write_uleb_usize(&mut self, value: usize) -> Result<()> {
75 write_leb128_value!(self, value, usize)
76 }
77
78 #[inline]
80 fn write_sleb_i8(&mut self, value: i8) -> Result<()> {
81 write_leb128_value!(self, value, i8)
82 }
83
84 #[inline]
86 fn write_sleb_i16(&mut self, value: i16) -> Result<()> {
87 write_leb128_value!(self, value, i16)
88 }
89
90 #[inline]
92 fn write_sleb_i32(&mut self, value: i32) -> Result<()> {
93 write_leb128_value!(self, value, i32)
94 }
95
96 #[inline]
98 fn write_sleb_i64(&mut self, value: i64) -> Result<()> {
99 write_leb128_value!(self, value, i64)
100 }
101
102 #[inline]
104 fn write_sleb_i128(&mut self, value: i128) -> Result<()> {
105 write_leb128_value!(self, value, i128)
106 }
107
108 #[inline]
110 fn write_sleb_isize(&mut self, value: isize) -> Result<()> {
111 write_leb128_value!(self, value, isize)
112 }
113}
114
115impl<W> Leb128WriteExt for W where W: Write + ?Sized {}
116
117#[inline]
118fn write_leb128<const N: usize, T, W, F>(writer: &mut W, value: T, encode: F) -> Result<()>
119where
120 W: Write + ?Sized,
121 F: FnOnce(&mut [u8], T) -> usize,
122{
123 let mut bytes = [0u8; N];
124 let len = encode(&mut bytes, value);
125 writer.write_all(&bytes[..len])
126}