icu4x
icu4x copied to clipboard
Leverage Rust 1.61 to clean up ZeroVec
With Rust 1.61 and https://github.com/unicode-org/icu4x/pull/1926, we will now be able to do the following:
- Add a general-purpose
zeroslice!
macro - Remove the old type-specific
const
constructors - Migrate users of the problematic
EqULE
trait to use the new convenience macro, and then removeEqULE
For the macro, you should be able to write
static FOO: &ZeroSlice<u16> = zeroslice![<cb>; 222, 333, 444, 555];
which desugars to
static FOO: &ZeroSlice<u16> = $crate::ZeroSlice::from_ule_slice(
&<cb>([222, 333, 444, 555])
);
where <cb>
is a const function that converts from an aligned to unaligned array (i.e. AsULE::to_unaligned
); it would be nice to have a trait for this but we still can't use trait functions in a const context. We can probably write it such that the function only needs to convert from a single T
to a single T::ULE
and call it in a loop. The big thing is that we can write ZeroSlice::from_ule_slice
in a const context now.
Example of using the const function to build a ZeroSlice: https://github.com/unicode-org/icu4x/blob/269b807d9f0eda2905efab6c9e6bd30d8c243a80/utils/codepointtrie/benches/tries/gc_small.rs
The first step for this issue is to migrate all users of from_slice_or_alloc
to use the const function if possible.