Program Listing for File VirtualCFGIterator.h

Program Listing for File VirtualCFGIterator.h#

Return to documentation for file (src/midend/programAnalysis/genericDataflow/cfgUtils/VirtualCFGIterator.h)

#include <featureTests.h>
#ifdef ROSE_ENABLE_SOURCE_ANALYSIS

#ifndef VIRTUAL_CFG_ITERATOR
#define VIRTUAL_CFG_ITERATOR

#include "virtualCFG.h"
#include "DataflowCFG.h"
//#include "baseCFGIterator.h"

#include <list>
#include <set>
#include <string>

namespace VirtualCFG{

// Iterates over DataflowNodes in a VirtualCFG, respecting dependences in the graph.
// Supports both forward and backward iteration.
class iterator/* : public virtual BaseCFG::iterator*/
{
        //protected:
        public:

        std::list<DataflowNode> remainingNodes;
        //map<DataflowNode, bool> visited;
        std::set<DataflowNode> visited;
        bool initialized;

        public:
        iterator();

        iterator(const DataflowNode &start);
        virtual ~iterator() { }

        void init(const DataflowNode &start);

        protected:
        // returns true if the given DataflowNode is in the remainingNodes list and false otherwise
        bool isRemaining(DataflowNode n);

        // advances this iterator in the given direction. Forwards if fwDir=true and backwards if fwDir=false.
        // if pushAllChildren=true, all of the current node's unvisited children (predecessors or successors,
        //    depending on fwDir) are pushed onto remainingNodes
        void advance(bool fwDir, bool pushAllChildren);

        public:
        virtual void operator ++ (int);

        bool eq(const iterator& other_it) const;

        bool operator==(const iterator& other_it) const;

        bool operator!=(const iterator& it) const;

        DataflowNode& operator * ();

        // Returns a fresh iterator that starts at node n
        static iterator begin(DataflowNode n);

        // Returns an empty iterator that can be compared to any other iterator to
        // check if it has completed passing over its iteration space
        static iterator end();

        // Contains the state of an iterator, allowing iterators to be
        // checkpointed and restarted.
        class checkpoint/* : public virtual BaseCFG::iterator::checkpoint*/
        {
          std::list<DataflowNode> remainingNodes;
          std::set<DataflowNode> visited;

                public:
          checkpoint(const std::list<DataflowNode>& remainingNodes, const std::set<DataflowNode>& visited);

                checkpoint(const checkpoint& that);

                std::string str(std::string indent="");

                friend class iterator;
        };

        // Returns a checkpoint of this iterator's progress.
        checkpoint getChkpt();

        // Loads this iterator's state from the given checkpoint.
        void restartFromChkpt(checkpoint& chkpt);

        std::string str(std::string indent="");
};

class back_iterator : /*public virtual BaseCFG::backiterator, */public virtual iterator
{
        public:
        back_iterator(): iterator() {}

        back_iterator(const DataflowNode &end): iterator(end) { }

        void operator ++ (int);
};

class dataflow : /*public virtual BaseCFG::dataflow, */public virtual iterator
{
        DataflowNode terminator;
        public:
        //dataflow(): iterator() {}

        dataflow(const DataflowNode &terminator_arg);

        //dataflow(const DataflowNode &start) : iterator(start) {}
        dataflow(const DataflowNode &start, const DataflowNode &terminator_arg);

        void init(const DataflowNode &start_arg, const DataflowNode &terminator_arg);

        // Initializes this iterator's terminator node
        /*void setTerminator(const DataflowNode &terminator) {
                initialized = true;
                this->terminator = terminator;
        }*/

        void add(const DataflowNode &next);

        //void operator ++ (int);

        // Contains the state of an dataflow iterator, allowing dataflow
        // iterators to be checkpointed and restarted.
        class checkpoint/* : public virtual BaseCFG::dataflow::checkpoint*/
        {
                iterator::checkpoint iChkpt;
                DataflowNode terminator;

                public:
                checkpoint(const iterator::checkpoint& iChkpt, const DataflowNode& terminator);

                checkpoint(const checkpoint &that);

                std::string str(std::string indent="");

                friend class dataflow;
        };

        // Returns a checkpoint of this dataflow iterator's progress.
        checkpoint getChkpt();

        // Loads this dataflow iterator's state from the given checkpoint.
        void restartFromChkpt(checkpoint& chkpt);

        std::string str(std::string indent="");
};

class back_dataflow: /*public virtual BaseCFG::back_dataflow,*/ public virtual dataflow
{
        public:
        //back_dataflow(): back_iterator() {}

        back_dataflow(const DataflowNode &terminator_arg) : dataflow(terminator_arg) {}

        //back_dataflow(const DataflowNode &end) : iterator(end) {}

        back_dataflow(const DataflowNode &end, const DataflowNode &terminator_arg);

        void operator ++ (int);
};
}
#endif
#endif