From aeb26f6d72c13009668612dd6f4da996ed297b3d Mon Sep 17 00:00:00 2001 From: 30bit Date: Wed, 1 May 2024 19:46:23 +0300 Subject: [PATCH] str range --- src/expr.rs | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/src/expr.rs b/src/expr.rs index 8e5c46e..f22908e 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -178,7 +178,7 @@ impl Sections { self.payload.is_empty() } - pub fn get(&self, index: u32) -> Option<(Option<&T>, &str)> { + fn buf_range(&self, index: u32) -> Option { if self.is_empty() { return None; } @@ -188,10 +188,7 @@ impl Sections { .first() .copied() .unwrap_or(self.buf.len() as u32); - Some(( - self.payload[index as usize].as_ref(), - &self.buf[..end as usize], - )) + Some(SmallRange::new(0, end)) } else { let start = *self.additional_offsets.get(index as usize - 1)?; let end = self @@ -199,13 +196,32 @@ impl Sections { .get(index as usize) .copied() .unwrap_or(self.buf.len() as u32); - Some(( - self.payload[index as usize].as_ref(), - &self.buf[start as usize..end as usize], - )) + Some(SmallRange::new(start, end)) } } + pub fn get(&self, index: u32) -> Option<(Option<&T>, &str)> { + self.buf_range(index).map(|buf_range| { + ( + self.payload[index as usize].as_ref(), + &self.buf[buf_range.into_slice_index()], + ) + }) + } + + pub fn str_range(&self, range: SmallRange) -> Option<&str> { + let end = (range.end == self.len()) + .then_some(self.buf.len()) + .or_else(|| { + self.buf_range(range.end) + .map(|buf_range| buf_range.end as usize) + })?; + let start = self + .buf_range(range.start) + .map(|buf_range| buf_range.start as usize)?; + Some(&self.buf[start..end]) + } + pub fn iter(&self) -> impl Iterator, &str)> { (0..self.len()).map(|i| self.get(i).unwrap()) } @@ -296,6 +312,11 @@ impl<'a, T> Arg<'a, T> { self.sections.get(self.range.start + index) } + #[inline] + pub fn as_str(&self) -> Option<&'a str> { + self.sections.str_range(self.range) + } + pub fn iter(&self) -> impl Iterator, &'a str)> { let self_ = *self; (0..self.len()).map(move |i| self_.get(i).unwrap())