set up heap_var Cow in heap_print.rs

This commit is contained in:
Mark Thom
2018-05-04 20:15:39 -06:00
parent 2df82e6b01
commit afc5736418
2 changed files with 52 additions and 5 deletions

View File

@@ -120,7 +120,7 @@ impl MachineState {
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))
}
@@ -179,6 +179,37 @@ where HCIter: Iterator<Item=HeapCellValue> + MutStackHCIterator
}
}
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,

View File

@@ -1,6 +1,7 @@
use prolog::ast::*;
use prolog::heap_iter::*;
use std::borrow::Cow;
use std::cell::Cell;
use std::rc::Rc;
@@ -143,18 +144,33 @@ pub struct HCPrinter<'a, Formatter, Outputter> {
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) => {