pub struct CodePointInversionList<'data> {
inv_list: ZeroVec<'data, u32>,
size: u32,
}
Expand description
A membership wrapper for CodePointInversionList
.
Provides exposure to membership functions and constructors from serialized CodePointSet
s (sets of code points)
and predefined ranges.
Fields§
§inv_list: ZeroVec<'data, u32>
§size: u32
Implementations§
source§impl<'data> CodePointInversionList<'data>
impl<'data> CodePointInversionList<'data>
sourcepub fn try_from_inversion_list(
inv_list: ZeroVec<'data, u32>,
) -> Result<Self, CodePointInversionListError>
pub fn try_from_inversion_list( inv_list: ZeroVec<'data, u32>, ) -> Result<Self, CodePointInversionListError>
Returns a new CodePointInversionList
from an inversion list
represented as a ZeroVec
<
u32
>
of code points.
The inversion list must be of even length, sorted ascending non-overlapping,
and within the bounds of 0x0 -> 0x10FFFF
inclusive, and end points being exclusive.
§Examples
use icu::collections::codepointinvlist::CodePointInversionList;
use icu::collections::codepointinvlist::CodePointInversionListError;
use zerovec::ZeroVec;
let valid = [0x0, 0x10000];
let inv_list: ZeroVec<u32> = ZeroVec::from_slice_or_alloc(&valid);
let result = CodePointInversionList::try_from_inversion_list(inv_list);
assert!(matches!(result, CodePointInversionList));
let invalid: Vec<u32> = vec![0x0, 0x80, 0x3];
let inv_list: ZeroVec<u32> = ZeroVec::from_slice_or_alloc(&invalid);
let result = CodePointInversionList::try_from_inversion_list(inv_list);
assert!(matches!(
result,
Err(CodePointInversionListError::InvalidSet(_))
));
if let Err(CodePointInversionListError::InvalidSet(actual)) = result {
assert_eq!(&invalid, &actual);
}
sourcepub fn try_from_inversion_list_slice(
inv_list: &'data [u32],
) -> Result<Self, CodePointInversionListError>
pub fn try_from_inversion_list_slice( inv_list: &'data [u32], ) -> Result<Self, CodePointInversionListError>
Returns a new CodePointInversionList
by borrowing an inversion list
represented as a slice of u32
code points.
The inversion list must be of even length, sorted ascending non-overlapping,
and within the bounds of 0x0 -> 0x10FFFF
inclusive, and end points being exclusive.
Note: The slice may be cloned on certain platforms; for more information, see ZeroVec::from_slice_or_alloc
.
§Examples
use icu::collections::codepointinvlist::CodePointInversionList;
use icu::collections::codepointinvlist::CodePointInversionListError;
let valid = [0x0, 0x10000];
let result = CodePointInversionList::try_from_inversion_list_slice(&valid);
assert!(matches!(result, CodePointInversionList));
let invalid: Vec<u32> = vec![0x0, 0x80, 0x3];
let result =
CodePointInversionList::try_from_inversion_list_slice(&invalid);
assert!(matches!(
result,
Err(CodePointInversionListError::InvalidSet(_))
));
if let Err(CodePointInversionListError::InvalidSet(actual)) = result {
assert_eq!(&invalid, &actual);
}
sourcepub fn try_clone_from_inversion_list_slice(
inv_list: &[u32],
) -> Result<Self, CodePointInversionListError>
pub fn try_clone_from_inversion_list_slice( inv_list: &[u32], ) -> Result<Self, CodePointInversionListError>
Returns a new, fully-owned CodePointInversionList
by cloning an inversion list
represented as a slice of u32
code points.
The inversion list must be of even length, sorted ascending non-overlapping,
and within the bounds of 0x0 -> 0x10FFFF
inclusive, and end points being exclusive.
§Examples
use icu::collections::codepointinvlist::CodePointInversionList;
let bmp_list = &[0x0, 0x10000];
let smp_list = &[0x10000, 0x20000];
let sip_list = &[0x20000, 0x30000];
let lists: Vec<CodePointInversionList> =
[&bmp_list[..], smp_list, sip_list]
.into_iter()
.map(|l| {
CodePointInversionList::try_clone_from_inversion_list_slice(l)
.unwrap()
})
.collect();
let bmp = &lists[0];
assert!(bmp.contains32(0xFFFF));
assert!(!bmp.contains32(0x10000));
assert!(!lists.iter().any(|set| set.contains32(0x40000)));
sourcepub fn into_owned(self) -> CodePointInversionList<'static>
pub fn into_owned(self) -> CodePointInversionList<'static>
Attempts to convert this list into a fully-owned one. No-op if already fully owned
sourcepub fn get_inversion_list_vec(&self) -> Vec<u32>
pub fn get_inversion_list_vec(&self) -> Vec<u32>
Returns an owned inversion list representing the current CodePointInversionList
sourcepub fn all() -> Self
pub fn all() -> Self
Returns CodePointInversionList
spanning entire Unicode range
The range spans from 0x0 -> 0x10FFFF
inclusive.
§Examples
use icu::collections::codepointinvlist::CodePointInversionList;
let expected = [0x0, (char::MAX as u32) + 1];
assert_eq!(
CodePointInversionList::all().get_inversion_list_vec(),
expected
);
assert_eq!(
CodePointInversionList::all().size(),
(expected[1] - expected[0]) as usize
);
sourcepub fn bmp() -> Self
pub fn bmp() -> Self
Returns CodePointInversionList
spanning BMP range
The range spans from 0x0 -> 0xFFFF
inclusive.
§Examples
use icu::collections::codepointinvlist::CodePointInversionList;
const BMP_MAX: u32 = 0xFFFF;
let expected = [0x0, BMP_MAX + 1];
assert_eq!(
CodePointInversionList::bmp().get_inversion_list_vec(),
expected
);
assert_eq!(
CodePointInversionList::bmp().size(),
(expected[1] - expected[0]) as usize
);
sourcepub(crate) fn as_inversion_list(&self) -> &ZeroVec<'_, u32>
pub(crate) fn as_inversion_list(&self) -> &ZeroVec<'_, u32>
Returns the inversion list as a slice
Public only to the crate, not exposed to public
sourcepub fn iter_chars(&self) -> impl Iterator<Item = char> + '_
pub fn iter_chars(&self) -> impl Iterator<Item = char> + '_
Yields an Iterator
going through the character set in the CodePointInversionList
§Examples
use icu::collections::codepointinvlist::CodePointInversionList;
let example_list = [0x41, 0x44, 0x45, 0x46];
let example =
CodePointInversionList::try_from_inversion_list_slice(&example_list)
.unwrap();
let mut ex_iter_chars = example.iter_chars();
assert_eq!(Some('A'), ex_iter_chars.next());
assert_eq!(Some('B'), ex_iter_chars.next());
assert_eq!(Some('C'), ex_iter_chars.next());
assert_eq!(Some('E'), ex_iter_chars.next());
assert_eq!(None, ex_iter_chars.next());
sourcepub fn iter_ranges(
&self,
) -> impl ExactSizeIterator<Item = RangeInclusive<u32>> + '_
pub fn iter_ranges( &self, ) -> impl ExactSizeIterator<Item = RangeInclusive<u32>> + '_
Yields an Iterator
returning the ranges of the code points that are
included in the CodePointInversionList
Ranges are returned as RangeInclusive
, which is inclusive of its
end
bound value. An end-inclusive behavior matches the ICU4C/J
behavior of ranges, ex: CodePointInversionList::contains(UChar32 start, UChar32 end)
.
§Example
use icu::collections::codepointinvlist::CodePointInversionList;
let example_list = [0x41, 0x44, 0x45, 0x46];
let example =
CodePointInversionList::try_from_inversion_list_slice(&example_list)
.unwrap();
let mut example_iter_ranges = example.iter_ranges();
assert_eq!(Some(0x41..=0x43), example_iter_ranges.next());
assert_eq!(Some(0x45..=0x45), example_iter_ranges.next());
assert_eq!(None, example_iter_ranges.next());
sourcepub fn iter_ranges_complemented(
&self,
) -> impl Iterator<Item = RangeInclusive<u32>> + '_
pub fn iter_ranges_complemented( &self, ) -> impl Iterator<Item = RangeInclusive<u32>> + '_
Yields an Iterator
returning the ranges of the code points that are
not included in the CodePointInversionList
Ranges are returned as RangeInclusive
, which is inclusive of its
end
bound value. An end-inclusive behavior matches the ICU4C/J
behavior of ranges, ex: CodePointInversionList::contains(UChar32 start, UChar32 end)
.
§Example
use icu::collections::codepointinvlist::CodePointInversionList;
let example_list = [0x41, 0x44, 0x45, 0x46];
let example =
CodePointInversionList::try_from_inversion_list_slice(&example_list)
.unwrap();
let mut example_iter_ranges = example.iter_ranges_complemented();
assert_eq!(Some(0..=0x40), example_iter_ranges.next());
assert_eq!(Some(0x44..=0x44), example_iter_ranges.next());
assert_eq!(Some(0x46..=char::MAX as u32), example_iter_ranges.next());
assert_eq!(None, example_iter_ranges.next());
sourcepub fn get_range_count(&self) -> usize
pub fn get_range_count(&self) -> usize
Returns the number of ranges contained in this CodePointInversionList
sourcepub fn get_nth_range(&self, idx: usize) -> Option<RangeInclusive<u32>>
pub fn get_nth_range(&self, idx: usize) -> Option<RangeInclusive<u32>>
Returns a specific range contained in this CodePointInversionList
by index.
Intended for use in FFI.
sourcepub fn size(&self) -> usize
pub fn size(&self) -> usize
Returns the number of elements of the CodePointInversionList
sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns whether or not the CodePointInversionList
is empty
sourcefn contains_query(&self, query: u32) -> Option<usize>
fn contains_query(&self, query: u32) -> Option<usize>
sourcepub fn contains(&self, query: char) -> bool
pub fn contains(&self, query: char) -> bool
Checks to see the query is in the CodePointInversionList
Runs a binary search in O(log(n))
where n
is the number of start and end points
in the set using core
implementation
§Examples
use icu::collections::codepointinvlist::CodePointInversionList;
let example_list = [0x41, 0x43, 0x44, 0x45];
let example =
CodePointInversionList::try_from_inversion_list_slice(&example_list)
.unwrap();
assert!(example.contains('A'));
assert!(!example.contains('C'));
sourcepub fn contains32(&self, query: u32) -> bool
pub fn contains32(&self, query: u32) -> bool
Checks to see the unsigned int is in the CodePointInversionList::all()
Note: Even though u32
and char
in Rust are non-negative 4-byte
values, there is an important difference. A u32
can take values up to
a very large integer value, while a char
in Rust is defined to be in
the range from 0 to the maximum valid Unicode Scalar Value.
Runs a binary search in O(log(n))
where n
is the number of start and end points
in the set using core
implementation
§Examples
use icu::collections::codepointinvlist::CodePointInversionList;
let example_list = [0x41, 0x43, 0x44, 0x45];
let example =
CodePointInversionList::try_from_inversion_list_slice(&example_list)
.unwrap();
assert!(example.contains32(0x41));
assert!(!example.contains32(0x43));
sourcepub fn contains_range(&self, range: &impl RangeBounds<char>) -> bool
pub fn contains_range(&self, range: &impl RangeBounds<char>) -> bool
Checks to see if the range is in the CodePointInversionList
Runs a binary search in O(log(n))
where n
is the number of start and end points
in the set using Vec
implementation. Only runs the search once on the start
parameter, while the end
parameter is checked in a single O(1)
step.
§Examples
use icu::collections::codepointinvlist::CodePointInversionList;
let example_list = [0x41, 0x43, 0x44, 0x45];
let example =
CodePointInversionList::try_from_inversion_list_slice(&example_list)
.unwrap();
assert!(example.contains_range(&('A'..'C')));
assert!(example.contains_range(&('A'..='B')));
assert!(!example.contains_range(&('A'..='C')));
Surrogate points (0xD800 -> 0xDFFF
) will return false
if the Range contains them but the
CodePointInversionList
does not.
Note: when comparing to ICU4C/J, keep in mind that Range
s in Rust are
constructed inclusive of start boundary and exclusive of end boundary.
The ICU4C/J CodePointInversionList::contains(UChar32 start, UChar32 end)
method
differs by including the end boundary.
§Examples
use icu::collections::codepointinvlist::CodePointInversionList;
use std::char;
let check =
char::from_u32(0xD7FE).unwrap()..char::from_u32(0xE001).unwrap();
let example_list = [0xD7FE, 0xD7FF, 0xE000, 0xE001];
let example =
CodePointInversionList::try_from_inversion_list_slice(&example_list)
.unwrap();
assert!(!example.contains_range(&(check)));
sourcepub fn contains_set(&self, set: &Self) -> bool
pub fn contains_set(&self, set: &Self) -> bool
Check if the calling CodePointInversionList
contains all the characters of the given CodePointInversionList
§Examples
use icu::collections::codepointinvlist::CodePointInversionList;
let example_list = [0x41, 0x46, 0x55, 0x5B]; // A - E, U - Z
let example =
CodePointInversionList::try_from_inversion_list_slice(&example_list)
.unwrap();
let a_to_d =
CodePointInversionList::try_from_inversion_list_slice(&[0x41, 0x45])
.unwrap();
let f_to_t =
CodePointInversionList::try_from_inversion_list_slice(&[0x46, 0x55])
.unwrap();
let r_to_x =
CodePointInversionList::try_from_inversion_list_slice(&[0x52, 0x58])
.unwrap();
assert!(example.contains_set(&a_to_d)); // contains all
assert!(!example.contains_set(&f_to_t)); // contains none
assert!(!example.contains_set(&r_to_x)); // contains some
sourcepub fn span(&self, span_str: &str, contained: bool) -> usize
pub fn span(&self, span_str: &str, contained: bool) -> usize
Returns the end of the initial substring where the characters are either contained/not contained in the set.
§Examples
use icu::collections::codepointinvlist::CodePointInversionList;
let example_list = [0x41, 0x44]; // {A, B, C}
let example =
CodePointInversionList::try_from_inversion_list_slice(&example_list)
.unwrap();
assert_eq!(example.span("CABXYZ", true), 3);
assert_eq!(example.span("XYZC", false), 3);
assert_eq!(example.span("XYZ", true), 0);
assert_eq!(example.span("ABC", false), 0);
sourcepub fn span_back(&self, span_str: &str, contained: bool) -> usize
pub fn span_back(&self, span_str: &str, contained: bool) -> usize
Returns the start of the trailing substring (starting from end of string) where the characters are either contained/not contained in the set. Returns the length of the string if no valid return.
§Examples
use icu::collections::codepointinvlist::CodePointInversionList;
let example_list = [0x41, 0x44]; // {A, B, C}
let example =
CodePointInversionList::try_from_inversion_list_slice(&example_list)
.unwrap();
assert_eq!(example.span_back("XYZCAB", true), 3);
assert_eq!(example.span_back("ABCXYZ", true), 6);
assert_eq!(example.span_back("CABXYZ", false), 3);
Trait Implementations§
source§impl<'data> Clone for CodePointInversionList<'data>
impl<'data> Clone for CodePointInversionList<'data>
source§fn clone(&self) -> CodePointInversionList<'data>
fn clone(&self) -> CodePointInversionList<'data>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl<'data> Debug for CodePointInversionList<'data>
impl<'data> Debug for CodePointInversionList<'data>
source§impl<'data> EncodeAsVarULE<CodePointInversionListULE> for &CodePointInversionList<'data>
impl<'data> EncodeAsVarULE<CodePointInversionListULE> for &CodePointInversionList<'data>
source§fn encode_var_ule_as_slices<R>(&self, cb: impl FnOnce(&[&[u8]]) -> R) -> R
fn encode_var_ule_as_slices<R>(&self, cb: impl FnOnce(&[&[u8]]) -> R) -> R
cb
with a piecewise list of byte slices that when concatenated
produce the memory pattern of the corresponding instance of T
. Read moresource§fn encode_var_ule_len(&self) -> usize
fn encode_var_ule_len(&self) -> usize
VarULE
typesource§fn encode_var_ule_write(&self, dst: &mut [u8])
fn encode_var_ule_write(&self, dst: &mut [u8])
VarULE
type to the dst
buffer. dst
should
be the size of Self::encode_var_ule_len()
source§impl<'data> EncodeAsVarULE<CodePointInversionListULE> for CodePointInversionList<'data>
impl<'data> EncodeAsVarULE<CodePointInversionListULE> for CodePointInversionList<'data>
source§fn encode_var_ule_as_slices<R>(&self, cb: impl FnOnce(&[&[u8]]) -> R) -> R
fn encode_var_ule_as_slices<R>(&self, cb: impl FnOnce(&[&[u8]]) -> R) -> R
cb
with a piecewise list of byte slices that when concatenated
produce the memory pattern of the corresponding instance of T
. Read moresource§fn encode_var_ule_len(&self) -> usize
fn encode_var_ule_len(&self) -> usize
VarULE
typesource§fn encode_var_ule_write(&self, dst: &mut [u8])
fn encode_var_ule_write(&self, dst: &mut [u8])
VarULE
type to the dst
buffer. dst
should
be the size of Self::encode_var_ule_len()
source§impl FromIterator<RangeInclusive<u32>> for CodePointInversionList<'_>
impl FromIterator<RangeInclusive<u32>> for CodePointInversionList<'_>
source§fn from_iter<I: IntoIterator<Item = RangeInclusive<u32>>>(iter: I) -> Self
fn from_iter<I: IntoIterator<Item = RangeInclusive<u32>>>(iter: I) -> Self
source§impl<'data> PartialEq for CodePointInversionList<'data>
impl<'data> PartialEq for CodePointInversionList<'data>
source§fn eq(&self, other: &CodePointInversionList<'data>) -> bool
fn eq(&self, other: &CodePointInversionList<'data>) -> bool
self
and other
values to be equal, and is used
by ==
.source§impl<'data> TryFrom<&RangeFull> for CodePointInversionList<'data>
impl<'data> TryFrom<&RangeFull> for CodePointInversionList<'data>
source§impl<'data> TryFrom<&RangeInclusive<char>> for CodePointInversionList<'data>
impl<'data> TryFrom<&RangeInclusive<char>> for CodePointInversionList<'data>
§type Error = CodePointInversionListError
type Error = CodePointInversionListError
source§impl<'data> TryFrom<&RangeToInclusive<char>> for CodePointInversionList<'data>
impl<'data> TryFrom<&RangeToInclusive<char>> for CodePointInversionList<'data>
§type Error = CodePointInversionListError
type Error = CodePointInversionListError
source§impl<'a> Yokeable<'a> for CodePointInversionList<'static>
impl<'a> Yokeable<'a> for CodePointInversionList<'static>
§type Output = CodePointInversionList<'a>
type Output = CodePointInversionList<'a>
Self
with the 'static
replaced with 'a
, i.e. Self<'a>
source§fn transform_owned(self) -> Self::Output
fn transform_owned(self) -> Self::Output
source§impl<'data> ZeroFrom<'data, CodePointInversionListULE> for CodePointInversionList<'data>
impl<'data> ZeroFrom<'data, CodePointInversionListULE> for CodePointInversionList<'data>
source§fn zero_from(other: &'data CodePointInversionListULE) -> Self
fn zero_from(other: &'data CodePointInversionListULE) -> Self
C
into a struct that may retain references into C
.source§impl<'zf, 'zf_inner> ZeroFrom<'zf, CodePointInversionList<'zf_inner>> for CodePointInversionList<'zf>
impl<'zf, 'zf_inner> ZeroFrom<'zf, CodePointInversionList<'zf_inner>> for CodePointInversionList<'zf>
source§fn zero_from(this: &'zf CodePointInversionList<'zf_inner>) -> Self
fn zero_from(this: &'zf CodePointInversionList<'zf_inner>) -> Self
C
into a struct that may retain references into C
.