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
1.7.1