ChainsXAIF.hpp

Go to the documentation of this file.
00001 
00017 #ifndef ChainsXAIF_hpp
00018 #define ChainsXAIF_hpp
00019 
00020 #include <cassert>
00021 #include <iostream>
00022 #include <map>
00023 #include <set>
00024 #include <vector>
00025 #include <OpenAnalysis/Utils/OA_ptr.hpp>
00026 #include <OpenAnalysis/Utils/SetIterator.hpp>
00027 #include <OpenAnalysis/IRInterface/IRHandles.hpp>
00028 #include <OpenAnalysis/UDDUChains/Interface.hpp>
00029 
00030 namespace OA {
00031 
00036   namespace XAIF {
00037 
00038     typedef std::set<StmtHandle> StmtSet;
00039 
00040     class ChainsXAIF {
00041     public:
00042 
00043       ChainsXAIF();
00044  
00045      ~ChainsXAIF() {}
00046 
00047       static const int CHAIN_ID_NONE = -1; 
00048 
00049       class ChainIterator;
00050 
00051       class ChainsIterator;
00052 
00054       OA_ptr<ChainsIterator> getChainsIterator();
00055     
00058       OA_ptr<ChainIterator> getChainIterator(int id);
00059 
00061       int makeEmptyChain();
00062  
00064       void addStmt(StmtHandle stmt, int id);
00065 
00067       void addStmtSet(StmtSet& stmtSet, int id);
00068 
00071       int findChain(StmtSet& stmtSet);
00072 
00073       void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00074 
00075     protected:
00076 
00077       OA_ptr<std::map<int,OA_ptr<StmtSet> > > mIdToStmtSetMap;
00078       
00079     public:
00080 
00084       class ChainIterator : public SetIterator<StmtHandle>
00085       {
00086       public:
00087         ChainIterator(OA_ptr<std::set<StmtHandle> > pSet) 
00088             : SetIterator<StmtHandle>(pSet) {}
00089         ~ChainIterator() {}
00090       }; 
00091 
00095       class ChainsIterator {
00096       public:
00097         ChainsIterator(OA_ptr<std::map<int,OA_ptr<StmtSet> > > pChainMap) 
00098           : mChainMap(pChainMap) { reset(); }
00099         ~ChainsIterator() { }
00100 
00101         OA_ptr<ChainIterator> currentChainIterator()
00102           { OA_ptr<ChainIterator> retval;
00103             retval = new ChainIterator((*mChainMap)[mIter->first]);
00104             return retval;
00105           }
00106         
00107         int currentId() { return mIter->first; }
00108         bool isValid() { return (mIter != mChainMap->end()); }
00109         
00110         void operator++() { if (isValid()) mIter++; }
00111         void operator++(int) { ++*this; }
00112         
00113         void reset() { mIter = mChainMap->begin(); }
00114 
00115       private:
00116         OA_ptr<std::map<int,OA_ptr<StmtSet> > > mChainMap;
00117         std::map<int,OA_ptr<StmtSet> >::iterator mIter;
00118       };
00119 
00120     };
00121 
00122   } 
00123 }
00124 
00125 
00126 #endif
00127