Skip to content

Commit 5a3541a

Browse files
committed
fix(stream)!: Dont return input on peek_slice
1 parent 34bd53f commit 5a3541a

File tree

8 files changed

+51
-16
lines changed

8 files changed

+51
-16
lines changed

src/stream/bstr.rs

+5
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,11 @@ impl<'i> Stream for &'i BStr {
107107
*self = BStr::from_bytes(next);
108108
slice
109109
}
110+
#[inline(always)]
111+
fn peek_slice(&self, offset: usize) -> Self::Slice {
112+
let (slice, _next) = self.split_at(offset);
113+
slice
114+
}
110115

111116
#[inline(always)]
112117
fn checkpoint(&self) -> Self::Checkpoint {

src/stream/bytes.rs

+5
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,11 @@ impl<'i> Stream for &'i Bytes {
107107
*self = Bytes::from_bytes(next);
108108
slice
109109
}
110+
#[inline(always)]
111+
fn peek_slice(&self, offset: usize) -> Self::Slice {
112+
let (slice, _next) = self.split_at(offset);
113+
slice
114+
}
110115

111116
#[inline(always)]
112117
fn checkpoint(&self) -> Self::Checkpoint {

src/stream/locating.rs

+4
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,10 @@ impl<I: Stream> Stream for LocatingSlice<I> {
148148
fn next_slice(&mut self, offset: usize) -> Self::Slice {
149149
self.input.next_slice(offset)
150150
}
151+
#[inline(always)]
152+
fn peek_slice(&self, offset: usize) -> Self::Slice {
153+
self.input.peek_slice(offset)
154+
}
151155

152156
#[inline(always)]
153157
fn checkpoint(&self) -> Self::Checkpoint {

src/stream/mod.rs

+20-10
Original file line numberDiff line numberDiff line change
@@ -187,15 +187,7 @@ pub trait Stream: Offset<<Self as Stream>::Checkpoint> + crate::lib::std::fmt::D
187187
///
188188
fn next_slice(&mut self, offset: usize) -> Self::Slice;
189189
/// Split off a slice of tokens from the input
190-
#[inline(always)]
191-
fn peek_slice(&self, offset: usize) -> (Self, Self::Slice)
192-
where
193-
Self: Clone,
194-
{
195-
let mut peek = self.clone();
196-
let slice = peek.next_slice(offset);
197-
(peek, slice)
198-
}
190+
fn peek_slice(&self, offset: usize) -> Self::Slice;
199191

200192
/// Advance to the end of the stream
201193
#[inline(always)]
@@ -208,7 +200,7 @@ pub trait Stream: Offset<<Self as Stream>::Checkpoint> + crate::lib::std::fmt::D
208200
where
209201
Self: Clone,
210202
{
211-
self.peek_slice(self.eof_offset()).1
203+
self.peek_slice(self.eof_offset())
212204
}
213205

214206
/// Save the current parse location within the stream
@@ -281,6 +273,11 @@ where
281273
*self = next;
282274
slice
283275
}
276+
#[inline(always)]
277+
fn peek_slice(&self, offset: usize) -> Self::Slice {
278+
let (slice, _next) = self.split_at(offset);
279+
slice
280+
}
284281

285282
#[inline(always)]
286283
fn checkpoint(&self) -> Self::Checkpoint {
@@ -361,6 +358,11 @@ impl<'i> Stream for &'i str {
361358
*self = next;
362359
slice
363360
}
361+
#[inline(always)]
362+
fn peek_slice(&self, offset: usize) -> Self::Slice {
363+
let (slice, _next) = self.split_at(offset);
364+
slice
365+
}
364366

365367
#[inline(always)]
366368
fn checkpoint(&self) -> Self::Checkpoint {
@@ -443,6 +445,14 @@ where
443445
self.1 = end_offset;
444446
(s, start_offset, end_offset)
445447
}
448+
#[inline(always)]
449+
fn peek_slice(&self, offset: usize) -> Self::Slice {
450+
let byte_offset = (offset + self.1) / 8;
451+
let end_offset = (offset + self.1) % 8;
452+
let s = self.0.peek_slice(byte_offset);
453+
let start_offset = self.1;
454+
(s, start_offset, end_offset)
455+
}
446456

447457
#[inline(always)]
448458
fn checkpoint(&self) -> Self::Checkpoint {

src/stream/partial.rs

+4
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,10 @@ impl<I: Stream> Stream for Partial<I> {
185185
fn next_slice(&mut self, offset: usize) -> Self::Slice {
186186
self.input.next_slice(offset)
187187
}
188+
#[inline(always)]
189+
fn peek_slice(&self, offset: usize) -> Self::Slice {
190+
self.input.peek_slice(offset)
191+
}
188192

189193
#[inline(always)]
190194
fn checkpoint(&self) -> Self::Checkpoint {

src/stream/recoverable.rs

+4
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,10 @@ where
158158
fn next_slice(&mut self, offset: usize) -> Self::Slice {
159159
self.input.next_slice(offset)
160160
}
161+
#[inline(always)]
162+
fn peek_slice(&self, offset: usize) -> Self::Slice {
163+
self.input.peek_slice(offset)
164+
}
161165

162166
#[inline(always)]
163167
fn checkpoint(&self) -> Self::Checkpoint {

src/stream/stateful.rs

+4
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,10 @@ impl<I: Stream, S: crate::lib::std::fmt::Debug> Stream for Stateful<I, S> {
136136
fn next_slice(&mut self, offset: usize) -> Self::Slice {
137137
self.input.next_slice(offset)
138138
}
139+
#[inline(always)]
140+
fn peek_slice(&self, offset: usize) -> Self::Slice {
141+
self.input.peek_slice(offset)
142+
}
139143

140144
#[inline(always)]
141145
fn checkpoint(&self) -> Self::Checkpoint {

src/stream/tests.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,7 @@ fn test_bit_stream_empty() {
6767
let actual = i.offset_at(1);
6868
assert_eq!(actual, Err(Needed::new(1)));
6969

70-
let (actual_input, actual_slice) = i.peek_slice(0);
71-
assert_eq!(actual_input, (&b""[..], 0));
70+
let actual_slice = i.peek_slice(0);
7271
assert_eq!(actual_slice, (&b""[..], 0, 0));
7372
}
7473

@@ -105,15 +104,15 @@ fn bit_stream_inner(byte_len: usize, start: usize) {
105104
let to_offset = curr_i.offset_from(&i);
106105
assert_eq!(curr_offset, to_offset);
107106

108-
let (slice_i, _) = i.peek_slice(curr_offset);
109-
assert_eq!(curr_i, slice_i);
107+
let actual_slice = i.peek_slice(curr_offset);
108+
let expected_slice = i.clone().peek_slice(curr_offset);
109+
assert_eq!(actual_slice, expected_slice);
110110

111111
let at_offset = i.offset_at(curr_offset).unwrap();
112112
assert_eq!(curr_offset, at_offset);
113113

114114
let eof_offset = curr_i.eof_offset();
115-
let (next_eof_i, eof_slice) = curr_i.peek_slice(eof_offset);
116-
assert_eq!(next_eof_i, (&b""[..], 0));
115+
let eof_slice = curr_i.peek_slice(eof_offset);
117116
let eof_slice_i = (eof_slice.0, eof_slice.1);
118117
assert_eq!(eof_slice_i, curr_i);
119118

0 commit comments

Comments
 (0)