Add cached for SubtreeSource

This commit is contained in:
Edwin Cheng 2019-04-22 22:46:39 +08:00
parent c416caeda2
commit fccd045229

View file

@ -219,17 +219,33 @@ pub(crate) trait Querier {
#[derive(Debug)]
pub(crate) struct WalkerOwner<'a> {
walker: RefCell<SubTreeWalker<'a>>,
cached: RefCell<Vec<Option<TtToken>>>,
}
impl<'a> WalkerOwner<'a> {
fn new<I: Into<TokenSeq<'a>>>(ts: I) -> Self {
WalkerOwner { walker: RefCell::new(SubTreeWalker::new(ts.into())) }
WalkerOwner {
walker: RefCell::new(SubTreeWalker::new(ts.into())),
cached: RefCell::new(Vec::with_capacity(10)),
}
}
fn get<'b>(&self, pos: usize) -> Option<TtToken> {
self.set_pos(pos);
let walker = self.walker.borrow();
walker.current().cloned()
let mut cached = self.cached.borrow_mut();
if pos < cached.len() {
return cached[pos].clone();
}
while pos >= cached.len() {
let len = cached.len();
cached.push({
self.set_pos(len);
let walker = self.walker.borrow();
walker.current().cloned()
});
}
return cached[pos].clone();
}
fn set_pos(&self, pos: usize) {