ScalarizedRefTab.h
Go to the documentation of this file.00001
00002
00003
00004 #ifndef ScalarizedRefTab_H
00005 #define ScalarizedRefTab_H
00006
00007 #include <set>
00008 #include <map>
00009 #include <string>
00010 #include <iostream>
00011
00012 #include "Open64IRInterface/Open64BasicTypes.h"
00013 #include "Open64IRInterface/Open64IRInterface.hpp"
00014 #include "BaseMap.h"
00015 #include "Diagnostics.h"
00016 #include "ScalarizedRef.h"
00017
00018 namespace fortTkSupport {
00019
00020 class ScalarizedRefTab_Base
00021 {
00022 public:
00023 enum TableType {
00024 W2X,
00025 X2W
00026 };
00027
00028 public:
00029
00030 typedef std::set<ScalarizedRef*> ScalarizedRefPoolTy;
00031
00032 ScalarizedRefPoolTy::iterator RefPoolBegin()
00033 { return scalarizedRefPool.begin(); }
00034
00035 ScalarizedRefPoolTy::iterator RefPoolEnd()
00036 { return scalarizedRefPool.end(); }
00037
00038 protected:
00039 ScalarizedRefTab_Base();
00040 virtual ~ScalarizedRefTab_Base();
00041
00042
00043 void
00044 InsertIntoPool(ScalarizedRef* x)
00045 {
00046 if (scalarizedRefPool.find(x) == scalarizedRefPool.end()) {
00047 scalarizedRefPool.insert(x);
00048 }
00049 }
00050
00051 protected:
00052
00053
00054
00055
00056 ScalarizedRefPoolTy scalarizedRefPool;
00057 };
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 template <ScalarizedRefTab_Base::TableType TabTy>
00070 class ScalarizedRefTab
00071 : public ScalarizedRefTab_Base,
00072 public BaseMap<void*, void*>
00073 {
00074 };
00075
00076
00077
00078
00079
00080 typedef ScalarizedRefTab<ScalarizedRefTab_Base::W2X>
00081 ScalarizedRefTab_W2X;
00082
00083 template <>
00084 class ScalarizedRefTab<ScalarizedRefTab_Base::W2X>
00085 : public ScalarizedRefTab_Base,
00086 public BaseMap<WN*, ScalarizedRef*> {
00087
00088 public:
00089
00090 ScalarizedRefTab();
00091 ScalarizedRefTab(PU_Info* pu) { Create(pu); }
00092 virtual ~ScalarizedRefTab();
00093
00094
00095 void Create(PU_Info* pu);
00096
00097
00098 virtual ScalarizedRef*
00099 Find(WN* x_, bool mustFind = false) const
00100 { return BaseMap<WN*, ScalarizedRef*>::Find(x_, mustFind); }
00101
00102
00103 ScalarizedRef*
00104 Find(const WN* x_, bool mustFind = false) const
00105 {
00106 WN* x = const_cast<WN*>(x_);
00107 return BaseMap<WN*, ScalarizedRef*>::Find(x, mustFind);
00108 }
00109
00110
00111
00112 virtual bool
00113 Insert(WN* x, ScalarizedRef* y) {
00114 InsertIntoPool(y);
00115 return BaseMap<WN*, ScalarizedRef*>::Insert(x, y);
00116 }
00117
00118
00119 bool
00120 Insert(const WN* x_, const ScalarizedRef* y_) {
00121 WN* x = const_cast<WN*>(x_);
00122 ScalarizedRef* y = const_cast<ScalarizedRef*>(y_);
00123 return Insert(x, y);
00124 }
00125
00126
00127
00128 virtual void Dump(std::ostream& o = std::cerr) const;
00129 virtual void DDump() const;
00130
00131 void DumpFmt(std::ostream& o = std::cerr, const char* pre = "") const;
00132
00133 protected:
00134
00135 ScalarizedRefTab(const ScalarizedRefTab& x) { }
00136 ScalarizedRefTab& operator=(const ScalarizedRefTab& x) { return *this; }
00137
00138 private:
00139 };
00140
00141
00142
00143
00144
00145
00146 class ScalarizedRefTabMap_W2X
00147 : public BaseMap<PU_Info*, ScalarizedRefTab_W2X*> {
00148
00149 public:
00150 ScalarizedRefTabMap_W2X();
00151 ScalarizedRefTabMap_W2X(PU_Info* pu_forest) { Create(pu_forest); }
00152 virtual ~ScalarizedRefTabMap_W2X();
00153
00154 void Create(PU_Info* pu_forest);
00155 };
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173 class ForAllScalarizableRefsOp {
00174 public:
00175 ForAllScalarizableRefsOp() { }
00176 virtual ~ForAllScalarizableRefsOp() { }
00177
00178
00179
00180 virtual int operator()(const WN* wn) = 0;
00181 private:
00182 };
00183
00184 void
00185 ForAllScalarizableRefs(const WN* wn, ForAllScalarizableRefsOp& op);
00186
00187
00188
00189
00190 class AddToScalarizedRefTabOp : public ForAllScalarizableRefsOp {
00191 public:
00192 AddToScalarizedRefTabOp(ScalarizedRefTab_W2X* tab_, PU_Info* curpu_);
00193 virtual ~AddToScalarizedRefTabOp();
00194
00195 ScalarizedRefTab_W2X* GetTab() { return tab; }
00196
00197
00198
00199 int operator()(const WN* wn);
00200
00201 private:
00202 typedef std::map<std::string, ScalarizedRef*> WorkMapTy;
00203
00204 private:
00205 ScalarizedRefTab_W2X* tab;
00206 PU_Info* curpu;
00207
00208 OA::OA_ptr<Open64IRInterface> ir;
00209 WorkMapTy workmap;
00210 };
00211
00212 }
00213
00214 #endif