qubit_io/codecs/
zig_zag_writer.rs1use std::io::{
11 Result,
12 Seek,
13 SeekFrom,
14 Write,
15};
16
17use crate::ZigZagWriteExt;
18
19pub struct ZigZagWriter<W> {
32 inner: W,
33}
34
35impl<W> ZigZagWriter<W> {
36 #[inline]
44 pub fn new(inner: W) -> Self {
45 Self { inner }
46 }
47
48 #[inline]
53 pub fn get_ref(&self) -> &W {
54 &self.inner
55 }
56
57 #[inline]
62 pub fn get_mut(&mut self) -> &mut W {
63 &mut self.inner
64 }
65
66 #[inline]
71 pub fn into_inner(self) -> W {
72 self.inner
73 }
74}
75
76macro_rules! delegate_write {
77 ($name:ident, $inner:ident, $value:ty) => {
78 #[doc = concat!("Writes a ZigZag encoded `", stringify!($value), "`.")]
79 #[inline]
86 pub fn $name(&mut self, value: $value) -> Result<()> {
87 self.inner.$inner(value)
88 }
89 };
90}
91
92impl<W> ZigZagWriter<W>
93where
94 W: Write,
95{
96 delegate_write!(write_i8, write_zigzag_i8, i8);
97 delegate_write!(write_i16, write_zigzag_i16, i16);
98 delegate_write!(write_i32, write_zigzag_i32, i32);
99 delegate_write!(write_i64, write_zigzag_i64, i64);
100 delegate_write!(write_i128, write_zigzag_i128, i128);
101 delegate_write!(write_isize, write_zigzag_isize, isize);
102}
103
104impl<W> Write for ZigZagWriter<W>
105where
106 W: Write,
107{
108 #[inline]
109 fn write(&mut self, buffer: &[u8]) -> Result<usize> {
110 self.inner.write(buffer)
111 }
112
113 #[inline]
114 fn flush(&mut self) -> Result<()> {
115 self.inner.flush()
116 }
117}
118
119impl<W> Seek for ZigZagWriter<W>
120where
121 W: Seek,
122{
123 #[inline]
124 fn seek(&mut self, position: SeekFrom) -> Result<u64> {
125 self.inner.seek(position)
126 }
127}