UDDUChainsXAIF.hpp

Go to the documentation of this file.
00001 
00030 #ifndef UDDUChainsXAIF_hpp
00031 #define UDDUChainsXAIF_hpp
00032 
00033 #include <cassert>
00034 #include <iostream>
00035 #include <map>
00036 #include <set>
00037 #include <vector>
00038 #include "OpenAnalysis/Utils/OA_ptr.hpp"
00039 #include "OpenAnalysis/Utils/SetIterator.hpp"
00040 #include "OpenAnalysis/IRInterface/IRHandles.hpp"
00041 #include "OpenAnalysis/UDDUChains/Interface.hpp"
00042 #include "OpenAnalysis/XAIF/ChainsXAIF.hpp"
00043 
00044 namespace OA {
00045 
00050   namespace XAIF {
00051 
00052 
00061     class UDDUChainsXAIF : public ChainsXAIF {
00062 
00063     public:
00064 
00065       UDDUChainsXAIF();
00066 
00067       ~UDDUChainsXAIF() {}
00068 
00069       class MemRefsWithChainIterator; 
00070 
00076       OA_ptr<ChainIterator> getUDChainIterator(MemRefHandle h);
00077 
00083       OA_ptr<ChainIterator> getDUChainIterator(MemRefHandle h);
00084 
00089       OA_ptr<MemRefsWithChainIterator> getMemRefsWithChainIterator();
00090       
00097       int getUDDUChainId(MemRefHandle ref);
00098       
00102       void insertInto(MemRefHandle ref, int Id);
00103 
00104       void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00105 
00106     private:
00107 
00108       OA_ptr<std::map<MemRefHandle,int> > mMemRefToIdMap;
00109 
00110     public:
00111 
00112       class MemRefsWithChainIterator {
00113       public:
00114         MemRefsWithChainIterator(OA_ptr<std::map<MemRefHandle,int> > pMap) 
00115           : mMap(pMap), mIter(pMap->begin()) {}
00116         ~MemRefsWithChainIterator() {}
00117         
00118         MemRefHandle current() { return mIter->first; }
00119         bool isValid() { return (mIter != mMap->end()); }
00120         void operator++() { if (isValid()) mIter++; }
00121         void operator++(int) { ++*this; }
00122         void reset() { mIter = mMap->begin(); }
00123 
00124       private:
00125         OA_ptr<std::map<MemRefHandle,int> > mMap;
00126         std::map<MemRefHandle,int>::iterator mIter;
00127       };
00128 
00129     };
00130 
00131   } 
00132 } 
00133 
00134 #endif
00135