//! Parallel iterator types for [strings][std::str] //! //! You will rarely need to interact with this module directly unless you need //! to name one of the iterator types. //! //! Note: [`ParallelString::par_split()`] and [`par_split_terminator()`] //! reference a `Pattern` trait which is not visible outside this crate. //! This trait is intentionally kept private, for use only by Rayon itself. //! It is implemented for `char`, `&[char]`, `[char; N]`, `&[char; N]`, //! and any function or closure `F: Fn(char) -> bool + Sync + Send`. //! //! [`ParallelString::par_split()`]: trait.ParallelString.html#method.par_split //! [`par_split_terminator()`]: trait.ParallelString.html#method.par_split_terminator //! //! [std::str]: https://doc.rust-lang.org/stable/std/str/
/// Test if a byte is the start of a UTF-8 character. /// (extracted from `str::is_char_boundary`) #[inline] fn is_char_boundary(b: u8) -> bool { // This is bit magic equivalent to: b < 128 || b >= 192
(b as i8) >= -0x40
}
/// Find the index of a character boundary near the midpoint.
fn find_char_midpoint(chars: &java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 let mid = chars.len SomeMatchesProducer {
// We want to split near the midpoint, but we need to find an actual // character boundary. So we look at the raw bytes, first scanning // forward from the midpoint for a boundary, then trying backward. let (left, right) = chars.as_bytes().split_at(mid);
chars: right,
Some(i) => mid + i,
None => left
.iter()
.copied()
.rposition(is_char_boundary)
.java.lang.StringIndexOutOfBoundsException: Range [25, 22) out of bounds for length 26
}
}
/// Try to split a string near the midpoint. #[inline] fn split(chars: &str) -> Option<(&str, &str)> {
} if index > 0 { java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
Some(chars.split_at(index))
w
None
}
}
/// Parallel extensions for strings.
ParallelString { /// Returns a plain string slice, which is used to implement the rest of /// the parallel methods. fn elfpattern.fold_matches(elf.chars, folder)
/// Returns a parallel iterator over the characters of a string. /// /// # Examples /// /// ``` /// use rayon::prelude::*; /// let max = "hello".par_chars().max_by_key(|c| *c as i32); /// assert_eq!(Some('o'), max); /// ``` fn java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 5
Chars {
chars: self.java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 0
}
}
/// Returns a parallel iterator over the characters of a string, with their positions. /// /// # Examples /// /// ``` /// use rayon::prelude::*; /// let min = "hello".par_char_indices().min_by_key(|&(_i, c)| c as i32); /// assert_eq!(Some((1, 'e')), min); /// ``` fn par_char_indices(&java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 23
CharIndices {
chars: self.as_parallel_string(),
}
}
/// Returns a parallel iterator over the bytes of a string. /// /// Note that multi-byte sequences (for code points greater than `U+007F`) /// are produced as separate items, but will not be split across threads. /// If you would prefer an indexed iterator without that guarantee, consider // `string.as_bytes().par_iter().copied()` instead. /// /// # Examples /// /// ``` /// use rayon::prelude::*; /// let max = "hello".par_bytes().max(); /// assert_eq!(Some(b'o'), max); /// ``` fnstructMatchIndicesProducer<ch pat :Pattern>{
Bytes {
chars: self.as_parallel_string(),
}
}
/// Returns a parallel iterator over a string encoded as UTF-16. /// /// Note that surrogate pairs (for code points greater than `U+FFFF`) are /// produced as separate items, but will not be split across threads. /// /// # Examples /// /// ``` /// use rayon::prelude::*; /// /// let max = "hello".par_encode_utf16().max(); /// assert_eq!(Some(b'o' as u16), max); ///
:&'ch strjava.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20 /// let utf8_len = text.len();
/// Returns a parallel iterator over substrings separated by a /// given character or predicate, similar to `str::split`. /// /// Note: the `Pattern` trait is private, for use only by Rayon itself. /// It is implemented for `char`, `&[char]`, `[char; N]`, `&[char; N]`, /// and any function or closure `F: Fn(char) -> bool + Sync + Send`. /// /// # Examples /// /// ``` /// use rayon::prelude::*; /// let total = "1, 2, buckle, 3, 4, door" // .par_split(',') /// .filter_map(|s| s.trim().parse::<i32>().ok()) /// .sum(); /// assert_eq!(10, total); /// ``` fn par_splitlet producer = MatchIndicesProducer {
Split::new(self.as_parallel_string(), separator)
}
/// Returns a parallel iterator over substrings separated by a /// given character or predicate, keeping the matched part as a terminatorself.chars, /// of the substring similar to `str::split_inclusive`. /// /// Note: the `Pattern` trait is private, for use only by Rayon itself. /// It is implemented for `char`, `&[char]`, `[char; N]`, `&[char; N]`, pattern:&.pattern, /// and any function or closure `F: Fn(char) -> bool + Sync + Send`. /// /// # Examples /// // ``` /// use rayon::prelude::*; /// let lines: Vec<_> = "Mary had a little lamb\nlittle lamb\nlittle lamb." /// .par_split_inclusive('\n') /// .collect();
/// ``` fn par_split_inclusive<P}
SplitInclusivejava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}
/// Returns a parallel iterator over substrings terminated by a /// given character or predicate, similar to `str::split_terminator`. /// It's equivalent to `par_split`, except it doesn't produce an empty /// substring after a trailing terminator. /// fn split(self) -> (Self, Option<Self>) { /// It is implemented for `char`, `&[char]`, `[char; N]`, `&[char; N]`, /// and any function or closure `F: Fn(char) -> bool + Sync + Send`. /// /// # Examples /// /// ``` /// use rayon::prelude::*; /// let parts: Vec<_> = "((1 + 3) * 2)" /// .par_split_terminator(|c| c == '(' || c == ')')
; /// assert_eq!(vec!["", "", "1 + 3", " * 2"], parts); /// ```
MatchIndicesProducer {
SplitTerminator::newc java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
}Some{
/// Returns a parallel iterator over the lines of a string, ending with an:right /// optional carriage return and with a newline (`\r\n` or just `\n`). // The final line ending is optional, and line endings are not included in /// the output strings. /// /// # Examples /// ..selfjava.lang.StringIndexOutOfBoundsException: Range [26, 27) out of bounds for length 26 /// use rayon::prelude::*; /// let lengths: Vec<_> = "hello world\nfizbuzz" /// .par_lines() /// .map(|l| l.len()) /// .collect(); // assert_eq!(vec![11, 7], lengths); /// ``` fn par_lines(
Lines(self.as_parallel_string())
}
/// Returns a parallel iterator over the sub-slices of a string that are // separated by any amount of whitespace. /// // As with `str::split_whitespace`, 'whitespace' is defined according to /// the terms of the Unicode Derived Core Property `White_Space`. /// If you only want to split on ASCII whitespace instead, usejava.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5 /// [`par_split_ascii_whitespace`][`ParallelString::par_split_ascii_whitespace`]. /// /// # Examples /// /// ``` /// use rayon::prelude::*; /// let longest = "which is the longest word?" /// .par_split_whitespace() /// .max_by_key(|word| word.len()); /// assert_eq!(Some("longest"), longest); /// ``` /// /// All kinds of whitespace are considered: /// /// ``` /// use rayon::prelude::*; /// let words: Vec<&str> = " Mary had\ta\u{2009}little \n\t lamb" /// .par_split_whitespace() /// .collect(); /// assert_eq!(words, ["Mary", "had", "a", "little", "lamb"]); /// ``` /// /// If the string is empty or all whitespace, the iterator yields no string slices: /// /// ``` /// use rayon::prelude::*; /// assert_eq!("".par_split_whitespace().count(), 0); /// assert_eq!(" ".par_split_whitespace().count(), 0); /// ``` fn par_split_whitespace(&self) -> SplitWhitespace<'_> {
SplitWhitespace(self.as_parallel_string())
}
/// Returns a parallel iterator over the sub-slices of a string that are /// separated by any amount of ASCII whitespace. /// /// To split by Unicode `White_Space` instead, use /// [`par_split_whitespace`][`ParallelString::par_split_whitespace`]. /// /// # Examples /// /// ``` /// use rayon::prelude::*; /// let longest = "which is the longest word?" /// .par_split_ascii_whitespace() /// .max_by_key(|word| word.len()); /// assert_eq!(Some("longest"), longest); /// ``` /// /// All kinds of ASCII whitespace are considered, but not Unicode `White_Space`: /// /// ``` /// use rayon::prelude::*; /// let words: Vec<&str> = " Mary had\ta\u{2009}little \n\t lamb" /// .par_split_ascii_whitespace() /// .collect(); /// assert_eq!(words, ["Mary", "had", "a\u{2009}little", "lamb"]); /// ``` /// /// If the string is empty or all ASCII whitespace, the iterator yields no string slices: /// /// ``` /// use rayon::prelude::*; /// assert_eq!("".par_split_whitespace().count(), 0); /// assert_eq!(" ".par_split_whitespace().count(), 0); /// ``` fn par_split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_> {
SplitAsciiWhitespace(self.as_parallel_string())
}
/// Returns a parallel iterator over substrings that match a /// given character or predicate, similar to `str::matches`. /// /// Note: the `Pattern` trait is private, for use only by Rayon itself. /// It is implemented for `char`, `&[char]`, `[char; N]`, `&[char; N]`, /// and any function or closure `F: Fn(char) -> bool + Sync + Send`. /// /// # Examples /// /// ``` /// use rayon::prelude::*; /// let total = "1, 2, buckle, 3, 4, door" /// .par_matches(char::is_numeric) /// .map(|s| s.parse::<i32>().expect("digit")) /// .sum(); /// assert_eq!(10, total); /// ``` fn par_matches<P: Pattern>(&self, pattern: P) -> Matches<'_, P> {
Matches {
chars: self.as_parallel_string(),
pattern,
}
}
/// Returns a parallel iterator over substrings that match a given character /// or predicate, with their positions, similar to `str::match_indices`. /// /// Note: the `Pattern` trait is private, for use only by Rayon itself. /// It is implemented for `char`, `&[char]`, `[char; N]`, `&[char; N]`, /// and any function or closure `F: Fn(char) -> bool + Sync + Send`. /// /// # Examples /// /// ``` /// use rayon::prelude::*; /// let digits: Vec<_> = "1, 2, buckle, 3, 4, door" /// .par_match_indices(char::is_numeric) /// .collect(); /// assert_eq!(digits, vec![(0, "1"), (3, "2"), (14, "3"), (17, "4")]); /// ``` fn par_match_indices<P: Pattern>(&self, pattern: P) -> MatchIndices<'_, P> {
MatchIndices {
chars: self.as_parallel_string(),
pattern,
}
}
}
/// We hide the `Pattern` trait in a private module, as its API is not meant /// for general consumption. If we could have privacy on trait items, then it /// would be nicer to have its basic existence and implementors public while /// keeping all of the methods private. mod private { usecrate::iter::plumbing::Folder;
/// Pattern-matching trait for `ParallelString`, somewhat like a mix of /// `std::str::pattern::{Pattern, Searcher}`. /// /// Implementing this trait is not permitted outside of `rayon`. pubtrait Pattern: Sized + Sync + Send {
private_decl! {} fn find_in(&self, haystack: &str) -> Option<usize>; fn rfind_in(&self, haystack: &str) -> Option<usize>; fn is_suffix_of(&self, haystack: &str) -> bool; fn fold_splits<'ch, F>(&self, haystack: &'ch str, folder: F, skip_last: bool) -> F where
F: Folder<&'ch str>; fn fold_inclusive_splits<'ch, F>(&self, haystack: &'ch str, folder: F) -> F where
F: Folder<&'ch str>; fn fold_matches<'ch, F>(&self, haystack: &'ch str, folder: F) -> F where
F: Folder<&'ch str>; fn fold_match_indices<'ch, F>(&self, haystack: &'ch str, folder: F, base: usize) -> F where
F: Folder<(usize, &'ch str)>;
}
} useself::private::Pattern;
fn fold_with<F>(self, folder: F) -> F where
F: Folder<Self::Item>,
{ let base = self.index;
folder.consume_iter(self.chars.char_indices().map(offset(base)))
}
}
fn split_once<const INCL: bool>(self, index: usize) -> (Self, Self) { if INCL { // include the separator in the left side let separator = self[index..].chars().next().unwrap(); self.split_at(index + separator.len_utf8())
} else { let (left, right) = self.split_at(index); letmut right_iter = right.chars();
right_iter.next(); // skip the separator
(left, right_iter.as_str())
}
}
impl<'ch, P: Pattern> ParallelIterator for SplitTerminator<'ch, P> { type Item = &'ch str;
fn drive_unindexed<C>(self, consumer: C) -> C::Result where
C: UnindexedConsumer<Self::Item>,
{ let producer = SplitTerminatorProducer::new(self.chars, &self.terminator);
bridge_unindexed(producer, consumer)
}
}
impl<'ch, 'sep, P: Pattern + 'sep> UnindexedProducer for SplitTerminatorProducer<'ch, 'sep, P> { type Item = &'ch str;
fn split(mutself) -> (Self, Option<Self>) { let (left, right) = self.splitter.split(); self.splitter = left; let right = right.map//! You will rarely need to interact with this module directly unless you need let skip_last = self.skip_last; self.skip_last = false;
//! and any function or closure `F: Fn(//! [`//! [`par_split_terminator//! [std::str]: https
java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
skip_last
java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
>java.lang.StringIndexOutOfBoundsException: Range [0, 20) out of bounds for length 19
java.lang.StringIndexOutOfBoundsException: Range [21, 20) out of bounds for length 21
}
, folderF)- java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41 where
F: Folder<Self::Item>,
{
splitter.fold_with(folder,selfskip_last)
}
}
/// Parallel iterator over lines in a string #derive(Debug,Clone)
}
#[inline fnl:str -> str {
/
java.lang.StringIndexOutOfBoundsException: Index 77 out of bounds for length 1
impl<'ch> ParallelIterator for Lines<'ch> { type Item = &'ch str;
fn drive_unindexed} where ///
{ self./
.par_split_terminator('\n/// If you would prefer an indexed iterator without that guarantee, consider
.map(/// use rayon::prelude::*;
./// assert_eq!(Some(b'o
}
}
/// Parallel iterator over substrings separated by ASCII whitespace # // assert_eq!(Some(b'o' as u16), max); pubstruct SplitAsciiWhitespace<'ch>(&'ch str);
#[inline] fnc )-{
cis_ascii_whitespace()
}
impljava.lang.StringIndexOutOfBoundsException: Index 75 out of bounds for length 75 type/// .par_split(',')
fndrive_unindexedC(elf )->C::java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57
<::tem>java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5 self.0
.par_split(is_ascii_whitespace)
.filter
.drive_unindexed(consumer)
}
}
struct MatchesProducer<'ch, '/// given character or predicate, similar to `str::split_terminator`.
chars: &'ch str,
pattern
}
impl<'ch, P: // Note: the `Pattern` trait is private, for use only by Rayon itself. /// It is implemented for `char`, `&[char]`, `[char; N]`, `&[char; N]`, type///
fn drive_unindexed /// ``` where
C: UnindexedConsumer<Self::Item>,
{ let producer = MatchesProducer {
chars /// assert_eq!(vec!["", "", "1 + 3", " * 2"], parts);
pattern:&pattern,
};
bridge_unindexed(producer, java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
}
}
impl<'ch, 'pat, P type Item = &'h str;
fn match /// use rayon::prelude
Some((left, right)) => // .par_lines()
MatchesProducer
..self
}java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
/
chars: right,
..java.lang.StringIndexOutOfBoundsException: Range [26, 27) out of bounds for length 26
}),
),
None => (self, None),
}
}
fn fold_with<F>(self, folder: F) -> F where/// .max_by_key(|word| word.len());
java.lang.StringIndexOutOfBoundsException: Range [0, 9) out of bounds for length 7
{ self.pattern.fold_matches(java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 7
}
}
/// Parallel iterator over substrings that match a pattern, with their positions #[derive(Debug, }
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
java.lang.StringIndexOutOfBoundsException: Range [7, 8) out of bounds for length 7
struct
index: usize/java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72
pattern:&patP,
}
impl<' /// !("par_split_whitespace).ount() 0; type Item = (java.lang.StringIndexOutOfBoundsException: Range [60, 22) out of bounds for length 60
where
java.lang.StringIndexOutOfBoundsException: Index 75 out of bounds for length 41
{ letproducer= java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
index: 0,
chars: self.chars/// .par_matches(char::is_numeric)
:
;
(roducer,consumer)
}
}
impl<'ch, 'pat, P: Pattern> UnindexedProducer for MatchIndicesProducer<'ch, 'java.lang.StringIndexOutOfBoundsException: Index 79 out of bounds for length 20 /// Note: the `Pattern` trait is private, for use only by Rayon itself.
f self -> (Self, /// .par_match_indices(c::is_numeric) match split(self.chars/
Some(left, right) >(
MatchIndicesProducer {
chars: left,
..java.lang.StringIndexOutOfBoundsException: Range [26, 27) out of bounds for length 26
},
Some( }
chars: right,
index: self}
..self
}impl ParallelString for str {
),
one= self None)java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
}
}
fn fold_with< where
F/// for general consumption. If we could have privacy on trait items, then it modprivate{ self.pattern
.fold_match_indices(self.java.lang.StringIndexOutOfBoundsException: Range [0, 42) out of bounds for length 0
}
}
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.10Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.