diff options
author | Kirill Chibisov <contact@kchibisov.com> | 2024-12-29 00:18:14 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-29 00:18:14 +0300 |
commit | 40af63902e0af313722dfdc19a6d10a1d2ba29f4 (patch) | |
tree | db577463eb1d0ed8cbc18f32f6050000e2d5b702 | |
parent | ebc4a4d7259678a8626f5c269ea9348dfc3e79b2 (diff) | |
download | r-alacritty-vte-40af63902e0af313722dfdc19a6d10a1d2ba29f4.tar.gz r-alacritty-vte-40af63902e0af313722dfdc19a6d10a1d2ba29f4.tar.bz2 r-alacritty-vte-40af63902e0af313722dfdc19a6d10a1d2ba29f4.zip |
Improve attrs_from_sgr_parameters performance
Instead of collecting all the data into the vector just dispatch it
right away avoiding allocations.
-rw-r--r-- | src/ansi.rs | 19 | ||||
-rw-r--r-- | src/definitions.rs | 4 | ||||
-rw-r--r-- | src/lib.rs | 2 |
3 files changed, 10 insertions, 15 deletions
diff --git a/src/ansi.rs b/src/ansi.rs index 59b17e6..8cac26d 100644 --- a/src/ansi.rs +++ b/src/ansi.rs @@ -1620,12 +1620,7 @@ where if params.is_empty() { handler.terminal_attribute(Attr::Reset); } else { - for attr in attrs_from_sgr_parameters(&mut params_iter) { - match attr { - Some(attr) => handler.terminal_attribute(attr), - None => unhandled!(), - } - } + attrs_from_sgr_parameters(*handler, &mut params_iter); } }, ('m', [b'>']) => { @@ -1769,9 +1764,7 @@ where } #[inline] -fn attrs_from_sgr_parameters(params: &mut ParamsIter<'_>) -> Vec<Option<Attr>> { - let mut attrs = Vec::with_capacity(params.size_hint().0); - +fn attrs_from_sgr_parameters<H: Handler>(handler: &mut H, params: &mut ParamsIter<'_>) { while let Some(param) = params.next() { let attr = match param { [0] => Some(Attr::Reset), @@ -1851,10 +1844,12 @@ fn attrs_from_sgr_parameters(params: &mut ParamsIter<'_>) -> Vec<Option<Attr>> { [107] => Some(Attr::Background(Color::Named(NamedColor::BrightWhite))), _ => None, }; - attrs.push(attr); - } - attrs + match attr { + Some(attr) => handler.terminal_attribute(attr), + None => continue, + } + } } /// Handle colon separated rgb color escape sequence. diff --git a/src/definitions.rs b/src/definitions.rs index 218c1eb..568a8a8 100644 --- a/src/definitions.rs +++ b/src/definitions.rs @@ -57,9 +57,9 @@ pub fn unpack(delta: u8) -> (State, Action) { unsafe { ( // State is stored in bottom 4 bits - mem::transmute(delta & 0x0f), + mem::transmute::<u8, State>(delta & 0x0f), // Action is stored in top 4 bits - mem::transmute(delta >> 4), + mem::transmute::<u8, Action>(delta >> 4), ) } } @@ -56,7 +56,7 @@ const MAX_OSC_RAW: usize = 1024; struct VtUtf8Receiver<'a, P: Perform>(&'a mut P, &'a mut State); -impl<'a, P: Perform> utf8::Receiver for VtUtf8Receiver<'a, P> { +impl<P: Perform> utf8::Receiver for VtUtf8Receiver<'_, P> { fn codepoint(&mut self, c: char) { self.0.print(c); *self.1 = State::Ground; |