summaryrefslogtreecommitdiffstats
path: root/third_party/rust/rayon/src/string.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/rayon/src/string.rs')
-rw-r--r--third_party/rust/rayon/src/string.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/third_party/rust/rayon/src/string.rs b/third_party/rust/rayon/src/string.rs
new file mode 100644
index 0000000000..91e69f9a3c
--- /dev/null
+++ b/third_party/rust/rayon/src/string.rs
@@ -0,0 +1,48 @@
+//! This module contains the parallel iterator types for owned strings
+//! (`String`). You will rarely need to interact with it directly
+//! unless you have need to name one of the iterator types.
+
+use crate::iter::plumbing::*;
+use crate::math::simplify_range;
+use crate::prelude::*;
+use std::ops::{Range, RangeBounds};
+
+impl<'a> ParallelDrainRange<usize> for &'a mut String {
+ type Iter = Drain<'a>;
+ type Item = char;
+
+ fn par_drain<R: RangeBounds<usize>>(self, range: R) -> Self::Iter {
+ Drain {
+ range: simplify_range(range, self.len()),
+ string: self,
+ }
+ }
+}
+
+/// Draining parallel iterator that moves a range of characters out of a string,
+/// but keeps the total capacity.
+#[derive(Debug)]
+pub struct Drain<'a> {
+ string: &'a mut String,
+ range: Range<usize>,
+}
+
+impl<'a> ParallelIterator for Drain<'a> {
+ type Item = char;
+
+ fn drive_unindexed<C>(self, consumer: C) -> C::Result
+ where
+ C: UnindexedConsumer<Self::Item>,
+ {
+ self.string[self.range.clone()]
+ .par_chars()
+ .drive_unindexed(consumer)
+ }
+}
+
+impl<'a> Drop for Drain<'a> {
+ fn drop(&mut self) {
+ // Remove the drained range.
+ self.string.drain(self.range.clone());
+ }
+}