Skip to main content

le_stream/to_le_stream/
core.rs

1use core::array::IntoIter;
2use core::iter::{Chain, Empty, FlatMap, Flatten, empty};
3use core::marker::PhantomData;
4use core::ops::{Range, RangeInclusive};
5
6use crate::ToLeStream;
7
8macro_rules! impl_primitives {
9    ($($typ:ty,)+) => {
10        $(
11            impl ToLeStream for $typ {
12                type Iter = IntoIter<u8, { Self::BITS as usize / 8 }>;
13
14                fn to_le_stream(self) -> Self::Iter {
15                    self.to_le_bytes().into_iter()
16                }
17            }
18        )+
19    };
20}
21
22impl_primitives!(
23    u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize,
24);
25
26impl ToLeStream for f32 {
27    type Iter = IntoIter<u8, 4>;
28
29    fn to_le_stream(self) -> Self::Iter {
30        self.to_le_bytes().into_iter()
31    }
32}
33
34impl ToLeStream for f64 {
35    type Iter = IntoIter<u8, 8>;
36
37    fn to_le_stream(self) -> Self::Iter {
38        self.to_le_bytes().into_iter()
39    }
40}
41
42impl ToLeStream for () {
43    type Iter = Empty<u8>;
44
45    fn to_le_stream(self) -> Self::Iter {
46        empty()
47    }
48}
49
50impl<T> ToLeStream for PhantomData<T> {
51    type Iter = Empty<u8>;
52
53    fn to_le_stream(self) -> Self::Iter {
54        empty()
55    }
56}
57
58impl ToLeStream for bool {
59    type Iter = <u8 as ToLeStream>::Iter;
60
61    fn to_le_stream(self) -> Self::Iter {
62        u8::from(self).to_le_stream()
63    }
64}
65
66impl<T, const SIZE: usize> ToLeStream for [T; SIZE]
67where
68    T: ToLeStream,
69{
70    type Iter =
71        FlatMap<IntoIter<T, SIZE>, <T as ToLeStream>::Iter, fn(T) -> <T as ToLeStream>::Iter>;
72
73    fn to_le_stream(self) -> Self::Iter {
74        self.into_iter().flat_map(T::to_le_stream)
75    }
76}
77
78impl<T> ToLeStream for Option<T>
79where
80    T: ToLeStream,
81{
82    type Iter = Flatten<core::option::IntoIter<<T as ToLeStream>::Iter>>;
83
84    fn to_le_stream(self) -> Self::Iter {
85        self.map(ToLeStream::to_le_stream).into_iter().flatten()
86    }
87}
88
89impl<T> ToLeStream for Range<T>
90where
91    T: ToLeStream,
92{
93    type Iter = Chain<<T as ToLeStream>::Iter, <T as ToLeStream>::Iter>;
94
95    fn to_le_stream(self) -> Self::Iter {
96        self.start.to_le_stream().chain(self.end.to_le_stream())
97    }
98}
99
100impl<T> ToLeStream for RangeInclusive<T>
101where
102    T: ToLeStream,
103{
104    type Iter = Chain<<T as ToLeStream>::Iter, <T as ToLeStream>::Iter>;
105
106    fn to_le_stream(self) -> Self::Iter {
107        let (start, end) = self.into_inner();
108        start.to_le_stream().chain(end.to_le_stream())
109    }
110}