impl<'p, P, V, const INCL: bool> SplitProducer<'p, P, V, INCL> where
V: Fissile<P> + Send,
{ /// Common `fold_with` implementation, integrating `SplitTerminator`'s /// need to sometimes skip its final empty item. pub(super) fn fold_with<F>(self, folder: F, skip_last: bool) -> F where
F: Folder<V>,
{ let SplitProducer {
data,
separator,
tail,
} = self;
if tail == data.length() { // No tail section, so just let `fold_splits` handle it.
data.fold_splits::<F, INCL>(separator, folder, skip_last)
} elseiflet Some(index) = data.rfind(separator, tail) { // We found the last separator to complete the tail, so // end with that slice after `fold_splits` finds the rest. let (left, right) = data.split_once::<INCL>(index); let folder = left.fold_splits::<F, INCL>(separator, folder, false); if skip_last || folder.full() {
folder
} else {
folder.consume(right)
}
} else { // We know there are no separators at all. Return our whole data. if skip_last {
folder
} else {
folder.consume(data)
}
}
}
}
impl<'p, P, V, const INCL: bool> UnindexedProducer for SplitProducer<'p, P, V, INCL> where
V: Fissile<P> + Send,
P: Sync,
{ type Item = V;
fn split(self) -> (Self, Option<Self>) { // Look forward for the separator, and failing that look backward. let mid = self.data.midpoint(self.tail); let index = matchself.data.find(self.separator, mid, self.tail) {
Some(i) => Some(mid + i),
None => self.data.rfind(self.separator, mid),
};
iflet Some(index) = index { let len = self.data.length(); let (left, right) = self.data.split_once::<INCL>(index);
let (left_tail, right_tail) = if index < mid { // If we scanned backwards to find the separator, everything in // the right side is exhausted, with no separators left to find.
(index, 0)
} else { let right_index = len - right.length();
(mid, self.tail - right_index)
};
// Create the left split before the separator. let left = SplitProducer {
data: left,
tail: left_tail,
..self
};
// Create the right split following the separator. let right = SplitProducer {
data: right,
tail: right_tail,
..self
};
(left, Some(right))
} else { // The search is exhausted, no more separators...
(SplitProducer { tail: 0, ..self }, None)
}
}
fn fold_with<F>(self, folder: F) -> F where
F: Folder<Self::Item>,
{ self.fold_with(folder, false)
}
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.21 Sekunden
(vorverarbeitet am 2026-06-19)
¤
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.