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 CodePointSets (sets of code points) and predefined ranges.

Fields§

§inv_list: ZeroVec<'data, u32>§size: u32

Implementations§

source§

impl<'data> CodePointInversionList<'data>

source

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);
}
source

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;
use zerovec::ZeroVec;
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);
}
source

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;
use std::vec::Vec;
use zerovec::ZeroVec;

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)));
source

pub fn into_owned(self) -> CodePointInversionList<'static>

Attempts to convert this list into a fully-owned one. No-op if already fully owned

source

pub fn get_inversion_list_vec(&self) -> Vec<u32>

Returns an owned inversion list representing the current CodePointInversionList

source

pub fn all() -> Self

Returns CodePointInversionList spanning entire Unicode range

The range spans from 0x0 -> 0x10FFFF inclusive.

Examples
use icu_collections::codepointinvlist::CodePointInversionList;
use zerovec::ZeroVec;

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
);
source

pub fn bmp() -> Self

Returns CodePointInversionList spanning BMP range

The range spans from 0x0 -> 0xFFFF inclusive.

Examples
use icu_collections::codepointinvlist::CodePointInversionList;
use zerovec::ZeroVec;

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
);
source

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

source

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());
source

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());
source

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());
source

pub fn get_range_count(&self) -> usize

Returns the number of ranges contained in this CodePointInversionList

source

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.

source

pub fn size(&self) -> usize

Returns the number of elements of the CodePointInversionList

source

pub fn is_empty(&self) -> bool

Returns whether or not the CodePointInversionList is empty

source

fn contains_query(&self, query: u32) -> Option<usize>

Wrapper for contains

Returns an Option as to whether or not it is possible for the query to be contained. The value in the Option is the start index of the range that contains the query.

source

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'));
source

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));
source

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 Ranges 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)));
source

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
source

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);
source

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>

source§

fn clone(&self) -> CodePointInversionList<'data>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'data> Debug for CodePointInversionList<'data>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'data> EncodeAsVarULE<CodePointInversionListULE> for &CodePointInversionList<'data>

source§

fn encode_var_ule_as_slices<R>(&self, cb: impl FnOnce(&[&[u8]]) -> R) -> R

Calls cb with a piecewise list of byte slices that when concatenated produce the memory pattern of the corresponding instance of T. Read more
source§

fn encode_var_ule_len(&self) -> usize

Return the length, in bytes, of the corresponding VarULE type
source§

fn encode_var_ule_write(&self, dst: &mut [u8])

Write the corresponding 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>

source§

fn encode_var_ule_as_slices<R>(&self, cb: impl FnOnce(&[&[u8]]) -> R) -> R

Calls cb with a piecewise list of byte slices that when concatenated produce the memory pattern of the corresponding instance of T. Read more
source§

fn encode_var_ule_len(&self) -> usize

Return the length, in bytes, of the corresponding VarULE type
source§

fn encode_var_ule_write(&self, dst: &mut [u8])

Write the corresponding VarULE type to the dst buffer. dst should be the size of Self::encode_var_ule_len()
source§

impl FromIterator<RangeInclusive<u32>> for CodePointInversionList<'_>

source§

fn from_iter<I: IntoIterator<Item = RangeInclusive<u32>>>(iter: I) -> Self

Creates a value from an iterator. Read more
source§

impl<'data> PartialEq<CodePointInversionList<'data>> for CodePointInversionList<'data>

source§

fn eq(&self, other: &CodePointInversionList<'data>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<'data> TryFrom<&Range<char>> for CodePointInversionList<'data>

§

type Error = CodePointInversionListError

The type returned in the event of a conversion error.
source§

fn try_from(range: &Range<char>) -> Result<Self, Self::Error>

Performs the conversion.
source§

impl<'data> TryFrom<&RangeFrom<char>> for CodePointInversionList<'data>

§

type Error = CodePointInversionListError

The type returned in the event of a conversion error.
source§

fn try_from(range: &RangeFrom<char>) -> Result<Self, Self::Error>

Performs the conversion.
source§

impl<'data> TryFrom<&RangeFull> for CodePointInversionList<'data>

§

type Error = CodePointInversionListError

The type returned in the event of a conversion error.
source§

fn try_from(_: &RangeFull) -> Result<Self, Self::Error>

Performs the conversion.
source§

impl<'data> TryFrom<&RangeInclusive<char>> for CodePointInversionList<'data>

§

type Error = CodePointInversionListError

The type returned in the event of a conversion error.
source§

fn try_from(range: &RangeInclusive<char>) -> Result<Self, Self::Error>

Performs the conversion.
source§

impl<'data> TryFrom<&RangeTo<char>> for CodePointInversionList<'data>

§

type Error = CodePointInversionListError

The type returned in the event of a conversion error.
source§

fn try_from(range: &RangeTo<char>) -> Result<Self, Self::Error>

Performs the conversion.
source§

impl<'data> TryFrom<&RangeToInclusive<char>> for CodePointInversionList<'data>

§

type Error = CodePointInversionListError

The type returned in the event of a conversion error.
source§

fn try_from(range: &RangeToInclusive<char>) -> Result<Self, Self::Error>

Performs the conversion.
source§

impl<'a> Yokeable<'a> for CodePointInversionList<'static>

§

type Output = CodePointInversionList<'a>

This type MUST be Self with the 'static replaced with 'a, i.e. Self<'a>
source§

fn transform(&'a self) -> &'a Self::Output

This method must cast self between &'a Self<'static> and &'a Self<'a>. Read more
source§

fn transform_owned(self) -> Self::Output

This method must cast self between Self<'static> and Self<'a>. Read more
source§

unsafe fn make(this: Self::Output) -> Self

This method can be used to cast away Self<'a>’s lifetime. Read more
source§

fn transform_mut<F>(&'a mut self, f: F)where F: 'static + for<'b> FnOnce(&'b mut Self::Output),

This method must cast self between &'a mut Self<'static> and &'a mut Self<'a>, and pass it to f. Read more
source§

impl<'data> ZeroFrom<'data, CodePointInversionListULE> for CodePointInversionList<'data>

source§

fn zero_from(other: &'data CodePointInversionListULE) -> Self

Clone the other C into a struct that may retain references into C.
source§

impl<'zf, 'zf_inner> ZeroFrom<'zf, CodePointInversionList<'zf_inner>> for CodePointInversionList<'zf>

source§

fn zero_from(this: &'zf CodePointInversionList<'zf_inner>) -> Self

Clone the other C into a struct that may retain references into C.
source§

impl<'data> Eq for CodePointInversionList<'data>

source§

impl<'data> StructuralEq for CodePointInversionList<'data>

source§

impl<'data> StructuralPartialEq for CodePointInversionList<'data>

Auto Trait Implementations§

§

impl<'data> RefUnwindSafe for CodePointInversionList<'data>

§

impl<'data> Send for CodePointInversionList<'data>

§

impl<'data> Sync for CodePointInversionList<'data>

§

impl<'data> Unpin for CodePointInversionList<'data>

§

impl<'data> UnwindSafe for CodePointInversionList<'data>

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> ErasedDestructor for Twhere T: 'static,