···
2
+
use crate::dna::DnaIterator;
use crate::pattern::Pattern;
use crate::pattern::PatternItem;
use crate::template::Template;
use crate::template::TemplateItem;
12
+
iter: DnaIterator<'a>,
pub fn new(buf: &'a DnaRef) -> Parser<'a> {
16
-
Parser { buf: buf, index: 0 }
pub fn index(&self) -> usize {
23
-
pub fn next_is(&mut self, next: &[Base]) -> bool {
24
-
if self.index + next.len() > self.buf.len() {
30
+
fn peek_to(&mut self, n: usize) {
31
+
while self.peeked.len() < n {
32
+
if let Some(b) = self.iter.next() {
33
+
self.peeked.push(b);
28
-
for i in 0..next.len() {
29
-
if self.buf[self.index + i] != next[i] {
40
+
pub fn next_is(&mut self, next: &[Base]) -> bool {
41
+
self.peek_to(next.len());
42
+
if self.peeked.len() < next.len() {
45
+
return &self.peeked[..next.len()] == next;
48
+
pub fn advance(&mut self, n: usize) {
51
+
self.peeked.drain(..n);
pub fn nat(&mut self) -> Option<usize> {
···
if self.next_is(&[Base::P]) {
} else if self.next_is(&[Base::I]) || self.next_is(&[Base::F]) {
} else if self.next_is(&[Base::C]) {
···
let mut ret = Vec::new();
if self.next_is(&[Base::C]) {
} else if self.next_is(&[Base::F]) {
} else if self.next_is(&[Base::P]) {
} else if self.next_is(&[Base::I, Base::C]) {
···
if self.next_is(&[Base::C]) {
ret.push(PatternItem::Base(Base::I));
} else if self.next_is(&[Base::F]) {
ret.push(PatternItem::Base(Base::C));
} else if self.next_is(&[Base::P]) {
ret.push(PatternItem::Base(Base::F));
} else if self.next_is(&[Base::I, Base::C]) {
ret.push(PatternItem::Base(Base::P));
} else if self.next_is(&[Base::I, Base::P]) {
ret.push(PatternItem::Skip(n));
} else if self.next_is(&[Base::I, Base::F]) {
ret.push(PatternItem::Search(s));
} else if self.next_is(&[Base::I, Base::I, Base::P]) {
ret.push(PatternItem::Open);
} else if self.next_is(&[Base::I, Base::I, Base::C])
|| self.next_is(&[Base::I, Base::I, Base::F])
ret.push(PatternItem::Close);
} else if self.next_is(&[Base::I, Base::I, Base::I]) {
117
-
let mut new_rna = Vec::new();
119
-
new_rna.push(self.buf[self.index + i]);
135
+
let mut r = Vec::new();
136
+
mem::swap(&mut r, &mut self.peeked);
137
+
rna.push(r.try_into().unwrap());
122
-
rna.push(new_rna.try_into().unwrap());
···
let mut ret = Vec::new();
if self.next_is(&[Base::C]) {
ret.push(TemplateItem::Base(Base::I));
} else if self.next_is(&[Base::F]) {
ret.push(TemplateItem::Base(Base::C));
} else if self.next_is(&[Base::P]) {
ret.push(TemplateItem::Base(Base::F));
} else if self.next_is(&[Base::I, Base::C]) {
ret.push(TemplateItem::Base(Base::P));
} else if self.next_is(&[Base::I, Base::P]) || self.next_is(&[Base::I, Base::F]) {
ret.push(TemplateItem::Ref(n, l));
} else if self.next_is(&[Base::I, Base::I, Base::C])
|| self.next_is(&[Base::I, Base::I, Base::F])
} else if self.next_is(&[Base::I, Base::I, Base::P]) {
ret.push(TemplateItem::Len(n));
} else if self.next_is(&[Base::I, Base::I, Base::I]) {
160
-
let mut new_rna = Vec::new();
162
-
new_rna.push(self.buf[self.index + i]);
177
+
let mut r = Vec::new();
178
+
mem::swap(&mut r, &mut self.peeked);
179
+
rna.push(r.try_into().unwrap());
165
-
rna.push(new_rna.try_into().unwrap());