Skip to content

Commit

Permalink
perf: use str instead of Cow to reduse Token size
Browse files Browse the repository at this point in the history
  • Loading branch information
sssooonnnggg committed Jan 3, 2024
1 parent ab70fe6 commit 5ccddd2
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 17 deletions.
24 changes: 12 additions & 12 deletions pest/src/iterators/pairs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -227,9 +227,9 @@ impl<'i, R: RuleType> Pairs<'i, R> {
/// state: Box<ParserState<'_, Rule>>,
/// ) -> ParseResult<Box<ParserState<'_, Rule>>> {
/// expr(state, Rule::mul, "*")
/// .and_then(|state| state.tag_node(std::borrow::Cow::Borrowed("mul")))
/// .and_then(|state| state.tag_node("mul"))
/// .or_else(|state| expr(state, Rule::add, "+"))
/// .and_then(|state| state.tag_node(std::borrow::Cow::Borrowed("add")))
/// .and_then(|state| state.tag_node("add"))
/// }
/// fn expr<'a>(
/// state: Box<ParserState<'a, Rule>>,
Expand All @@ -239,10 +239,10 @@ impl<'i, R: RuleType> Pairs<'i, R> {
/// state.rule(r, |state| {
/// state.sequence(|state| {
/// number(state)
/// .and_then(|state| state.tag_node(std::borrow::Cow::Borrowed("lhs")))
/// .and_then(|state| state.tag_node("lhs"))
/// .and_then(|state| state.match_string(o))
/// .and_then(number)
/// .and_then(|state| state.tag_node(std::borrow::Cow::Borrowed("rhs")))
/// .and_then(|state| state.tag_node("rhs"))
/// })
/// })
/// }
Expand Down Expand Up @@ -278,9 +278,9 @@ impl<'i, R: RuleType> Pairs<'i, R> {
/// state: Box<ParserState<'_, Rule>>,
/// ) -> ParseResult<Box<ParserState<'_, Rule>>> {
/// expr(state, Rule::mul, "*")
/// .and_then(|state| state.tag_node(std::borrow::Cow::Borrowed("mul")))
/// .and_then(|state| state.tag_node("mul"))
/// .or_else(|state| expr(state, Rule::add, "+"))
/// .and_then(|state| state.tag_node(std::borrow::Cow::Borrowed("add")))
/// .and_then(|state| state.tag_node("add"))
/// }
/// fn expr<'a>(
/// state: Box<ParserState<'a, Rule>>,
Expand All @@ -290,10 +290,10 @@ impl<'i, R: RuleType> Pairs<'i, R> {
/// state.rule(r, |state| {
/// state.sequence(|state| {
/// number(state)
/// .and_then(|state| state.tag_node(std::borrow::Cow::Borrowed("lhs")))
/// .and_then(|state| state.tag_node("lhs"))
/// .and_then(|state| state.match_string(o))
/// .and_then(number)
/// .and_then(|state| state.tag_node(std::borrow::Cow::Borrowed("rhs")))
/// .and_then(|state| state.tag_node("rhs"))
/// })
/// })
/// }
Expand Down Expand Up @@ -676,9 +676,9 @@ mod tests {
state: Box<ParserState<'_, Rule>>,
) -> ParseResult<Box<ParserState<'_, Rule>>> {
expr(state, Rule::mul, "*")
.and_then(|state| state.tag_node(alloc::borrow::Cow::Borrowed("mul")))
.and_then(|state| state.tag_node("mul"))
.or_else(|state| expr(state, Rule::add, "+"))
.and_then(|state| state.tag_node(alloc::borrow::Cow::Borrowed("add")))
.and_then(|state| state.tag_node("add"))
}
fn expr<'a>(
state: Box<ParserState<'a, Rule>>,
Expand All @@ -688,10 +688,10 @@ mod tests {
state.rule(r, |state| {
state.sequence(|state| {
number(state)
.and_then(|state| state.tag_node(alloc::borrow::Cow::Borrowed("lhs")))
.and_then(|state| state.tag_node("lhs"))
.and_then(|state| state.match_string(o))
.and_then(number)
.and_then(|state| state.tag_node(alloc::borrow::Cow::Borrowed("rhs")))
.and_then(|state| state.tag_node("rhs"))
})
})
}
Expand Down
4 changes: 1 addition & 3 deletions pest/src/iterators/queueable_token.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
// option. All files in the project carrying such notice may not be copied,
// modified, or distributed except according to those terms.

use alloc::borrow::Cow;

// This structure serves to improve performance over Token objects in two ways:
//
// * it is smaller than a Token, leading to both less memory use when stored in the queue but also
Expand All @@ -24,7 +22,7 @@ pub enum QueueableToken<'i, R> {
End {
start_token_index: usize,
rule: R,
tag: Option<Cow<'i, str>>,
tag: Option<&'i str>,
input_pos: usize,
},
}
4 changes: 2 additions & 2 deletions pest/src/parser_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -392,7 +392,7 @@ impl<'i, R: RuleType> ParserState<'i, R> {
/// character(state)
/// .and_then(|state| character(state))
/// .and_then(|state| character(state))
/// .and_then(|state| state.tag_node(std::borrow::Cow::Borrowed("c")))
/// .and_then(|state| state.tag_node("c"))
/// .and_then(|state| character(state))
/// })
/// }
Expand All @@ -407,7 +407,7 @@ impl<'i, R: RuleType> ParserState<'i, R> {
/// assert_eq!(find[0].as_str(), "c")
/// ```
#[inline]
pub fn tag_node(mut self: Box<Self>, tag: Cow<'i, str>) -> ParseResult<Box<Self>> {
pub fn tag_node(mut self: Box<Self>, tag: &'i str) -> ParseResult<Box<Self>> {
if let Some(QueueableToken::End { tag: old, .. }) = self.queue.last_mut() {
*old = Some(tag)
}
Expand Down

0 comments on commit 5ccddd2

Please sign in to comment.