Minimize allocation when converting table rows to string
This commit is contained in:
parent
7a76c6cbba
commit
b2837ff3be
3 changed files with 24 additions and 10 deletions
|
@ -733,7 +733,11 @@ impl<T: Item + 'static> Component for Picker<T> {
|
|||
.map(|mut row| {
|
||||
const TEMP_CELL_SEP: &str = " ";
|
||||
|
||||
let line = row.cell_text().join(TEMP_CELL_SEP);
|
||||
let line = row.cell_text().fold(String::new(), |mut s, frag| {
|
||||
s.push_str(&frag);
|
||||
s.push_str(TEMP_CELL_SEP);
|
||||
s
|
||||
});
|
||||
|
||||
// Items are filtered by using the text returned by menu::Item::filter_text
|
||||
// but we do highlighting here using the text in Row and therefore there
|
||||
|
|
|
@ -438,17 +438,30 @@ impl<'a> From<Vec<Spans<'a>>> for Text<'a> {
|
|||
|
||||
impl<'a> From<Text<'a>> for String {
|
||||
fn from(text: Text<'a>) -> String {
|
||||
let lines: Vec<String> = text.lines.iter().map(String::from).collect();
|
||||
lines.join("\n")
|
||||
String::from(&text)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> From<&Text<'a>> for String {
|
||||
fn from(text: &Text<'a>) -> String {
|
||||
let lines: Vec<String> = text.lines.iter().map(String::from).collect();
|
||||
lines.join("\n")
|
||||
let size = text
|
||||
.lines
|
||||
.iter()
|
||||
.flat_map(|spans| spans.0.iter().map(|span| span.content.len()))
|
||||
.sum::<usize>()
|
||||
+ text.lines.len().saturating_sub(1); // for newline after each line
|
||||
let mut output = String::with_capacity(size);
|
||||
|
||||
for spans in &text.lines {
|
||||
for span in &spans.0 {
|
||||
output.push_str(&span.content);
|
||||
}
|
||||
output.push('\n');
|
||||
}
|
||||
output
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> IntoIterator for Text<'a> {
|
||||
type Item = Spans<'a>;
|
||||
type IntoIter = std::vec::IntoIter<Self::Item>;
|
||||
|
|
|
@ -122,11 +122,8 @@ impl<'a> Row<'a> {
|
|||
}
|
||||
|
||||
/// Returns the contents of cells as plain text, without styles and colors.
|
||||
pub fn cell_text(&self) -> Vec<String> {
|
||||
self.cells
|
||||
.iter()
|
||||
.map(|cell| String::from(&cell.content))
|
||||
.collect()
|
||||
pub fn cell_text(&self) -> impl Iterator<Item = String> + '_ {
|
||||
self.cells.iter().map(|cell| String::from(&cell.content))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue