variable_len_reader/asynchronous/
write_raw.rs

1macro_rules! write_raw_future {
2    ($primitive: ty, $future: ident, $to: ident) => {
3        write_raw_future!(f cfg(feature = "async_raw"), $primitive, $future, $to);
4    };
5    (f $feature: meta, $primitive: ty, $future: ident, $to: ident) => {
6        #[$feature]
7        $crate::pin_project_lite::pin_project! {
8            #[cfg_attr(docsrs, doc($feature))]
9            #[derive(Debug)]
10            #[project(!Unpin)]
11            #[must_use = "futures do nothing unless you `.await` or poll them"]
12            pub struct $future<'a, W: ?Sized> {
13                #[pin]
14                writer: &'a mut W,
15                buf: OwnedWriteBuf<[u8; ::core::mem::size_of::<$primitive>()]>,
16            }
17        }
18        #[$feature]
19        impl<'a, W: ?Sized> WriterFuture<'a, W, $primitive> for $future<'a, W> {
20            fn new(writer: &'a mut W, buf: $primitive) -> Self {
21                Self { writer, buf: OwnedWriteBuf::new(Self::_handle(buf)) }
22            }
23            fn reset(self: Pin<&mut Self>, buf: $primitive) {
24                let me = self.project();
25                *me.buf = OwnedWriteBuf::new(Self::_handle(buf));
26            }
27        }
28        #[$feature]
29        impl<'a, W: AsyncVariableWriter + Unpin + ?Sized> Future for $future<'a, W> {
30            type Output = ::core::result::Result<(), W::Error>;
31
32            fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
33                let mut me = self.project();
34                let mut ref_buf = me.buf.into();
35                let res = W::poll_write_more(Pin::new(&mut *me.writer), cx, &mut ref_buf);
36                let position = ref_buf.position();
37                me.buf.set_position(position);
38                res
39            }
40        }
41        #[$feature]
42        impl<'a, W: ?Sized> $future<'a, W> {
43            fn _handle(value: $primitive) -> [u8; ::core::mem::size_of::<$primitive>()] {
44                <$primitive>::$to(value)
45            }
46        }
47    };
48}
49macro_rules! write_raw_func {
50    ($primitive: ty, $future: ident, $func: ident) => {
51        write_raw_func!(f cfg(feature = "async_raw"), $primitive, $future, $func);
52    };
53    (f $feature: meta, $primitive: ty, $future: ident, $func: ident) => {
54        write_wrap_func!(f $feature, $primitive, $future, $func);
55    };
56}
57
58macro_rules! define_write_raw_future {
59    () => {
60        write_raw_future!(u8, WriteU8Raw, to_ne_bytes);
61        write_raw_future!(i8, WriteI8Raw, to_ne_bytes);
62
63        write_raw_future!(u16, WriteU16RawLe, to_le_bytes);
64        write_raw_future!(u16, WriteU16RawBe, to_be_bytes);
65        write_raw_future!(i16, WriteI16RawLe, to_le_bytes);
66        write_raw_future!(i16, WriteI16RawBe, to_be_bytes);
67
68        write_raw_future!(u32, WriteU32RawLe, to_le_bytes);
69        write_raw_future!(u32, WriteU32RawBe, to_be_bytes);
70        write_raw_future!(i32, WriteI32RawLe, to_le_bytes);
71        write_raw_future!(i32, WriteI32RawBe, to_be_bytes);
72
73        write_raw_future!(u64, WriteU64RawLe, to_le_bytes);
74        write_raw_future!(u64, WriteU64RawBe, to_be_bytes);
75        write_raw_future!(i64, WriteI64RawLe, to_le_bytes);
76        write_raw_future!(i64, WriteI64RawBe, to_be_bytes);
77
78        write_raw_future!(u128, WriteU128RawLe, to_le_bytes);
79        write_raw_future!(u128, WriteU128RawBe, to_be_bytes);
80        write_raw_future!(i128, WriteI128RawLe, to_le_bytes);
81        write_raw_future!(i128, WriteI128RawBe, to_be_bytes);
82
83        write_raw_future!(f32, WriteF32RawLe, to_le_bytes);
84        write_raw_future!(f32, WriteF32RawBe, to_be_bytes);
85        write_raw_future!(f64, WriteF64RawLe, to_le_bytes);
86        write_raw_future!(f64, WriteF64RawBe, to_be_bytes);
87    };
88}
89macro_rules! define_write_raw_func {
90    () => {
91        write_raw_func!(u8, WriteU8Raw, write_u8_raw);
92        write_raw_func!(i8, WriteI8Raw, write_i8_raw);
93
94        write_raw_func!(u16, WriteU16RawLe, write_u16_raw_le);
95        write_raw_func!(u16, WriteU16RawBe, write_u16_raw_be);
96        write_raw_func!(i16, WriteI16RawLe, write_i16_raw_le);
97        write_raw_func!(i16, WriteI16RawBe, write_i16_raw_be);
98
99        write_raw_func!(u32, WriteU32RawLe, write_u32_raw_le);
100        write_raw_func!(u32, WriteU32RawBe, write_u32_raw_be);
101        write_raw_func!(i32, WriteI32RawLe, write_i32_raw_le);
102        write_raw_func!(i32, WriteI32RawBe, write_i32_raw_be);
103
104        write_raw_func!(u64, WriteU64RawLe, write_u64_raw_le);
105        write_raw_func!(u64, WriteU64RawBe, write_u64_raw_be);
106        write_raw_func!(i64, WriteI64RawLe, write_i64_raw_le);
107        write_raw_func!(i64, WriteI64RawBe, write_i64_raw_be);
108
109        write_raw_func!(u128, WriteU128RawLe, write_u128_raw_le);
110        write_raw_func!(u128, WriteU128RawBe, write_u128_raw_be);
111        write_raw_func!(i128, WriteI128RawLe, write_i128_raw_le);
112        write_raw_func!(i128, WriteI128RawBe, write_i128_raw_be);
113
114        write_raw_func!(f32, WriteF32RawLe, write_f32_raw_le);
115        write_raw_func!(f32, WriteF32RawBe, write_f32_raw_be);
116        write_raw_func!(f64, WriteF64RawLe, write_f64_raw_le);
117        write_raw_func!(f64, WriteF64RawBe, write_f64_raw_be);
118    };
119}
120
121define_write_raw_future!();