1 package Analysis.MLP;
\r
8 public class VarSrcTokTable {
\r
10 // the true set represents the set of (sese, variable, age)
\r
11 // triples that are truly in the table
\r
12 private HashSet<VariableSourceToken> trueSet;
\r
14 // these hashtables provide an efficient retreival from the
\r
15 // true set. Note that a particular triple from the quick
\r
16 // look up must be checked against the true set--remove ops
\r
17 // can cause the hashtables to be inconsistent to each other
\r
18 private Hashtable< TempDescriptor, Set<VariableSourceToken> > var2vst;
\r
19 private Hashtable< FlatSESEEnterNode, Set<VariableSourceToken> > sese2vst;
\r
20 private Hashtable< SVKey, Set<VariableSourceToken> > sv2vst;
\r
22 // maximum age from aging operation
\r
23 private Integer MAX_AGE = new Integer( 2 );
\r
26 public VarSrcTokTable() {
\r
27 trueSet = new HashSet<VariableSourceToken>();
\r
29 sese2vst = new Hashtable< FlatSESEEnterNode, Set<VariableSourceToken> >();
\r
30 var2vst = new Hashtable< TempDescriptor, Set<VariableSourceToken> >();
\r
31 sv2vst = new Hashtable< SVKey, Set<VariableSourceToken> >();
\r
35 public VarSrcTokTable( VarSrcTokTable in ) {
\r
36 trueSet = (HashSet<VariableSourceToken>) in.trueSet.clone();
\r
38 Iterator itr; Set s;
\r
40 sese2vst = new Hashtable< FlatSESEEnterNode, Set<VariableSourceToken> >();
\r
41 itr = sese2vst.entrySet().iterator();
\r
42 while( itr.hasNext() ) {
\r
43 Map.Entry me = (Map.Entry) itr.next();
\r
44 FlatSESEEnterNode sese = (FlatSESEEnterNode) me.getKey();
\r
45 HashSet<VariableSourceToken> s1 = (HashSet<VariableSourceToken>) me.getValue();
\r
47 sese2vst.put( sese,
\r
48 (HashSet<VariableSourceToken>) (s1.clone()) );
\r
51 var2vst = new Hashtable< TempDescriptor, Set<VariableSourceToken> >();
\r
52 itr = var2vst.entrySet().iterator();
\r
53 while( itr.hasNext() ) {
\r
54 Map.Entry me = (Map.Entry) itr.next();
\r
55 TempDescriptor var = (TempDescriptor) me.getKey();
\r
56 HashSet<VariableSourceToken> s1 = (HashSet<VariableSourceToken>) me.getValue();
\r
59 (HashSet<VariableSourceToken>) (s1.clone()) );
\r
62 sv2vst = new Hashtable< SVKey, Set<VariableSourceToken> >();
\r
63 itr = sv2vst.entrySet().iterator();
\r
64 while( itr.hasNext() ) {
\r
65 Map.Entry me = (Map.Entry) itr.next();
\r
66 SVKey key = (SVKey) me.getKey();
\r
67 HashSet<VariableSourceToken> s1 = (HashSet<VariableSourceToken>) me.getValue();
\r
70 (HashSet<VariableSourceToken>) (s1.clone()) );
\r
75 public void add( VariableSourceToken vst ) {
\r
78 Set<VariableSourceToken> s;
\r
80 s = sese2vst.get( vst.getSESE() );
\r
82 s = new HashSet<VariableSourceToken>();
\r
85 sese2vst.put( vst.getSESE(), s );
\r
87 s = var2vst.get( vst.getVarLive() );
\r
89 s = new HashSet<VariableSourceToken>();
\r
92 var2vst.put( vst.getVarLive(), s );
\r
94 SVKey key = new SVKey( vst.getSESE(), vst.getVarLive() );
\r
95 s = sv2vst.get( key );
\r
97 s = new HashSet<VariableSourceToken>();
\r
100 sv2vst.put( key, s );
\r
103 public void addAll( Set<VariableSourceToken> s ) {
\r
104 Iterator<VariableSourceToken> itr = s.iterator();
\r
105 while( itr.hasNext() ) {
\r
111 public Set<VariableSourceToken> get() {
\r
115 public Set<VariableSourceToken> get( FlatSESEEnterNode sese ) {
\r
116 Set<VariableSourceToken> s = sese2vst.get( sese );
\r
118 s = new HashSet<VariableSourceToken>();
\r
119 sese2vst.put( sese, s );
\r
121 s.retainAll( trueSet );
\r
125 public Set<VariableSourceToken> get( TempDescriptor var ) {
\r
126 Set<VariableSourceToken> s = var2vst.get( var );
\r
128 s = new HashSet<VariableSourceToken>();
\r
129 var2vst.put( var, s );
\r
131 s.retainAll( trueSet );
\r
135 public Set<VariableSourceToken> get( SVKey key ) {
\r
136 Set<VariableSourceToken> s = sv2vst.get( key );
\r
138 s = new HashSet<VariableSourceToken>();
\r
139 sv2vst.put( key, s );
\r
141 s.retainAll( trueSet );
\r
146 public void merge( VarSrcTokTable table ) {
\r
148 if( table == null ) {
\r
152 trueSet.addAll( table.trueSet );
\r
157 itr = sese2vst.entrySet().iterator();
\r
158 while( itr.hasNext() ) {
\r
159 Map.Entry me = (Map.Entry) itr.next();
\r
160 FlatSESEEnterNode sese = (FlatSESEEnterNode) me.getKey();
\r
161 Set<VariableSourceToken> s1 = (Set<VariableSourceToken>) me.getValue();
\r
162 Set<VariableSourceToken> s2 = table.sese2vst.get( sese );
\r
170 s = table.sese2vst.entrySet();
\r
171 s.removeAll( sese2vst.entrySet() );
\r
172 sese2vst.putAll( table.sese2vst );
\r
174 itr = var2vst.entrySet().iterator();
\r
175 while( itr.hasNext() ) {
\r
176 Map.Entry me = (Map.Entry) itr.next();
\r
177 TempDescriptor var = (TempDescriptor) me.getKey();
\r
178 Set<VariableSourceToken> s1 = (Set<VariableSourceToken>) me.getValue();
\r
179 Set<VariableSourceToken> s2 = table.var2vst.get( var );
\r
187 s = table.var2vst.entrySet();
\r
188 s.removeAll( var2vst.entrySet() );
\r
189 var2vst.putAll( table.var2vst );
\r
191 itr = sv2vst.entrySet().iterator();
\r
192 while( itr.hasNext() ) {
\r
193 Map.Entry me = (Map.Entry) itr.next();
\r
194 SVKey key = (SVKey) me.getKey();
\r
195 Set<VariableSourceToken> s1 = (Set<VariableSourceToken>) me.getValue();
\r
196 Set<VariableSourceToken> s2 = table.sv2vst.get( key );
\r
204 s = table.sv2vst.entrySet();
\r
205 s.removeAll( sv2vst.entrySet() );
\r
206 sv2vst.putAll( table.sv2vst );
\r
210 public void remove( FlatSESEEnterNode sese ) {
\r
211 Set<VariableSourceToken> s = sese2vst.get( sese );
\r
216 trueSet.removeAll( s );
\r
217 sese2vst.remove( sese );
\r
220 public void remove( TempDescriptor var ) {
\r
221 Set<VariableSourceToken> s = var2vst.get( var );
\r
226 trueSet.removeAll( s );
\r
227 var2vst.remove( var );
\r
230 public void remove( FlatSESEEnterNode sese,
\r
231 TempDescriptor var ) {
\r
233 SVKey key = new SVKey( sese, var );
\r
234 Set<VariableSourceToken> s = sv2vst.get( key );
\r
239 trueSet.removeAll( s );
\r
240 sv2vst.remove( key );
\r
243 public void remove( VariableSourceToken vst ) {
\r
244 trueSet.remove( vst );
\r
248 // return a new table based on this one and
\r
249 // age tokens with respect to SESE curr, where
\r
250 // any child becomes curr with age 0, and any
\r
251 // curr tokens increase age by 1
\r
252 public VarSrcTokTable age( FlatSESEEnterNode curr ) {
\r
254 VarSrcTokTable out = new VarSrcTokTable();
\r
256 Iterator<VariableSourceToken> itr = trueSet.iterator();
\r
257 while( itr.hasNext() ) {
\r
258 VariableSourceToken vst = itr.next();
\r
259 if( vst.getSESE().equals( curr ) ) {
\r
260 Integer newAge = vst.getAge()+1;
\r
261 if( newAge > MAX_AGE ) {
\r
264 out.add( new VariableSourceToken( vst.getVarLive(),
\r
277 // for the given SESE, remove tokens for the same live
\r
278 // variable if it comes from a child SESE
\r
279 public VarSrcTokTable removeChildToks( FlatSESEEnterNode curr ) {
\r
281 // create a table to modify as a copy of this
\r
282 VarSrcTokTable out = new VarSrcTokTable( this );
\r
284 // iterate over this table, modify out table
\r
285 Iterator<VariableSourceToken> itr = get( curr ).iterator();
\r
286 while( itr.hasNext() ) {
\r
287 VariableSourceToken vst = itr.next();
\r
289 Iterator<VariableSourceToken> itr2 = get( vst.getVarLive() ).iterator();
\r
290 while( itr2.hasNext() ) {
\r
291 VariableSourceToken vst2 = itr2.next();
\r
293 if( curr.getChildren().contains( vst2.getSESE() ) ) {
\r
294 out.remove( vst2 );
\r
303 public boolean equals( Object o ) {
\r
308 if( !(o instanceof VarSrcTokTable) ) {
\r
312 VarSrcTokTable table = (VarSrcTokTable) o;
\r
313 return trueSet.equals( table.trueSet );
\r
316 public int hashCode() {
\r
317 return trueSet.hashCode();
\r
320 public Iterator<VariableSourceToken> iterator() {
\r
321 return trueSet.iterator();
\r
324 public String toString() {
\r
325 return "trueSet ="+trueSet.toString()+"\n"+
\r
326 "sese2vst="+sese2vst.toString()+"\n"+
\r
327 "var2vst ="+var2vst.toString()+"\n"+
\r
328 "sv2vst ="+sv2vst.toString();
\r