pub fn pre_order_iter<'a>(&'a self, a: Addr) -> HCPreOrderIterator<'a> {
HCPreOrderIterator::new(self, a)
}
-
+
pub fn post_order_iter<'a>(&'a self, a: Addr) -> HCPostOrderIterator<'a> {
HCPostOrderIterator::new(HCPreOrderIterator::new(self, a))
}
}
}
+pub struct HCDerefAcyclicIterator<HCIter> {
+ iter: HCIter,
+ seen: HashSet<Addr>
+}
+
+impl<HCIter: MutStackHCIterator> HCDerefAcyclicIterator<HCIter>
+{
+ pub fn new(iter: HCIter) -> Self {
+ HCDerefAcyclicIterator { iter, seen: HashSet::new() }
+ }
+}
+
+impl<HCIter> Iterator for HCDerefAcyclicIterator<HCIter>
+ where HCIter: Iterator<Item=HeapCellValue> + MutStackHCIterator
+{
+ type Item = HeapCellValue;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ loop {
+ match self.iter.next() {
+ Some(HeapCellValue::Addr(addr)) =>
+ if !self.seen.contains(&addr) {
+ self.seen.insert(addr.clone());
+ return Some(HeapCellValue::Addr(addr));
+ },
+ item => return item
+ }
+ }
+ }
+}
+
pub struct HCZippedAcyclicIterator<HCIter> {
i1: HCIter,
i2: HCIter,
use prolog::ast::*;
use prolog::heap_iter::*;
+use std::borrow::Cow;
use std::cell::Cell;
use std::rc::Rc;
formatter: Formatter,
outputter: Outputter,
iter: HCPreOrderIterator<'a>,
- state_stack: Vec<TokenOrRedirect>
+ state_stack: Vec<TokenOrRedirect>,
+ heap_locs: Cow<'a, HeapVarDict>
}
impl<'a, Formatter: HCValueFormatter, Outputter: HCValueOutputter>
HCPrinter<'a, Formatter, Outputter>
{
- pub fn new(iter: HCPreOrderIterator<'a>, formatter: Formatter, outputter: Outputter)
- -> Self
+ pub fn new(iter: HCPreOrderIterator<'a>, fmt: Formatter, output: Outputter) -> Self
{
- HCPrinter { formatter, outputter, iter, state_stack: vec![] }
+ HCPrinter { formatter: fmt,
+ outputter: output,
+ iter,
+ state_stack: vec![],
+ heap_locs: Cow::default() }
}
+ pub fn from_heap_locs(iter: HCPreOrderIterator<'a>, fmt: Formatter,
+ output: Outputter, heap_locs: &'a HeapVarDict)
+ -> Self
+ {
+ HCPrinter { formatter: fmt,
+ outputter: output,
+ iter,
+ state_stack: vec![],
+ heap_locs: Cow::Borrowed(heap_locs) }
+ }
+
fn handle_heap_term(&mut self, heap_val: HeapCellValue) {
match heap_val {
HeapCellValue::NamedStr(arity, name, fixity) => {