DataflowIterator normalization

The patch normalizes the data flow iterators. The reasoning behind it is
to allow passing the base class around without knowing what underlying iterator
is used. This will thus allow called functions to call the
specified Next function. This feature will be required for future patches.

- Made DataflowIterator a base class with an abstract Next function
- Updated each derived class to use the same Next function signature
- Added comments and doxygen comments

Change-Id: I3b9bce6326675575172f0ebd3681369d40d55661
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
diff --git a/compiler/dex/dataflow_iterator-inl.h b/compiler/dex/dataflow_iterator-inl.h
index 64e5fa6..0ca1a47 100644
--- a/compiler/dex/dataflow_iterator-inl.h
+++ b/compiler/dex/dataflow_iterator-inl.h
@@ -24,65 +24,100 @@
 // Single forward pass over the nodes.
 inline BasicBlock* DataflowIterator::ForwardSingleNext() {
   BasicBlock* res = NULL;
+
+  // Are we not yet at the end?
   if (idx_ < end_idx_) {
-    BasicBlockId bb_id = block_id_list_->Get(idx_++);
+    // Get the next index.
+    BasicBlockId bb_id = block_id_list_->Get(idx_);
     res = mir_graph_->GetBasicBlock(bb_id);
+    idx_++;
   }
+
   return res;
 }
 
 // Repeat full forward passes over all nodes until no change occurs during a complete pass.
-inline BasicBlock* DataflowIterator::ForwardRepeatNext(bool had_change) {
-  changed_ |= had_change;
+inline BasicBlock* DataflowIterator::ForwardRepeatNext() {
   BasicBlock* res = NULL;
-  if ((idx_ >= end_idx_) && changed_) {
+
+  // Are we at the end and have we changed something?
+  if ((idx_ >= end_idx_) && changed_ == true) {
+    // Reset the index.
     idx_ = start_idx_;
     repeats_++;
     changed_ = false;
   }
+
+  // Are we not yet at the end?
   if (idx_ < end_idx_) {
-    BasicBlockId bb_id = block_id_list_->Get(idx_++);
+    // Get the BasicBlockId.
+    BasicBlockId bb_id = block_id_list_->Get(idx_);
     res = mir_graph_->GetBasicBlock(bb_id);
+    idx_++;
   }
+
   return res;
 }
 
 // Single reverse pass over the nodes.
 inline BasicBlock* DataflowIterator::ReverseSingleNext() {
   BasicBlock* res = NULL;
+
+  // Are we not yet at the end?
   if (idx_ >= 0) {
-    BasicBlockId bb_id = block_id_list_->Get(idx_--);
+    // Get the BasicBlockId.
+    BasicBlockId bb_id = block_id_list_->Get(idx_);
     res = mir_graph_->GetBasicBlock(bb_id);
+    idx_--;
   }
+
   return res;
 }
 
 // Repeat full backwards passes over all nodes until no change occurs during a complete pass.
-inline BasicBlock* DataflowIterator::ReverseRepeatNext(bool had_change) {
-  changed_ |= had_change;
+inline BasicBlock* DataflowIterator::ReverseRepeatNext() {
   BasicBlock* res = NULL;
+
+  // Are we done and we changed something during the last iteration?
   if ((idx_ < 0) && changed_) {
+    // Reset the index.
     idx_ = start_idx_;
     repeats_++;
     changed_ = false;
   }
+
+  // Are we not yet done?
   if (idx_ >= 0) {
-    BasicBlockId bb_id = block_id_list_->Get(idx_--);
+    // Get the BasicBlockId.
+    BasicBlockId bb_id = block_id_list_->Get(idx_);
     res = mir_graph_->GetBasicBlock(bb_id);
+    idx_--;
   }
+
   return res;
 }
 
 // AllNodes uses the existing GrowableArray iterator, and should be considered unordered.
-inline BasicBlock* AllNodesIterator::Next() {
+inline BasicBlock* AllNodesIterator::Next(bool had_change) {
   BasicBlock* res = NULL;
+
+  // Suppose we want to keep looking.
   bool keep_looking = true;
-  while (keep_looking) {
+
+  // Find the next BasicBlock.
+  while (keep_looking == true) {
+    // Get next BasicBlock.
     res = all_nodes_iterator_->Next();
-    if ((res == NULL) || (!res->hidden)) {
+
+    // Are we done or is the BasicBlock not hidden?
+    if ((res == NULL) || (res->hidden == false)) {
       keep_looking = false;
     }
   }
+
+  // Update changed: if had_changed is true, we remember it for the whole iteration.
+  changed_ |= had_change;
+
   return res;
 }