Skip to content

Commit 3bc2131

Browse files
committed
consolidate special primaries code
1 parent 880a576 commit 3bc2131

File tree

2 files changed

+62
-71
lines changed

2 files changed

+62
-71
lines changed

components/collator/src/comparison.rs

Lines changed: 3 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,7 @@ use crate::elements::{
2626
QUATERNARY_MASK,
2727
};
2828
use crate::options::CollatorOptionsBitField;
29-
use crate::options::{
30-
AlternateHandling, CollatorOptions, MaxVariable, ResolvedCollatorOptions, Strength,
31-
};
29+
use crate::options::{AlternateHandling, CollatorOptions, ResolvedCollatorOptions, Strength};
3230
use crate::preferences::{CollationCaseFirst, CollationNumericOrdering, CollationType};
3331
use crate::provider::CollationData;
3432
use crate::provider::CollationDiacritics;
@@ -648,28 +646,7 @@ impl Collator {
648646
let locale_dependent =
649647
LocaleSpecificDataHolder::try_new_unstable_internal(provider, prefs, options)?;
650648

651-
let special_primaries = special_primaries.map_project(|csp, _| {
652-
let compressible_bytes = (csp.last_primaries.len()
653-
== MaxVariable::Currency as usize + 16)
654-
.then(|| {
655-
csp.last_primaries
656-
.as_maybe_borrowed()?
657-
.as_ule_slice()
658-
.get((MaxVariable::Currency as usize)..)?
659-
.try_into()
660-
.ok()
661-
})
662-
.flatten()
663-
.unwrap_or(
664-
CollationSpecialPrimariesValidated::HARDCODED_COMPRESSIBLE_BYTES_FALLBACK,
665-
);
666-
667-
CollationSpecialPrimariesValidated {
668-
last_primaries: csp.last_primaries.truncated(MaxVariable::Currency as usize),
669-
numeric_primary: csp.numeric_primary,
670-
compressible_bytes,
671-
}
672-
});
649+
let special_primaries = special_primaries.map_project(|csp, _| csp.validated());
673650

674651
Ok(Collator {
675652
special_primaries,
@@ -748,50 +725,7 @@ impl CollatorBorrowed<'static> {
748725
LocaleSpecificDataHolder::try_new_unstable_internal(provider, prefs, options)?;
749726

750727
let special_primaries = const {
751-
&CollationSpecialPrimariesValidated {
752-
last_primaries: zerovec::ZeroSlice::from_ule_slice(
753-
crate::provider::Baked::SINGLETON_COLLATION_SPECIAL_PRIMARIES_V1
754-
.last_primaries
755-
.as_slice()
756-
.as_ule_slice()
757-
.split_at(MaxVariable::Currency as usize)
758-
.0,
759-
)
760-
.as_zerovec(),
761-
numeric_primary: crate::provider::Baked::SINGLETON_COLLATION_SPECIAL_PRIMARIES_V1
762-
.numeric_primary,
763-
compressible_bytes: {
764-
const C: &[<u16 as zerovec::ule::AsULE>::ULE] =
765-
crate::provider::Baked::SINGLETON_COLLATION_SPECIAL_PRIMARIES_V1
766-
.last_primaries
767-
.as_slice()
768-
.as_ule_slice();
769-
if C.len() == MaxVariable::Currency as usize + 16 {
770-
let i = MaxVariable::Currency as usize;
771-
#[allow(clippy::indexing_slicing)] // protected, const
772-
&[
773-
C[i],
774-
C[i + 1],
775-
C[i + 2],
776-
C[i + 3],
777-
C[i + 4],
778-
C[i + 5],
779-
C[i + 6],
780-
C[i + 7],
781-
C[i + 8],
782-
C[i + 9],
783-
C[i + 10],
784-
C[i + 11],
785-
C[i + 12],
786-
C[i + 13],
787-
C[i + 14],
788-
C[i + 15],
789-
]
790-
} else {
791-
CollationSpecialPrimariesValidated::HARDCODED_COMPRESSIBLE_BYTES_FALLBACK
792-
}
793-
},
794-
}
728+
&crate::provider::Baked::SINGLETON_COLLATION_SPECIAL_PRIMARIES_V1.const_validated()
795729
};
796730

797731
// Attribute belongs closer to `unwrap`, but

components/collator/src/provider.rs

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -649,8 +649,8 @@ pub(crate) struct CollationSpecialPrimariesValidated<'data> {
649649
pub compressible_bytes: &'data [<u16 as AsULE>::ULE; 16],
650650
}
651651

652-
impl CollationSpecialPrimariesValidated<'static> {
653-
pub(crate) const HARDCODED_COMPRESSIBLE_BYTES_FALLBACK: &'static [<u16 as AsULE>::ULE; 16] = &[
652+
impl<'a> CollationSpecialPrimaries<'a> {
653+
const HARDCODED_COMPRESSIBLE_BYTES_FALLBACK: &'static [<u16 as AsULE>::ULE; 16] = &[
654654
<u16 as AsULE>::ULE::from_unsigned(0b0000_0000_0000_0000),
655655
<u16 as AsULE>::ULE::from_unsigned(0b0000_0000_0000_0000),
656656
<u16 as AsULE>::ULE::from_unsigned(0b0000_0000_0000_0000),
@@ -668,6 +668,63 @@ impl CollationSpecialPrimariesValidated<'static> {
668668
<u16 as AsULE>::ULE::from_unsigned(0b0000_0000_0000_0000),
669669
<u16 as AsULE>::ULE::from_unsigned(0b0100_0000_0000_0000),
670670
];
671+
672+
pub(crate) fn validated(self) -> CollationSpecialPrimariesValidated<'a> {
673+
let (last_primaries, compressible_bytes) =
674+
if let Some(borrowed) = self.last_primaries.as_maybe_borrowed() {
675+
let (l, c) = borrowed
676+
.as_ule_slice()
677+
// by invariant
678+
.split_at(MaxVariable::Currency as usize);
679+
(
680+
l,
681+
c.try_into()
682+
.unwrap_or(Self::HARDCODED_COMPRESSIBLE_BYTES_FALLBACK),
683+
)
684+
} else {
685+
(
686+
self.last_primaries.as_slice().as_ule_slice(),
687+
Self::HARDCODED_COMPRESSIBLE_BYTES_FALLBACK,
688+
)
689+
};
690+
691+
let last_primaries_truncate_len = last_primaries.len();
692+
CollationSpecialPrimariesValidated {
693+
last_primaries: self.last_primaries.truncated(last_primaries_truncate_len),
694+
numeric_primary: self.numeric_primary,
695+
compressible_bytes,
696+
}
697+
}
698+
699+
pub(crate) const fn const_validated(&'static self) -> CollationSpecialPrimariesValidated<'a> {
700+
let borrowed = self.last_primaries.as_slice();
701+
let (last_primaries, compressible_bytes) = borrowed
702+
.as_ule_slice()
703+
// by invariant
704+
.split_at(MaxVariable::Currency as usize);
705+
// TODO: use c.as_array() on MSRV 1.93
706+
let compressible_bytes = if compressible_bytes.len() == 16 {
707+
unsafe { &*(compressible_bytes.as_ptr() as *const [<u16 as AsULE>::ULE; 16]) }
708+
} else {
709+
Self::HARDCODED_COMPRESSIBLE_BYTES_FALLBACK
710+
};
711+
712+
CollationSpecialPrimariesValidated {
713+
last_primaries: ZeroSlice::from_ule_slice(last_primaries).as_zerovec(),
714+
numeric_primary: self.numeric_primary,
715+
compressible_bytes,
716+
}
717+
}
718+
}
719+
720+
#[test]
721+
fn compressible_bytes() {
722+
assert_eq!(
723+
Baked::SINGLETON_COLLATION_SPECIAL_PRIMARIES_V1
724+
.clone()
725+
.validated(),
726+
Baked::SINGLETON_COLLATION_SPECIAL_PRIMARIES_V1.const_validated(),
727+
);
671728
}
672729

673730
icu_provider::data_struct!(

0 commit comments

Comments
 (0)