use std::ops::Range;
use std::usize;
use petgraph::graph::NodeIndex;
use ron_uuid::UUID;
use {MnemonicIndex, Area, Function};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct BasicBlock {
pub uuid: UUID,
pub mnemonics: Range<MnemonicIndex>,
pub node: NodeIndex,
pub area: Area,
pub statements: Range<usize>,
}
impl BasicBlock {
pub fn area<'a>(&'a self) -> &'a Area { &self.area }
}
#[derive(Clone,Copy,Debug,PartialOrd,Ord,PartialEq,Eq)]
pub struct BasicBlockIndex {
index: usize
}
impl BasicBlockIndex {
pub fn new(i: usize) -> BasicBlockIndex { BasicBlockIndex{ index: i } }
pub fn index(&self) -> usize { self.index }
}
#[derive(Clone)]
pub struct BasicBlockIterator<'a> {
function: &'a Function,
index: usize,
max: usize,
}
impl<'a> BasicBlockIterator<'a> {
pub fn new(function: &'a Function,index: usize, max: usize) -> BasicBlockIterator<'a> {
BasicBlockIterator{
function: function,
index: index,
max: max,
}
}
}
impl<'a> Iterator for BasicBlockIterator<'a> {
type Item = (BasicBlockIndex,&'a BasicBlock);
fn next(&mut self) -> Option<(BasicBlockIndex,&'a BasicBlock)> {
if self.index < self.max {
let idx = BasicBlockIndex::new(self.index);
let bb = self.function.basic_block(idx);
self.index += 1;
Some((idx,bb))
} else {
None
}
}
}
impl<'a> ExactSizeIterator for BasicBlockIterator<'a> {
fn len(&self) -> usize {
self.max - self.index
}
}
impl<'a> DoubleEndedIterator for BasicBlockIterator<'a> {
fn next_back(&mut self) -> Option<(BasicBlockIndex,&'a BasicBlock)> {
if self.index < self.max {
let idx = BasicBlockIndex::new(self.max - 1);
let bb = self.function.basic_block(idx);
self.max -= 1;
Some((idx,bb))
} else {
None
}
}
}