Coverage Report

Created: 2025-06-16 06:50

/rust/registry/src/index.crates.io-6f17d22bba15001f/zerovec-0.10.4/src/zerovec/slice.rs
Line
Count
Source (jump to first uncovered line)
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
use super::*;
6
use alloc::boxed::Box;
7
use core::cmp::Ordering;
8
use core::ops::Range;
9
10
/// A zero-copy "slice", i.e. the zero-copy version of `[T]`. This behaves
11
/// similarly to [`ZeroVec<T>`], however [`ZeroVec<T>`] is allowed to contain
12
/// owned data and as such is ideal for deserialization since most human readable
13
/// serialization formats cannot unconditionally deserialize zero-copy.
14
///
15
/// This type can be used inside [`VarZeroVec<T>`](crate::VarZeroVec) and [`ZeroMap`](crate::ZeroMap):
16
/// This essentially allows for the construction of zero-copy types isomorphic to `Vec<Vec<T>>` by instead
17
/// using `VarZeroVec<ZeroSlice<T>>`. See the [`VarZeroVec`](crate::VarZeroVec) docs for an example.
18
///
19
/// # Examples
20
///
21
/// Const-construct a ZeroSlice of u16:
22
///
23
/// ```
24
/// use zerovec::ule::AsULE;
25
/// use zerovec::ZeroSlice;
26
///
27
/// const DATA: &ZeroSlice<u16> =
28
///     ZeroSlice::<u16>::from_ule_slice(&<u16 as AsULE>::ULE::from_array([
29
///         211, 281, 421, 32973,
30
///     ]));
31
///
32
/// assert_eq!(DATA.get(1), Some(281));
33
/// ```
34
#[repr(transparent)]
35
pub struct ZeroSlice<T: AsULE>([T::ULE]);
36
37
impl<T> ZeroSlice<T>
38
where
39
    T: AsULE,
40
{
41
    /// Returns an empty slice.
42
0
    pub const fn new_empty() -> &'static Self {
43
0
        Self::from_ule_slice(&[])
44
0
    }
45
46
    /// Get this [`ZeroSlice`] as a borrowed [`ZeroVec`]
47
    ///
48
    /// [`ZeroSlice`] does not have most of the methods that [`ZeroVec`] does,
49
    /// so it is recommended to convert it to a [`ZeroVec`] before doing anything.
50
    #[inline]
51
0
    pub const fn as_zerovec(&self) -> ZeroVec<'_, T> {
52
0
        ZeroVec::new_borrowed(&self.0)
53
0
    }
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_datetime::pattern::item::PatternItem>>::as_zerovec
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<_>>::as_zerovec
54
55
    /// Attempt to construct a `&ZeroSlice<T>` from a byte slice, returning an error
56
    /// if it's not a valid byte sequence
57
0
    pub fn parse_byte_slice(bytes: &[u8]) -> Result<&Self, ZeroVecError> {
58
0
        T::ULE::parse_byte_slice(bytes).map(Self::from_ule_slice)
59
0
    }
60
61
    /// Uses a `&[u8]` buffer as a `ZeroVec<T>` without any verification.
62
    ///
63
    /// # Safety
64
    ///
65
    /// `bytes` need to be an output from [`ZeroSlice::as_bytes()`].
66
0
    pub const unsafe fn from_bytes_unchecked(bytes: &[u8]) -> &Self {
67
0
        // &[u8] and &[T::ULE] are the same slice with different length metadata.
68
0
        Self::from_ule_slice(core::slice::from_raw_parts(
69
0
            bytes.as_ptr() as *const T::ULE,
70
0
            bytes.len() / core::mem::size_of::<T::ULE>(),
71
0
        ))
72
0
    }
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<bool>>::from_bytes_unchecked
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u8>>::from_bytes_unchecked
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u32>>::from_bytes_unchecked
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u128>>::from_bytes_unchecked
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u16>>::from_bytes_unchecked
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u64>>::from_bytes_unchecked
73
74
    /// Construct a `&ZeroSlice<T>` from a slice of ULEs.
75
    ///
76
    /// This function can be used for constructing ZeroVecs in a const context, avoiding
77
    /// parsing checks.
78
    ///
79
    /// See [`ZeroSlice`] for an example.
80
    #[inline]
81
0
    pub const fn from_ule_slice(slice: &[T::ULE]) -> &Self {
82
0
        // This is safe because ZeroSlice is transparent over [T::ULE]
83
0
        // so &ZeroSlice<T> can be safely cast from &[T::ULE]
84
0
        unsafe { &*(slice as *const _ as *const Self) }
85
0
    }
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::JoiningType>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::SentenceBreak>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::EastAsianWidth>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::HangulSyllableType>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::GraphemeClusterBreak>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::IndicSyllabicCategory>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::LineBreak>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::WordBreak>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_casemap::provider::data::CaseMapData>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_segmenter::word::WordType>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_segmenter::provider::BreakState>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<f32>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::ascii::TinyAsciiStr<8>>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_calendar::types::MonthCode>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_timezone::types::ZoneVariant>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_timezone::provider::MetazoneId>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_datetime::pattern::item::PatternItem>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_datetime::pattern::item::generic::GenericPatternItem>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<core::option::Option<icu_timezone::provider::MetazoneId>>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_timezone::provider::TimeZoneBcp47Id>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<i32>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_plurals::rules::runtime::ast::RangeOrValue>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<char>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::ascii::TinyAsciiStr<4>>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::GeneralCategory>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::Script>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::BidiClass>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::script::ScriptWithExt>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::provider::bidi_data::MirroredPairedBracketData>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_calendar::provider::chinese_based::PackedChineseBasedYearInfo>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_calendar::provider::islamic::PackedIslamicYearInfo>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_calendar::provider::EraStartDate, tinystr::ascii::TinyAsciiStr<16>)>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<2>>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<4>>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<7>>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<8>>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::ascii::TinyAsciiStr<7>>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_locid::subtags::region::Region>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_locid::subtags::script::Script>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_locid::subtags::variant::Variant>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_locid::subtags::language::Language>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_locid::extensions::unicode::key::Key>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>, tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>)>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>, tinystr::unvalidated::UnvalidatedTinyAsciiStr<4>)>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(tinystr::unvalidated::UnvalidatedTinyAsciiStr<4>, tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>)>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_locid::subtags::script::Script, icu_locid::subtags::region::Region)>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_locid::subtags::language::Language, core::option::Option<icu_locid::subtags::script::Script>, core::option::Option<icu_locid::subtags::region::Region>)>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_locid::subtags::language::Language, icu_locid::subtags::region::Region)>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_locid::subtags::language::Language, icu_locid::subtags::script::Script)>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<bool>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u8>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u32>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u128>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u16>>::from_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u64>>::from_ule_slice
86
87
    /// Construct a `Box<ZeroSlice<T>>` from a boxed slice of ULEs
88
    #[inline]
89
0
    pub fn from_boxed_slice(slice: Box<[T::ULE]>) -> Box<Self> {
90
0
        // This is safe because ZeroSlice is transparent over [T::ULE]
91
0
        // so Box<ZeroSlice<T>> can be safely cast from Box<[T::ULE]>
92
0
        unsafe { Box::from_raw(Box::into_raw(slice) as *mut Self) }
93
0
    }
94
95
    /// Returns this slice as its underlying `&[u8]` byte buffer representation.
96
    ///
97
    /// Useful for serialization.
98
    ///
99
    /// # Example
100
    ///
101
    /// ```
102
    /// use zerovec::ZeroVec;
103
    ///
104
    /// // The little-endian bytes correspond to the numbers on the following line.
105
    /// let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
106
    /// let nums: &[u16] = &[211, 281, 421, 32973];
107
    ///
108
    /// let zerovec = ZeroVec::alloc_from_slice(nums);
109
    ///
110
    /// assert_eq!(bytes, zerovec.as_bytes());
111
    /// ```
112
    #[inline]
113
0
    pub fn as_bytes(&self) -> &[u8] {
114
0
        T::ULE::as_byte_slice(self.as_ule_slice())
115
0
    }
116
117
    /// Dereferences this slice as `&[T::ULE]`.
118
    #[inline]
119
0
    pub const fn as_ule_slice(&self) -> &[T::ULE] {
120
0
        &self.0
121
0
    }
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::JoiningType>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::SentenceBreak>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::EastAsianWidth>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::HangulSyllableType>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::GraphemeClusterBreak>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::IndicSyllabicCategory>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::LineBreak>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::WordBreak>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_casemap::provider::data::CaseMapData>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_segmenter::word::WordType>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_segmenter::provider::BreakState>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<f32>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::ascii::TinyAsciiStr<8>>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_calendar::types::MonthCode>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_timezone::types::ZoneVariant>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_timezone::provider::MetazoneId>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_datetime::pattern::item::PatternItem>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_datetime::pattern::item::generic::GenericPatternItem>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<core::option::Option<icu_timezone::provider::MetazoneId>>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_timezone::provider::TimeZoneBcp47Id>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u8>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<i32>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_plurals::rules::runtime::ast::RangeOrValue>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u64>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<char>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::ascii::TinyAsciiStr<4>>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::GeneralCategory>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::Script>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::BidiClass>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::script::ScriptWithExt>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::provider::bidi_data::MirroredPairedBracketData>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u8>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u32>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u16>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_calendar::provider::chinese_based::PackedChineseBasedYearInfo>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_calendar::provider::islamic::PackedIslamicYearInfo>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_calendar::provider::EraStartDate, tinystr::ascii::TinyAsciiStr<16>)>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<2>>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<4>>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<7>>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<8>>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::ascii::TinyAsciiStr<7>>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_locid::subtags::region::Region>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_locid::subtags::script::Script>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_locid::subtags::variant::Variant>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_locid::subtags::language::Language>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_locid::extensions::unicode::key::Key>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>, tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>)>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>, tinystr::unvalidated::UnvalidatedTinyAsciiStr<4>)>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(tinystr::unvalidated::UnvalidatedTinyAsciiStr<4>, tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>)>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_locid::subtags::script::Script, icu_locid::subtags::region::Region)>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_locid::subtags::language::Language, core::option::Option<icu_locid::subtags::script::Script>, core::option::Option<icu_locid::subtags::region::Region>)>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_locid::subtags::language::Language, icu_locid::subtags::region::Region)>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_locid::subtags::language::Language, icu_locid::subtags::script::Script)>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u32>>::as_ule_slice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<_>>::as_ule_slice
122
123
    /// Returns the number of elements in this slice.
124
    ///
125
    /// # Example
126
    ///
127
    /// ```
128
    /// use zerovec::ule::AsULE;
129
    /// use zerovec::ZeroVec;
130
    ///
131
    /// let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
132
    /// let zerovec: ZeroVec<u16> =
133
    ///     ZeroVec::parse_byte_slice(bytes).expect("infallible");
134
    ///
135
    /// assert_eq!(4, zerovec.len());
136
    /// assert_eq!(
137
    ///     bytes.len(),
138
    ///     zerovec.len() * std::mem::size_of::<<u16 as AsULE>::ULE>()
139
    /// );
140
    /// ```
141
    #[inline]
142
0
    pub const fn len(&self) -> usize {
143
0
        self.as_ule_slice().len()
144
0
    }
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_casemap::provider::data::CaseMapData>>::len
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u8>>::len
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u16>>::len
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_datetime::pattern::item::PatternItem>>::len
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_datetime::pattern::item::generic::GenericPatternItem>>::len
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u8>>::len
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<char>>::len
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u16>>::len
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::GeneralCategory>>::len
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::Script>>::len
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::BidiClass>>::len
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::script::ScriptWithExt>>::len
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::provider::bidi_data::MirroredPairedBracketData>>::len
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u32>>::len
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<_>>::len
145
146
    /// Returns whether this slice is empty.
147
    ///
148
    /// # Example
149
    ///
150
    /// ```
151
    /// use zerovec::ZeroVec;
152
    ///
153
    /// let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
154
    /// let zerovec: ZeroVec<u16> =
155
    ///     ZeroVec::parse_byte_slice(bytes).expect("infallible");
156
    /// assert!(!zerovec.is_empty());
157
    ///
158
    /// let emptyvec: ZeroVec<u16> =
159
    ///     ZeroVec::parse_byte_slice(&[]).expect("infallible");
160
    /// assert!(emptyvec.is_empty());
161
    /// ```
162
    #[inline]
163
0
    pub const fn is_empty(&self) -> bool {
164
0
        self.as_ule_slice().is_empty()
165
0
    }
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u32>>::is_empty
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<_>>::is_empty
166
}
167
168
impl<T> ZeroSlice<T>
169
where
170
    T: AsULE,
171
{
172
    /// Gets the element at the specified index. Returns `None` if out of range.
173
    ///
174
    /// # Example
175
    ///
176
    /// ```
177
    /// use zerovec::ZeroVec;
178
    ///
179
    /// let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
180
    /// let zerovec: ZeroVec<u16> =
181
    ///     ZeroVec::parse_byte_slice(bytes).expect("infallible");
182
    ///
183
    /// assert_eq!(zerovec.get(2), Some(421));
184
    /// assert_eq!(zerovec.get(4), None);
185
    /// ```
186
    #[inline]
187
0
    pub fn get(&self, index: usize) -> Option<T> {
188
0
        self.as_ule_slice()
189
0
            .get(index)
190
0
            .copied()
191
0
            .map(T::from_unaligned)
192
0
    }
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_segmenter::word::WordType>>::get
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<char>>::get
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_segmenter::provider::BreakState>>::get
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<f32>>::get
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_timezone::provider::TimeZoneBcp47Id>>::get
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u8>>::get
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u64>>::get
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::GeneralCategory>>::get
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::Script>>::get
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::script::ScriptWithExt>>::get
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u32>>::get
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u16>>::get
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_calendar::provider::chinese_based::PackedChineseBasedYearInfo>>::get
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_calendar::provider::islamic::PackedIslamicYearInfo>>::get
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_calendar::provider::EraStartDate, tinystr::ascii::TinyAsciiStr<16>)>>::get
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_locid::subtags::region::Region>>::get
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u32>>::get
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<_>>::get
193
194
    /// Gets the entire slice as an array of length `N`. Returns `None` if the slice
195
    /// does not have exactly `N` elements.
196
    ///
197
    /// # Example
198
    ///
199
    /// ```
200
    /// use zerovec::ZeroVec;
201
    ///
202
    /// let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
203
    /// let zerovec: ZeroVec<u16> =
204
    ///     ZeroVec::parse_byte_slice(bytes).expect("infallible");
205
    /// let array: [u16; 4] =
206
    ///     zerovec.get_as_array().expect("should be 4 items in array");
207
    ///
208
    /// assert_eq!(array[2], 421);
209
    /// ```
210
0
    pub fn get_as_array<const N: usize>(&self) -> Option<[T; N]> {
211
0
        let ule_array = <&[T::ULE; N]>::try_from(self.as_ule_slice()).ok()?;
212
0
        Some(ule_array.map(|u| T::from_unaligned(u)))
213
0
    }
214
215
    /// Gets a subslice of elements within a certain range. Returns `None` if the range
216
    /// is out of bounds of this `ZeroSlice`.
217
    ///
218
    /// # Example
219
    ///
220
    /// ```
221
    /// use zerovec::ZeroVec;
222
    ///
223
    /// let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
224
    /// let zerovec: ZeroVec<u16> =
225
    ///     ZeroVec::parse_byte_slice(bytes).expect("infallible");
226
    ///
227
    /// assert_eq!(
228
    ///     zerovec.get_subslice(1..3),
229
    ///     Some(&*ZeroVec::from_slice_or_alloc(&[0x0119, 0x01A5]))
230
    /// );
231
    /// assert_eq!(zerovec.get_subslice(3..5), None);
232
    /// ```
233
    #[inline]
234
0
    pub fn get_subslice(&self, range: Range<usize>) -> Option<&ZeroSlice<T>> {
235
0
        self.0.get(range).map(ZeroSlice::from_ule_slice)
236
0
    }
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<f32>>::get_subslice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_timezone::types::ZoneVariant>>::get_subslice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u32>>::get_subslice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u64>>::get_subslice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<char>>::get_subslice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u16>>::get_subslice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>>>::get_subslice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<4>>>::get_subslice
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<_>>::get_subslice
237
238
    /// Get a borrowed reference to the underlying ULE type at a specified index.
239
    ///
240
    /// Prefer [`Self::get()`] over this method where possible since working
241
    /// directly with `ULE` types is less ergonomic
242
0
    pub fn get_ule_ref(&self, index: usize) -> Option<&T::ULE> {
243
0
        self.as_ule_slice().get(index)
244
0
    }
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<core::option::Option<icu_timezone::provider::MetazoneId>>>::get_ule_ref
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<i32>>::get_ule_ref
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u16>>::get_ule_ref
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::ascii::TinyAsciiStr<7>>>::get_ule_ref
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_locid::subtags::region::Region>>::get_ule_ref
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_locid::subtags::script::Script>>::get_ule_ref
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_locid::subtags::variant::Variant>>::get_ule_ref
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_locid::subtags::language::Language>>::get_ule_ref
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_locid::subtags::script::Script, icu_locid::subtags::region::Region)>>::get_ule_ref
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_locid::subtags::language::Language, core::option::Option<icu_locid::subtags::script::Script>, core::option::Option<icu_locid::subtags::region::Region>)>>::get_ule_ref
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_locid::subtags::language::Language, icu_locid::subtags::region::Region)>>::get_ule_ref
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_locid::subtags::language::Language, icu_locid::subtags::script::Script)>>::get_ule_ref
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<_>>::get_ule_ref
245
246
    /// Casts a `ZeroSlice<T>` to a compatible `ZeroSlice<P>`.
247
    ///
248
    /// `T` and `P` are compatible if they have the same `ULE` representation.
249
    ///
250
    /// If the `ULE`s of `T` and `P` are different, use [`Self::try_as_converted()`].
251
    ///
252
    /// # Examples
253
    ///
254
    /// ```
255
    /// use zerovec::ZeroSlice;
256
    ///
257
    /// const BYTES: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
258
    /// const ZS_U16: &ZeroSlice<u16> = {
259
    ///     match ZeroSlice::<u16>::try_from_bytes(BYTES) {
260
    ///         Ok(s) => s,
261
    ///         Err(_) => unreachable!(),
262
    ///     }
263
    /// };
264
    ///
265
    /// let zs_i16: &ZeroSlice<i16> = ZS_U16.cast();
266
    ///
267
    /// assert_eq!(ZS_U16.get(3), Some(32973));
268
    /// assert_eq!(zs_i16.get(3), Some(-32563));
269
    /// ```
270
    #[inline]
271
0
    pub const fn cast<P>(&self) -> &ZeroSlice<P>
272
0
    where
273
0
        P: AsULE<ULE = T::ULE>,
274
0
    {
275
0
        ZeroSlice::<P>::from_ule_slice(self.as_ule_slice())
276
0
    }
277
278
    /// Converts a `&ZeroSlice<T>` into a `&ZeroSlice<P>`.
279
    ///
280
    /// The resulting slice will have the same length as the original slice
281
    /// if and only if `T::ULE` and `P::ULE` are the same size.
282
    ///
283
    /// If `T` and `P` have the exact same `ULE`, use [`Self::cast()`].
284
    ///
285
    /// # Examples
286
    ///
287
    /// ```
288
    /// use zerovec::ZeroSlice;
289
    ///
290
    /// const BYTES: &[u8] = &[0x7F, 0xF3, 0x01, 0x00, 0x49, 0xF6, 0x01, 0x00];
291
    /// const ZS_U32: &ZeroSlice<u32> = {
292
    ///     match ZeroSlice::<u32>::try_from_bytes(BYTES) {
293
    ///         Ok(s) => s,
294
    ///         Err(_) => unreachable!(),
295
    ///     }
296
    /// };
297
    ///
298
    /// let zs_u8_4: &ZeroSlice<[u8; 4]> =
299
    ///     ZS_U32.try_as_converted().expect("valid code points");
300
    ///
301
    /// assert_eq!(ZS_U32.get(0), Some(127871));
302
    /// assert_eq!(zs_u8_4.get(0), Some([0x7F, 0xF3, 0x01, 0x00]));
303
    /// ```
304
    #[inline]
305
0
    pub fn try_as_converted<P: AsULE>(&self) -> Result<&ZeroSlice<P>, ZeroVecError> {
306
0
        let new_slice = P::ULE::parse_byte_slice(self.as_bytes())?;
307
0
        Ok(ZeroSlice::from_ule_slice(new_slice))
308
0
    }
309
310
    /// Gets the first element. Returns `None` if empty.
311
    ///
312
    /// # Example
313
    ///
314
    /// ```
315
    /// use zerovec::ZeroVec;
316
    ///
317
    /// let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
318
    /// let zerovec: ZeroVec<u16> =
319
    ///     ZeroVec::parse_byte_slice(bytes).expect("infallible");
320
    ///
321
    /// assert_eq!(zerovec.first(), Some(211));
322
    /// ```
323
    #[inline]
324
0
    pub fn first(&self) -> Option<T> {
325
0
        self.as_ule_slice().first().copied().map(T::from_unaligned)
326
0
    }
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<char>>::first
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u16>>::first
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u32>>::first
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<_>>::first
327
328
    /// Gets the last element. Returns `None` if empty.
329
    ///
330
    /// # Example
331
    ///
332
    /// ```
333
    /// use zerovec::ZeroVec;
334
    ///
335
    /// let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
336
    /// let zerovec: ZeroVec<u16> =
337
    ///     ZeroVec::parse_byte_slice(bytes).expect("infallible");
338
    ///
339
    /// assert_eq!(zerovec.last(), Some(32973));
340
    /// ```
341
    #[inline]
342
0
    pub fn last(&self) -> Option<T> {
343
0
        self.as_ule_slice().last().copied().map(T::from_unaligned)
344
0
    }
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u8>>::last
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u32>>::last
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_calendar::provider::EraStartDate, tinystr::ascii::TinyAsciiStr<16>)>>::last
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<_>>::last
345
346
    /// Gets an iterator over the elements.
347
    ///
348
    /// # Example
349
    ///
350
    /// ```
351
    /// use zerovec::ZeroVec;
352
    ///
353
    /// let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
354
    /// let zerovec: ZeroVec<u16> =
355
    ///     ZeroVec::parse_byte_slice(bytes).expect("infallible");
356
    /// let mut it = zerovec.iter();
357
    ///
358
    /// assert_eq!(it.next(), Some(211));
359
    /// assert_eq!(it.next(), Some(281));
360
    /// assert_eq!(it.next(), Some(421));
361
    /// assert_eq!(it.next(), Some(32973));
362
    /// assert_eq!(it.next(), None);
363
    /// ```
364
    #[inline]
365
0
    pub fn iter(&self) -> impl DoubleEndedIterator<Item = T> + ExactSizeIterator<Item = T> + '_ {
366
0
        self.as_ule_slice().iter().copied().map(T::from_unaligned)
367
0
    }
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<f32>>::iter
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_datetime::pattern::item::PatternItem>>::iter
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_datetime::pattern::item::generic::GenericPatternItem>>::iter
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_plurals::rules::runtime::ast::RangeOrValue>>::iter
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u64>>::iter
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<char>>::iter
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u16>>::iter
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::Script>>::iter
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u32>>::iter
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_calendar::provider::EraStartDate, tinystr::ascii::TinyAsciiStr<16>)>>::iter
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_locid::subtags::region::Region>>::iter
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<_>>::iter
368
369
    /// Returns a tuple with the first element and a subslice of the remaining elements.
370
    ///
371
    /// # Example
372
    ///
373
    /// ```
374
    /// use zerovec::ule::AsULE;
375
    /// use zerovec::ZeroSlice;
376
    ///
377
    /// const DATA: &ZeroSlice<u16> =
378
    ///     ZeroSlice::<u16>::from_ule_slice(&<u16 as AsULE>::ULE::from_array([
379
    ///         211, 281, 421, 32973,
380
    ///     ]));
381
    /// const EXPECTED_VALUE: (u16, &ZeroSlice<u16>) = (
382
    ///     211,
383
    ///     ZeroSlice::<u16>::from_ule_slice(&<u16 as AsULE>::ULE::from_array([
384
    ///         281, 421, 32973,
385
    ///     ])),
386
    /// );
387
    /// assert_eq!(EXPECTED_VALUE, DATA.split_first().unwrap());
388
    /// ```
389
    #[inline]
390
0
    pub fn split_first(&self) -> Option<(T, &ZeroSlice<T>)> {
391
0
        if let Some(first) = self.first() {
392
0
            return Some((
393
0
                first,
394
0
                // `unwrap()` must succeed, because `first()` returned `Some`.
395
0
                #[allow(clippy::unwrap_used)]
396
0
                self.get_subslice(1..self.len()).unwrap(),
397
0
            ));
398
0
        }
399
0
        None
400
0
    }
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<char>>::split_first
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u16>>::split_first
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<_>>::split_first
401
}
402
403
impl<T> ZeroSlice<T>
404
where
405
    T: AsULE + Ord,
406
{
407
    /// Binary searches a sorted `ZeroVec<T>` for the given element. For more information, see
408
    /// the primitive function [`binary_search`].
409
    ///
410
    /// # Example
411
    ///
412
    /// ```
413
    /// use zerovec::ZeroVec;
414
    ///
415
    /// let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
416
    /// let zerovec: ZeroVec<u16> =
417
    ///     ZeroVec::parse_byte_slice(bytes).expect("infallible");
418
    ///
419
    /// assert_eq!(zerovec.binary_search(&281), Ok(1));
420
    /// assert_eq!(zerovec.binary_search(&282), Err(2));
421
    /// ```
422
    ///
423
    /// [`binary_search`]: https://doc.rust-lang.org/std/primitive.slice.html#method.binary_search
424
    #[inline]
425
0
    pub fn binary_search(&self, x: &T) -> Result<usize, usize> {
426
0
        self.as_ule_slice()
427
0
            .binary_search_by(|probe| T::from_unaligned(*probe).cmp(x))
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_calendar::types::MonthCode>>::binary_search::{closure#0}
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_timezone::types::ZoneVariant>>::binary_search::{closure#0}
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_timezone::provider::MetazoneId>>::binary_search::{closure#0}
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_timezone::provider::TimeZoneBcp47Id>>::binary_search::{closure#0}
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::Script>>::binary_search::{closure#0}
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u32>>::binary_search::{closure#0}
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<2>>>::binary_search::{closure#0}
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>>>::binary_search::{closure#0}
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<4>>>::binary_search::{closure#0}
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<7>>>::binary_search::{closure#0}
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<8>>>::binary_search::{closure#0}
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>, tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>)>>::binary_search::{closure#0}
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>, tinystr::unvalidated::UnvalidatedTinyAsciiStr<4>)>>::binary_search::{closure#0}
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(tinystr::unvalidated::UnvalidatedTinyAsciiStr<4>, tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>)>>::binary_search::{closure#0}
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<_>>::binary_search::{closure#0}
428
0
    }
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_calendar::types::MonthCode>>::binary_search
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_timezone::types::ZoneVariant>>::binary_search
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_timezone::provider::MetazoneId>>::binary_search
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_timezone::provider::TimeZoneBcp47Id>>::binary_search
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::Script>>::binary_search
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u32>>::binary_search
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<2>>>::binary_search
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>>>::binary_search
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<4>>>::binary_search
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<7>>>::binary_search
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<tinystr::unvalidated::UnvalidatedTinyAsciiStr<8>>>::binary_search
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>, tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>)>>::binary_search
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>, tinystr::unvalidated::UnvalidatedTinyAsciiStr<4>)>>::binary_search
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(tinystr::unvalidated::UnvalidatedTinyAsciiStr<4>, tinystr::unvalidated::UnvalidatedTinyAsciiStr<3>)>>::binary_search
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<_>>::binary_search
429
}
430
431
impl<T> ZeroSlice<T>
432
where
433
    T: AsULE,
434
{
435
    /// Binary searches a sorted `ZeroVec<T>` based on a given predicate. For more information, see
436
    /// the primitive function [`binary_search_by`].
437
    ///
438
    /// # Example
439
    ///
440
    /// ```
441
    /// use zerovec::ZeroVec;
442
    ///
443
    /// let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
444
    /// let zerovec: ZeroVec<u16> =
445
    ///     ZeroVec::parse_byte_slice(bytes).expect("infallible");
446
    ///
447
    /// assert_eq!(zerovec.binary_search_by(|x| x.cmp(&281)), Ok(1));
448
    /// assert_eq!(zerovec.binary_search_by(|x| x.cmp(&282)), Err(2));
449
    /// ```
450
    ///
451
    /// [`binary_search_by`]: https://doc.rust-lang.org/std/primitive.slice.html#method.binary_search_by
452
    #[inline]
453
0
    pub fn binary_search_by(
454
0
        &self,
455
0
        mut predicate: impl FnMut(T) -> Ordering,
456
0
    ) -> Result<usize, usize> {
457
0
        self.as_ule_slice()
458
0
            .binary_search_by(|probe| predicate(T::from_unaligned(*probe)))
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_calendar::provider::EraStartDate, tinystr::ascii::TinyAsciiStr<16>)>>::binary_search_by::<<icu_calendar::japanese::Japanese>::japanese_era_for::{closure#1}>::{closure#0}
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_calendar::provider::EraStartDate, tinystr::ascii::TinyAsciiStr<16>)>>::binary_search_by::<<icu_calendar::japanese::Japanese>::japanese_era_range_for::{closure#0}>::{closure#0}
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<_>>::binary_search_by::<_>::{closure#0}
459
0
    }
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_calendar::provider::EraStartDate, tinystr::ascii::TinyAsciiStr<16>)>>::binary_search_by::<<icu_calendar::japanese::Japanese>::japanese_era_for::{closure#1}>
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<(icu_calendar::provider::EraStartDate, tinystr::ascii::TinyAsciiStr<16>)>>::binary_search_by::<<icu_calendar::japanese::Japanese>::japanese_era_range_for::{closure#0}>
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<_>>::binary_search_by::<_>
460
}
461
462
// Safety (based on the safety checklist on the VarULE trait):
463
// (`ZeroSlice<T>` is a transparent wrapper around [T::ULE])
464
//  1. [T::ULE] does not include any uninitialized or padding bytes (achieved by being a slice of a ULE type)
465
//  2. [T::ULE] is aligned to 1 byte (achieved by being a slice of a ULE type)
466
//  3. The impl of `validate_byte_slice()` returns an error if any byte is not valid.
467
//  4. The impl of `validate_byte_slice()` returns an error if the slice cannot be used in its entirety
468
//  5. The impl of `from_byte_slice_unchecked()` returns a reference to the same data.
469
//  6. `as_byte_slice()` and `parse_byte_slice()` are defaulted
470
//  7. `[T::ULE]` byte equality is semantic equality (relying on the guideline of the underlying `ULE` type)
471
unsafe impl<T: AsULE + 'static> VarULE for ZeroSlice<T> {
472
    #[inline]
473
0
    fn validate_byte_slice(bytes: &[u8]) -> Result<(), ZeroVecError> {
474
0
        T::ULE::validate_byte_slice(bytes)
475
0
    }
476
477
    #[inline]
478
0
    unsafe fn from_byte_slice_unchecked(bytes: &[u8]) -> &Self {
479
0
        Self::from_ule_slice(T::ULE::from_byte_slice_unchecked(bytes))
480
0
    }
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_plurals::rules::runtime::ast::RangeOrValue> as zerovec::ule::VarULE>::from_byte_slice_unchecked
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_properties::props::Script> as zerovec::ule::VarULE>::from_byte_slice_unchecked
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<u32> as zerovec::ule::VarULE>::from_byte_slice_unchecked
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<icu_locid::subtags::region::Region> as zerovec::ule::VarULE>::from_byte_slice_unchecked
Unexecuted instantiation: <zerovec::zerovec::slice::ZeroSlice<_> as zerovec::ule::VarULE>::from_byte_slice_unchecked
481
}
482
483
impl<T> Eq for ZeroSlice<T> where T: AsULE + Eq {}
484
485
impl<T> PartialEq<ZeroSlice<T>> for ZeroSlice<T>
486
where
487
    T: AsULE + PartialEq,
488
{
489
    #[inline]
490
0
    fn eq(&self, other: &ZeroSlice<T>) -> bool {
491
0
        self.as_zerovec().eq(&other.as_zerovec())
492
0
    }
493
}
494
495
impl<T> PartialEq<[T]> for ZeroSlice<T>
496
where
497
    T: AsULE + PartialEq,
498
{
499
    #[inline]
500
0
    fn eq(&self, other: &[T]) -> bool {
501
0
        self.iter().eq(other.iter().copied())
502
0
    }
503
}
504
505
impl<'a, T> PartialEq<ZeroVec<'a, T>> for ZeroSlice<T>
506
where
507
    T: AsULE + PartialEq,
508
{
509
    #[inline]
510
0
    fn eq(&self, other: &ZeroVec<'a, T>) -> bool {
511
0
        self.as_zerovec().eq(other)
512
0
    }
513
}
514
515
impl<'a, T> PartialEq<ZeroSlice<T>> for ZeroVec<'a, T>
516
where
517
    T: AsULE + PartialEq,
518
{
519
    #[inline]
520
0
    fn eq(&self, other: &ZeroSlice<T>) -> bool {
521
0
        self.eq(&other.as_zerovec())
522
0
    }
523
}
524
525
impl<T> fmt::Debug for ZeroSlice<T>
526
where
527
    T: AsULE + fmt::Debug,
528
{
529
0
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
530
0
        self.as_zerovec().fmt(f)
531
0
    }
532
}
533
534
impl<T: AsULE + PartialOrd> PartialOrd for ZeroSlice<T> {
535
0
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
536
0
        self.iter().partial_cmp(other.iter())
537
0
    }
538
}
539
540
impl<T: AsULE + Ord> Ord for ZeroSlice<T> {
541
0
    fn cmp(&self, other: &Self) -> Ordering {
542
0
        self.iter().cmp(other.iter())
543
0
    }
544
}
545
546
impl<T: AsULE> AsRef<ZeroSlice<T>> for Vec<T::ULE> {
547
0
    fn as_ref(&self) -> &ZeroSlice<T> {
548
0
        ZeroSlice::<T>::from_ule_slice(self)
549
0
    }
550
}
551
552
impl<T: AsULE> AsRef<ZeroSlice<T>> for &[T::ULE] {
553
0
    fn as_ref(&self) -> &ZeroSlice<T> {
554
0
        ZeroSlice::<T>::from_ule_slice(self)
555
0
    }
556
}
557
558
impl<T> Default for &ZeroSlice<T>
559
where
560
    T: AsULE,
561
{
562
0
    fn default() -> Self {
563
0
        ZeroSlice::from_ule_slice(&[])
564
0
    }
Unexecuted instantiation: <&zerovec::zerovec::slice::ZeroSlice<icu_properties::props::Script> as core::default::Default>::default
Unexecuted instantiation: <&zerovec::zerovec::slice::ZeroSlice<_> as core::default::Default>::default
565
}
566
567
#[cfg(test)]
568
mod test {
569
    use super::*;
570
    use crate::zeroslice;
571
572
    #[test]
573
    fn test_split_first() {
574
        {
575
            // empty slice.
576
            assert_eq!(None, ZeroSlice::<u16>::new_empty().split_first());
577
        }
578
        {
579
            // single element slice
580
            const DATA: &ZeroSlice<u16> =
581
                zeroslice!(u16; <u16 as AsULE>::ULE::from_unsigned; [211]);
582
            assert_eq!((211, zeroslice![]), DATA.split_first().unwrap());
583
        }
584
        {
585
            // slice with many elements.
586
            const DATA: &ZeroSlice<u16> =
587
                zeroslice!(u16; <u16 as AsULE>::ULE::from_unsigned; [211, 281, 421, 32973]);
588
            const EXPECTED_VALUE: (u16, &ZeroSlice<u16>) = (
589
                211,
590
                zeroslice!(u16; <u16 as AsULE>::ULE::from_unsigned; [281, 421, 32973]),
591
            );
592
593
            assert_eq!(EXPECTED_VALUE, DATA.split_first().unwrap());
594
        }
595
    }
596
}