Skip to content

Commit f8feed1

Browse files
committed
feat(data_structures): add advance_to_end method to SliceIter trait (#13947)
Add `advance_to_end` method to `SliceIter` trait. This allows calling `advance_to_end` on any slice iterator. (this stack of 3 PRs is work I did as part of first attempt to build an ESTree walker, which I abandoned, but the APIs are useful for other tasks in `oxc_ast_tools`).
1 parent 3ade441 commit f8feed1

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed

crates/oxc_data_structures/src/slice_iter.rs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,14 @@ pub trait SliceIter<'slice, T>: ExactSizeIterator + AsRef<[T]> + Sealed {
6464
/// Iterator must contain at least `count` more items.
6565
unsafe fn advance_unchecked(&mut self, count: usize);
6666

67+
/// Advance iterator to end.
68+
#[inline(always)]
69+
fn advance_to_end(&mut self) {
70+
// This function boils down to just setting the current pointer to the end - 2 instructions.
71+
// https://godbolt.org/z/EceneefEe
72+
self.advance(self.len());
73+
}
74+
6775
/// Get pointer to next item in the iterator.
6876
///
6977
/// Pointer is only valid to read an item from if iterator is not empty.
@@ -355,6 +363,39 @@ mod test_iter {
355363
}
356364
}
357365

366+
#[test]
367+
fn advance_to_end() {
368+
let arr = [11, 22, 33];
369+
370+
let mut iter = arr.iter();
371+
iter.advance_to_end();
372+
assert_eq!(iter.next(), None);
373+
374+
let mut iter = arr.iter();
375+
assert_eq!(iter.next(), Some(&11));
376+
iter.advance_to_end();
377+
assert_eq!(iter.next(), None);
378+
379+
let mut iter = arr.iter();
380+
assert_eq!(iter.next(), Some(&11));
381+
assert_eq!(iter.next(), Some(&22));
382+
iter.advance_to_end();
383+
assert_eq!(iter.next(), None);
384+
385+
let mut iter = arr.iter();
386+
assert_eq!(iter.next(), Some(&11));
387+
assert_eq!(iter.next(), Some(&22));
388+
assert_eq!(iter.next(), Some(&33));
389+
assert_eq!(iter.next(), None);
390+
iter.advance_to_end();
391+
assert_eq!(iter.next(), None);
392+
393+
let empty_arr: [u32; 0] = [];
394+
let mut iter = empty_arr.iter();
395+
iter.advance_to_end();
396+
assert_eq!(iter.next(), None);
397+
}
398+
358399
#[test]
359400
fn ptr() {
360401
let slice = [11u32, 22, 33];
@@ -513,6 +554,39 @@ mod test_iter_mut {
513554
}
514555
}
515556

557+
#[test]
558+
fn advance_to_end() {
559+
let mut arr = [11, 22, 33];
560+
561+
let mut iter = arr.iter_mut();
562+
iter.advance_to_end();
563+
assert_eq!(iter.next(), None);
564+
565+
let mut iter = arr.iter_mut();
566+
assert_eq!(iter.next(), Some(&mut 11));
567+
iter.advance_to_end();
568+
assert_eq!(iter.next(), None);
569+
570+
let mut iter = arr.iter_mut();
571+
assert_eq!(iter.next(), Some(&mut 11));
572+
assert_eq!(iter.next(), Some(&mut 22));
573+
iter.advance_to_end();
574+
assert_eq!(iter.next(), None);
575+
576+
let mut iter = arr.iter_mut();
577+
assert_eq!(iter.next(), Some(&mut 11));
578+
assert_eq!(iter.next(), Some(&mut 22));
579+
assert_eq!(iter.next(), Some(&mut 33));
580+
assert_eq!(iter.next(), None);
581+
iter.advance_to_end();
582+
assert_eq!(iter.next(), None);
583+
584+
let mut empty_arr: [u32; 0] = [];
585+
let mut iter = empty_arr.iter_mut();
586+
iter.advance_to_end();
587+
assert_eq!(iter.next(), None);
588+
}
589+
516590
#[test]
517591
fn ptr() {
518592
let mut slice = [11u32, 22, 33];

0 commit comments

Comments
 (0)