1 | // This file is part of ICU4X. For terms of use, please see the file |
2 | // called LICENSE at the top level of the ICU4X source tree |
3 | // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). |
4 | |
5 | /// Given `Self` (`$aligned`), `Self::ULE` (`$unaligned`), and a conversion function (`$single` or |
6 | /// `Self::from_aligned`), implement `from_array` for arrays of `$aligned` to `$unaligned`. |
7 | /// |
8 | /// The `$default` argument is due to current compiler limitations. |
9 | /// Pass any (cheap to construct) value. |
10 | #[macro_export ] |
11 | macro_rules! impl_ule_from_array { |
12 | ($aligned:ty, $unaligned:ty, $default:expr, $single:path) => { |
13 | #[doc = concat!("Convert an array of `" , stringify!($aligned), "` to an array of `" , stringify!($unaligned), "`." )] |
14 | pub const fn from_array<const N: usize>(arr: [$aligned; N]) -> [Self; N] { |
15 | let mut result = [$default; N]; |
16 | let mut i = 0; |
17 | // Won't panic because i < N and arr has length N |
18 | #[allow(clippy::indexing_slicing)] |
19 | while i < N { |
20 | result[i] = $single(arr[i]); |
21 | i += 1; |
22 | } |
23 | result |
24 | } |
25 | }; |
26 | ($aligned:ty, $unaligned:ty, $default:expr) => { |
27 | impl_ule_from_array!($aligned, $unaligned, $default, Self::from_aligned); |
28 | }; |
29 | } |
30 | |