qubit_io/ext/
zig_zag_write_ext.rs1use std::io::{
12 Result,
13 Write,
14};
15
16use crate::codec::{
17 NonStrict,
18 ZigZagCodec,
19};
20
21macro_rules! write_zig_zag_value {
22 ($writer:expr, $value:expr, $ty:ty) => {
23 write_zig_zag::<{ ZigZagCodec::<$ty, NonStrict>::REQUIRED_MIN_BUFFER_LEN }, _, _, _>(
24 $writer,
25 $value,
26 |bytes, value| {
27 unsafe { ZigZagCodec::<$ty, NonStrict>::write_unchecked(bytes, 0, value) }
29 },
30 )
31 };
32}
33
34pub trait ZigZagWriteExt: Write {
42 #[inline]
44 fn write_zig_zag_i8(&mut self, value: i8) -> Result<()> {
45 write_zig_zag_value!(self, value, i8)
46 }
47
48 #[inline]
50 fn write_zig_zag_i16(&mut self, value: i16) -> Result<()> {
51 write_zig_zag_value!(self, value, i16)
52 }
53
54 #[inline]
56 fn write_zig_zag_i32(&mut self, value: i32) -> Result<()> {
57 write_zig_zag_value!(self, value, i32)
58 }
59
60 #[inline]
62 fn write_zig_zag_i64(&mut self, value: i64) -> Result<()> {
63 write_zig_zag_value!(self, value, i64)
64 }
65
66 #[inline]
68 fn write_zig_zag_i128(&mut self, value: i128) -> Result<()> {
69 write_zig_zag_value!(self, value, i128)
70 }
71
72 #[inline]
74 fn write_zig_zag_isize(&mut self, value: isize) -> Result<()> {
75 write_zig_zag_value!(self, value, isize)
76 }
77}
78
79impl<W> ZigZagWriteExt for W where W: Write + ?Sized {}
80
81#[inline]
82fn write_zig_zag<const N: usize, T, W, F>(writer: &mut W, value: T, encode: F) -> Result<()>
83where
84 W: Write + ?Sized,
85 F: FnOnce(&mut [u8], T) -> usize,
86{
87 let mut bytes = [0u8; N];
88 let len = encode(&mut bytes, value);
89 writer.write_all(&bytes[..len])
90}