le_stream/to_le_stream/
core.rs1use 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}