qubit_io/codecs/
leb128_writer.rs1use std::io::{
11 Result,
12 Seek,
13 SeekFrom,
14 Write,
15};
16
17use crate::{
18 Leb128WriteExt,
19 StringWriteExt,
20};
21
22pub struct Leb128Writer<W> {
35 inner: W,
36}
37
38impl<W> Leb128Writer<W> {
39 #[inline]
47 pub fn new(inner: W) -> Self {
48 Self { inner }
49 }
50
51 #[inline]
56 pub fn get_ref(&self) -> &W {
57 &self.inner
58 }
59
60 #[inline]
65 pub fn get_mut(&mut self) -> &mut W {
66 &mut self.inner
67 }
68
69 #[inline]
74 pub fn into_inner(self) -> W {
75 self.inner
76 }
77}
78
79macro_rules! delegate_write {
80 ($name:ident, $inner:ident, $value:ty) => {
81 #[doc = concat!("Writes a LEB128 `", stringify!($value), "`.")]
82 #[inline]
89 pub fn $name(&mut self, value: $value) -> Result<()> {
90 self.inner.$inner(value)
91 }
92 };
93}
94
95impl<W> Leb128Writer<W>
96where
97 W: Write,
98{
99 delegate_write!(write_u8, write_uleb_u8, u8);
100 delegate_write!(write_u16, write_uleb_u16, u16);
101 delegate_write!(write_u32, write_uleb_u32, u32);
102 delegate_write!(write_u64, write_uleb_u64, u64);
103 delegate_write!(write_u128, write_uleb_u128, u128);
104 delegate_write!(write_usize, write_uleb_usize, usize);
105 delegate_write!(write_i8, write_sleb_i8, i8);
106 delegate_write!(write_i16, write_sleb_i16, i16);
107 delegate_write!(write_i32, write_sleb_i32, i32);
108 delegate_write!(write_i64, write_sleb_i64, i64);
109 delegate_write!(write_i128, write_sleb_i128, i128);
110 delegate_write!(write_isize, write_sleb_isize, isize);
111
112 #[inline]
120 pub fn write_utf8_string(&mut self, value: &str) -> Result<()> {
121 self.inner.write_utf8_string_uleb(value)
122 }
123}
124
125impl<W> Write for Leb128Writer<W>
126where
127 W: Write,
128{
129 #[inline]
130 fn write(&mut self, buffer: &[u8]) -> Result<usize> {
131 self.inner.write(buffer)
132 }
133
134 #[inline]
135 fn flush(&mut self) -> Result<()> {
136 self.inner.flush()
137 }
138}
139
140impl<W> Seek for Leb128Writer<W>
141where
142 W: Seek,
143{
144 #[inline]
145 fn seek(&mut self, position: SeekFrom) -> Result<u64> {
146 self.inner.seek(position)
147 }
148}