lazyext_slice/
slice_ext.rs

1use crate::BytesExt;
2#[cfg(feature = "alloc")]
3use alloc::borrow::Cow;
4use core::mem;
5use core::slice::{from_raw_parts, from_raw_parts_mut};
6
7#[cfg(feature = "alloc")]
8macro_rules! impl_x_to_u8_vec {
9    ($this: ident, $trait:tt::$fn:tt, $typ:tt::$conv:tt) => {{
10        $trait::$fn($this)
11            .iter()
12            .flat_map(|v| $typ::$conv(*v))
13            .collect::<Vec<_>>()
14    }};
15}
16
17macro_rules! impl_x_to_u8_slice {
18    ($this: ident, $ty: ty, $trait:tt::$fn:tt::$ptr:tt, $builder: ident, $raw_ptr: tt) => {{
19        let src = $trait::$fn($this);
20        let len = src.len() * mem::size_of::<$ty>();
21        unsafe {
22            $builder(src.$ptr() as *$raw_ptr u8, len)
23        }
24    }};
25}
26
27#[cfg(feature = "alloc")]
28macro_rules! impl_to_x_vec_suite {
29    ($from_literal: literal, $([$ty: ty, $to_literal: literal]), +$(,)?) => {
30        $(
31        paste! {
32            #[doc = concat!("Copy ", $from_literal, " slice to ", $to_literal, " vec in big-endian")]
33            #[inline]
34            fn [<to_be_ $ty _vec>](&self) -> Vec<$ty> {
35                self.to_u8_slice().[<to_be_ $ty _vec>]()
36            }
37
38            #[doc = concat!("Copy ", $from_literal, " slice to ", $to_literal, " vec in little-endian")]
39            #[inline]
40            fn [<to_le_ $ty _vec>](&self) -> Vec<$ty> {
41                self.to_u8_slice().[<to_le_ $ty _vec>]()
42            }
43
44            #[doc = concat!("Copy ", $from_literal, " slice to ", $to_literal, " vec in native-endian")]
45            #[inline]
46            fn [<to_ne_ $ty _vec>](&self) -> Vec<$ty> {
47                self.to_u8_slice().[<to_ne_ $ty _vec>]()
48            }
49        }
50        )*
51    };
52}
53
54macro_rules! impl_to_x_slice_suite_in {
55    ($this: ident, $builder:ident, $trait:tt::$fn:tt::$ptr:tt, $raw_ptr: ident, $ty: ty) => {{
56        let src = $trait::$fn($this);
57        let src_ptr = src.$ptr();
58        let len = src.len() * mem::size_of::<$ty>();
59        unsafe { $builder(src_ptr as *$raw_ptr $ty, len) }
60    }};
61}
62
63macro_rules! impl_to_x_slice_suite {
64    ($from_literal: literal, $builder:ident, $trait:tt::$fn:tt::$ptr:tt, $raw_ptr: ident, $([$ty: ty, $ty_literal: literal]), +$(,)?) => {
65        $(
66        paste! {
67            #[doc = concat!("Convert ", $from_literal, " slice to ", $ty_literal, " slice in native-endian(zero-copy)")]
68            fn [<to_ $ty _slice>](&self) -> &[$ty] {
69                impl_to_x_slice_suite_in!(self, $builder, $trait::$fn::$ptr, $raw_ptr, $ty)
70            }
71        }
72        )*
73    };
74    (mut $from_literal: literal, $builder:ident, $trait:tt::$fn:tt::$ptr:tt, $raw_ptr: ident, $([$ty: ty, $ty_literal: literal]), +$(,)?) => {
75        $(
76        paste! {
77            #[doc = concat!("Convert mutable ", $from_literal, " slice to mutable", $ty_literal, " slice in native-endian(zero-copy)")]
78            fn [<to_ $ty _slice_mut>](&mut self) -> &[$ty] {
79                impl_to_x_slice_suite_in!(self, $builder, $trait::$fn::$ptr, $raw_ptr, $ty)
80            }
81        }
82        )*
83    };
84}
85
86#[cfg(feature = "alloc")]
87macro_rules! impl_to_x_slice_lossy_suite {
88    ($from_literal: literal, $trait:ident, $([$ty:ty, $ty_literal: literal]), +$(,)?) => {
89        $(
90        paste! {
91            #[doc = concat!("Convert ", $from_literal, " slice to Cow<'_, [", $ty_literal, "]> slice in native-endian(zero-copy)")]
92            fn [<to_ $ty _slice_lossy>](&self) -> Cow<'_, [$ty]> {
93                Cow::Borrowed($trait::[<to_ $ty _slice>](self))
94            }
95        }
96        )*
97    };
98}
99
100macro_rules! impl_traits_for_slice_type {
101    ($ext_trait: ident, $as_trait: ident, $ty: tt) => {
102        paste! {
103            impl<'a> $as_trait for &'a [$ty] {
104                fn [<as_ $ty _slice>](&self) -> &[$ty] {
105                    self
106                }
107            }
108
109            impl<const N: usize> $as_trait for [$ty; N] {
110                fn [<as_ $ty _slice>](&self) -> &[$ty] {
111                    self
112                }
113            }
114        }
115
116        impl<'a> $ext_trait for &'a [$ty] {}
117
118        impl<const N: usize> $ext_trait for [$ty; N] {}
119    };
120}
121
122macro_rules! impl_traits_for_slice_mut_type {
123    ($ext_trait: ident, $mut_ext_trait: ident, $as_trait: ident, $as_mut_trait: ident, $ty: tt) => {
124        paste! {
125            impl<'a> $as_trait for &'a mut [$ty] {
126                fn [<as_ $ty _slice>](&self) -> &[$ty] {
127                    self
128                }
129            }
130
131            impl<'a> $as_mut_trait for &'a mut [$ty] {
132                fn [<as_ $ty _slice_mut>](&mut self) -> &mut [$ty] {
133                    self
134                }
135            }
136
137            impl<const N: usize> $as_mut_trait for [$ty; N] {
138                fn [<as_ $ty _slice_mut>](&mut self) -> &mut [$ty] {
139                    self
140                }
141            }
142        }
143
144        impl<'a> $ext_trait for &'a mut [$ty] {}
145
146        impl<'a> $mut_ext_trait for &'a mut [$ty] {}
147
148        impl<const N: usize> $mut_ext_trait for [$ty; N] {}
149    };
150}
151
152#[cfg(feature = "alloc")]
153macro_rules! impl_traits_for_vec_type {
154    ($ext_trait: ident, $as_trait: ident, $ty: tt) => {
155        paste! {
156            impl<'a> $as_trait for &'a Vec<$ty> {
157                fn [<as_ $ty _slice>](&self) -> &[$ty] {
158                    self.as_slice()
159                }
160            }
161
162            impl $as_trait for Vec<$ty> {
163                fn [<as_ $ty _slice>](&self) -> &[$ty] {
164                    self.as_slice()
165                }
166            }
167        }
168
169        impl<'a> $ext_trait for &'a Vec<$ty> {}
170
171        impl $ext_trait for Vec<$ty> {}
172    };
173}
174
175#[cfg(feature = "alloc")]
176macro_rules! impl_traits_for_vec_mut_type {
177    ($ext_trait: ident, $mut_ext_trait: ident, $as_trait: ident, $as_mut_trait: ident, $ty: tt) => {
178        paste! {
179            impl<'a> $as_trait for &'a mut Vec<$ty> {
180                fn [<as_ $ty _slice>](&self) -> &[$ty] {
181                    self.as_slice()
182                }
183            }
184
185            impl<'a> $as_mut_trait for &'a mut Vec<$ty> {
186                fn [<as_ $ty _slice_mut>](&mut self) -> &mut [$ty] {
187                    self.as_mut_slice()
188                }
189            }
190
191            impl $as_mut_trait for Vec<$ty> {
192                fn [<as_ $ty _slice_mut>](&mut self) -> &mut [$ty] {
193                    self.as_mut_slice()
194                }
195            }
196        }
197
198        impl<'a> $ext_trait for &'a mut Vec<$ty> {}
199
200        impl<'a> $mut_ext_trait for &'a mut Vec<$ty> {}
201
202        impl $mut_ext_trait for Vec<$ty> {}
203    };
204}
205
206#[cfg(feature = "alloc")]
207macro_rules! impl_traits_for_box_type {
208    ($ext_trait: ident, $as_trait: ident, $ty: tt) => {
209        paste! {
210            impl<'a> $as_trait for &'a Box<[$ty]> {
211                fn [<as_ $ty _slice>](&self) -> &[$ty] {
212                    self.as_ref()
213                }
214            }
215
216            impl $as_trait for Box<[$ty]> {
217                fn [<as_ $ty _slice>](&self) -> &[$ty] {
218                    self.as_ref()
219                }
220            }
221        }
222
223        impl<'a> $ext_trait for &'a Box<[$ty]> {}
224        impl $ext_trait for Box<[$ty]> {}
225    };
226}
227
228#[cfg(feature = "alloc")]
229macro_rules! impl_traits_for_box_mut_type {
230    ($ext_trait: ident, $mut_ext_trait: ident, $as_trait: ident, $as_mut_trait: ident, $ty: tt) => {
231        paste! {
232            impl<'a> $as_trait for &'a mut Box<[$ty]> {
233                fn [<as_ $ty _slice>](&self) -> &[$ty] {
234                    self.as_ref()
235                }
236            }
237
238            impl<'a> $as_mut_trait for &'a mut Box<[$ty]> {
239                fn [<as_ $ty _slice_mut>](&mut self) -> &mut [$ty] {
240                    self.as_mut()
241                }
242            }
243
244            impl $as_mut_trait for Box<[$ty]> {
245                fn [<as_ $ty _slice_mut>](&mut self) -> &mut [$ty] {
246                    self.as_mut()
247                }
248            }
249        }
250
251        impl<'a> $ext_trait for &'a mut Box<[$ty]> {}
252
253        impl<'a> $mut_ext_trait for &'a mut Box<[$ty]> {}
254        impl $mut_ext_trait for Box<[$ty]> {}
255    };
256}
257
258macro_rules! declare_as_x_slice_trait {
259    ($([$ext_trait_name: ident, $as_trait_name: ident, $fn_name: ident, $typ: tt, $typ_literal: literal, $([$convert_typ: ty, $convert_typ_literal: literal]), +$(,)?]), +$(,)?) => {
260        $(
261        #[doc = concat!("Converts to `&'a [", $typ_literal, "]`")]
262        pub trait $as_trait_name {
263            #[doc = concat!("Converts to ", $typ_literal, " slice")]
264            fn $fn_name(&self) -> &[$typ];
265        }
266
267        #[doc = concat!("Extensions for ", $typ_literal, " slice")]
268        pub trait $ext_trait_name: $as_trait_name {
269
270            impl_psfix_suites!($as_trait_name::$fn_name, $typ, $typ_literal);
271
272            #[doc = concat!("Copy ", $typ_literal, " slice to u8 vec in big-endian")]
273            #[cfg(feature = "alloc")]
274            fn to_be_u8_vec(&self) -> Vec<u8> {
275                impl_x_to_u8_vec!(self, $as_trait_name::$fn_name, $typ::to_be_bytes)
276            }
277
278            #[doc = concat!("Copy ", $typ_literal, " slice to u8 vec in little-endian")]
279            #[cfg(feature = "alloc")]
280            fn to_le_u8_vec(&self) -> Vec<u8> {
281                impl_x_to_u8_vec!(self, $as_trait_name::$fn_name, $typ::to_le_bytes)
282            }
283
284            #[doc = concat!("Copy ", $typ_literal, " slice to u8 vec in native-endian")]
285             #[cfg(feature = "alloc")]
286            fn to_ne_u8_vec(&self) -> Vec<u8> {
287                impl_x_to_u8_vec!(self, $as_trait_name::$fn_name, $typ::to_ne_bytes)
288            }
289
290            cfg_alloc!(impl_to_x_vec_suite!($typ_literal, $([$convert_typ, $convert_typ_literal],)*););
291
292            #[doc = concat!("convert u16 slice to u8 slice")]
293            fn to_u8_slice(&self) -> &[u8] {
294                impl_x_to_u8_slice!(self, $typ, $as_trait_name::$fn_name::as_ptr, from_raw_parts, const)
295            }
296
297            cfg_alloc!(impl_to_x_slice_lossy_suite!($typ_literal, $ext_trait_name, [u8, "u8"], $([$convert_typ, $convert_typ_literal],)*););
298
299            impl_to_x_slice_suite!($typ_literal, from_raw_parts, $ext_trait_name::to_u8_slice::as_ptr, const, $([$convert_typ, $convert_typ_literal],)*);
300        }
301
302        impl_traits_for_slice_type!($ext_trait_name, $as_trait_name, $typ);
303        impl_traits_for_vec_type!($ext_trait_name, $as_trait_name, $typ);
304        impl_traits_for_box_type!($ext_trait_name, $as_trait_name, $typ);
305        )*
306    };
307}
308
309macro_rules! declare_as_x_slice_mut_trait {
310    ($([$ext_trait_name: ident, $mut_ext_trait_name: ident, $as_trait_name: ident, $as_mut_trait_name: ident, $fn_mut_name: ident, $typ: ty, $typ_literal: literal, $([$convert_typ: ty, $convert_typ_literal: literal]), +$(,)?]), +$(,)?) => {
311        $(
312        #[doc = concat!("Converts to `&'a mut [", $typ_literal, "]`")]
313        pub trait $as_mut_trait_name: $as_trait_name  {
314            #[doc = concat!("Converts to mutable ", $typ_literal, " slice")]
315            fn $fn_mut_name(&mut self) -> &mut [$typ];
316        }
317
318        #[doc = concat!("Extensions for mutable ", $typ_literal, " slice")]
319        pub trait $mut_ext_trait_name: $as_mut_trait_name + $ext_trait_name {
320            #[doc = concat!("convert ", $typ_literal, " slice to mutable u8 slice")]
321            fn to_u8_slice_mut(&mut self) -> &mut [u8] {
322                impl_x_to_u8_slice!(self, $typ, $as_mut_trait_name::$fn_mut_name::as_mut_ptr, from_raw_parts_mut, mut)
323            }
324
325            impl_to_x_slice_suite!(mut $typ_literal, from_raw_parts_mut, $mut_ext_trait_name::to_u8_slice_mut::as_mut_ptr, mut, [u32, "u32"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f32, "f32"], [f64, "f64"]);
326        }
327
328        impl_traits_for_slice_mut_type!($ext_trait_name, $mut_ext_trait_name, $as_trait_name, $as_mut_trait_name, $typ);
329        impl_traits_for_vec_mut_type!($ext_trait_name, $mut_ext_trait_name, $as_trait_name, $as_mut_trait_name, $typ);
330        impl_traits_for_box_mut_type!($ext_trait_name, $mut_ext_trait_name, $as_trait_name, $as_mut_trait_name, $typ);
331        )*
332    };
333}
334
335declare_as_x_slice_trait! {
336    [U16SliceExt, AsU16Slice, as_u16_slice, u16, "u16", [u32, "u32"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
337
338    [U32SliceExt, AsU32Slice, as_u32_slice, u32, "u32", [u16, "u16"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
339
340    [USizeSliceExt, AsUSizeSlice, as_usize_slice, usize, "usize", [u16, "u16"], [u32, "u32"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
341
342    [U64SliceExt, AsU64Slice, as_u64_slice, u64, "u64", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
343
344    [U128SliceExt, AsU128Slice, as_u128_slice, u128, "u128", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u64, "u64"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
345
346    [I8SliceExt, AsI8Slice, as_i8_slice, i8, "i8", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
347
348    [I16SliceExt, AsI16Slice, as_i16_slice, i16, "i16", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
349
350    [I32SliceExt, AsI32Slice, as_i32_slice, i32, "i32", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
351
352    [ISizeSliceExt, AsISizeSlice, as_isize_slice, isize, "isize", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
353
354    [I64SliceExt, AsI64Slice, as_i64_slice, i64, "i64", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [isize, "isize"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
355
356    [I128SliceExt, AsI128Slice, as_i128_slice, i128, "i128", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [f32, "f32"], [f64, "f64"]],
357
358    [F32SliceExt, AsF32Slice, as_f32_slice, f32, "f32", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f64, "f64"]],
359
360    [F64SliceExt, AsF64Slice, as_f64_slice, f64, "f64", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f32, "f32"]],
361}
362
363declare_as_x_slice_mut_trait! {
364    [U16SliceExt, U16SliceMutExt, AsU16Slice, AsU16SliceMut, as_u16_slice_mut, u16, "u16", [u32, "u32"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
365
366    [U32SliceExt, U32SliceMutExt, AsU32Slice, AsU32SliceMut, as_u32_slice_mut, u32, "u32", [u16, "u16"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
367
368    [USizeSliceExt, USizeSliceMutExt, AsUSizeSlice, AsUSizeSliceMut, as_usize_slice_mut, usize, "usize", [u16, "u16"], [u32, "u32"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
369
370    [U64SliceExt, U64SliceMutExt, AsU64Slice, AsU64SliceMut, as_u64_slice_mut, u64, "u64", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
371
372    [U128SliceExt, U128SliceMutExt, AsU128Slice, AsU128SliceMut, as_u128_slice_mut, u128, "u128", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u64, "u64"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
373
374    [I8SliceExt, I8SliceMutExt, AsI8Slice, AsI8SliceMut, as_i8_slice_mut, i8, "i8", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
375
376    [I16SliceExt, I16SliceMutExt, AsI16Slice, AsI16SliceMut, as_i16_slice_mut, i16, "i16", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
377
378    [I32SliceExt, I32SliceMutExt, AsI32Slice, AsI32SliceMut, as_i32_slice_mut, i32, "i32", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
379
380    [ISizeSliceExt, ISizeSliceMutExt, AsISizeSlice, AsISizeSliceMut, as_isize_slice_mut, isize, "isize", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
381
382    [I64SliceExt, I64SliceMutExt, AsI64Slice, AsI64SliceMut, as_i64_slice_mut, i64, "i64", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [isize, "isize"], [i128, "i128"], [f32, "f32"], [f64, "f64"]],
383
384    [I128SliceExt, I128SliceMutExt, AsI128Slice, AsI128SliceMut, as_i128_slice_mut, i128, "i128", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [f32, "f32"], [f64, "f64"]],
385
386    [F32SliceExt, F32SliceMutExt, AsF32Slice, AsF32SliceMut, as_f32_slice_mut, f32, "f32", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [i128, "i128"],  [f64, "f64"]],
387
388    [F64SliceExt, F64SliceMutExt, AsF64Slice, AsF64SliceMut, as_f64_slice_mut, f64, "f64", [u16, "u16"], [u32, "u32"], [usize, "usize"], [u64, "u64"], [u128, "u128"], [i8, "i8"], [i16, "i16"], [i32, "i32"], [i64, "i64"], [isize, "isize"], [i128, "i128"], [f32, "f32"]],
389}
390
391#[cfg(test)]
392mod tests {
393    use crate::slice_ext::U16SliceExt;
394
395    #[test]
396    fn test_slice() {
397        let u16s = [1u16; 12];
398        let u8v = u16s.as_slice();
399        eprintln!(
400            "{:?} {:?} {:?}",
401            u8v.to_be_u32_vec(),
402            u8v.to_le_u32_vec(),
403            u8v.to_ne_u32_vec()
404        );
405        eprintln!("{:?}", u8v.to_u32_slice());
406    }
407}