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}