structure for manipulating triples
[IRC.git] / Robust / src / Analysis / MLP / VarSrcTokTable.java
1 package Analysis.MLP;
2
3 import IR.*;
4 import IR.Flat.*;
5 import java.util.*;
6 import java.io.*;
7
8 public class VarSrcTokTable {
9   
10   // the true set represents the set of (sese, variable, age)
11   // triples that are truly in the table
12   private HashSet<VariableSourceToken> trueSet;
13
14   // these hashtables provide an efficient retreival from the
15   // true set.  Note that a particular triple from the quick
16   // look up must be checked against the true set--remove ops
17   // can cause the hashtables to be inconsistent to each other
18   private Hashtable< FlatSESEEnterNode, Set<VariableSourceToken> > sese2vst;
19   private Hashtable< TempDescriptor,    Set<VariableSourceToken> >  var2vst;
20   private Hashtable< SVKey,             Set<VariableSourceToken> >   sv2vst;
21
22
23   public VarSrcTokTable() {
24     trueSet = new HashSet<VariableSourceToken>();
25
26     sese2vst = new Hashtable< FlatSESEEnterNode, Set<VariableSourceToken> >();
27     var2vst  = new Hashtable< TempDescriptor,    Set<VariableSourceToken> >();
28     sv2vst   = new Hashtable< SVKey,             Set<VariableSourceToken> >();
29   }
30
31
32   public void add( VariableSourceToken vst ) {
33     trueSet.add( vst );
34
35     Set<VariableSourceToken> s;
36
37     s = sese2vst.get( vst.getSESE() );
38     if( s == null ) {
39       s = new HashSet<VariableSourceToken>();
40     }
41     s.add( vst );
42     sese2vst.put( vst.getSESE(), s );
43
44     s = var2vst.get( vst.getVar() );
45     if( s == null ) {
46       s = new HashSet<VariableSourceToken>();
47     }
48     s.add( vst );
49     var2vst.put( vst.getVar(), s );
50
51     SVKey key = new SVKey( vst.getSESE(), vst.getVar() );
52     s = sv2vst.get( key );
53     if( s == null ) {
54       s = new HashSet<VariableSourceToken>();
55     }
56     s.add( vst );
57     sv2vst.put( key, s );
58   }
59
60
61   public Set<VariableSourceToken> get( FlatSESEEnterNode sese ) {
62     Set<VariableSourceToken> s = sese2vst.get( sese );
63     if( s == null ) {
64       s = new HashSet<VariableSourceToken>();      
65       sese2vst.put( sese, s );
66     }
67     s.retainAll( trueSet );
68     return s;
69   }
70
71   public Set<VariableSourceToken> get( TempDescriptor var ) {
72     Set<VariableSourceToken> s = var2vst.get( var );
73     if( s == null ) {
74       s = new HashSet<VariableSourceToken>();
75       var2vst.put( var, s );
76     }
77     s.retainAll( trueSet );
78     return s;
79   }
80
81   public Set<VariableSourceToken> get( SVKey key ) {
82     Set<VariableSourceToken> s = sv2vst.get( key );
83     if( s == null ) {
84       s = new HashSet<VariableSourceToken>();
85       sv2vst.put( key, s );
86     }
87     s.retainAll( trueSet );
88     return s;
89   }
90
91
92   public void merge( VarSrcTokTable table ) {
93     trueSet.addAll( table.trueSet );
94
95     Iterator i; 
96     Set s;
97
98     itr = sese2vst.getEntrySet().iterator();
99     while( itr.hasNext() ) {
100       Map.Entry                me   = (Map.Entry)                itr.next();
101       FlatSESEEnterNode        sese = (FlatSESEEnterNode)        me.getKey();
102       Set<VariableSourceToken> s1   = (Set<VariableSourceToken>) me.getValue();
103       Set<VariableSourceToken> s2   = table.sese2vst.get( sese );
104       
105       assert s1 != null;
106
107       if( s2 != null ) {
108         s1.addAll( s2 );
109       }           
110     }
111     s = table.sese2vst.getEntrySet();
112     s.retainAll( sese2vst.getEntrySet() );
113     sese2vst.putAll( table.sese2vst );
114
115     itr = var2vst.getEntrySet().iterator();
116     while( itr.hasNext() ) {
117       Map.Entry                me  = (Map.Entry)                itr.next();
118       TempDescriptor           var = (TempDescriptor)           me.getKey();
119       Set<VariableSourceToken> s1  = (Set<VariableSourceToken>) me.getValue();
120       Set<VariableSourceToken> s2  = table.var2vst.get( var );
121       
122       assert s1 != null;
123
124       if( s2 != null ) {
125         s1.addAll( s2 );
126       }           
127     }
128     s = table.var2vst.getEntrySet();
129     s.retainAll( var2vst.getEntrySet() );
130     var2vst.putAll( table.var2vst );
131
132     itr = sv2vst.getEntrySet().iterator();
133     while( itr.hasNext() ) {
134       Map.Entry                me  = (Map.Entry)                itr.next();
135       SVKey                    key = (SVKey)                    me.getKey();
136       Set<VariableSourceToken> s1  = (Set<VariableSourceToken>) me.getValue();
137       Set<VariableSourceToken> s2  = table.sv2vst.get( key );
138       
139       assert s1 != null;
140
141       if( s2 != null ) {
142         s1.addAll( s2 );
143       }           
144     }
145     s = table.sv2vst.getEntrySet();
146     s.retainAll( sv2vst.getEntrySet() );
147     sv2vst.putAll( table.sv2vst );
148   }
149
150
151   public void remove( FlatSESEEnterNode sese ) {
152     Set<VariableSourceToken> s = sese2vst.get( sese );
153     if( s == null ) {
154       return;
155     }
156     
157     trueSet.removeAll( s );        
158     sese2vst.remove( sese );
159   }
160
161   public void remove( TempDescriptor var ) {
162     Set<VariableSourceToken> s = var2vst.get( var );
163     if( s == null ) {
164       return;
165     }
166     
167     trueSet.removeAll( s );        
168     var2vst.remove( var );
169   }
170
171   public void remove( FlatSESEEnterNode sese,
172                       TempDescriptor    var  ) {
173
174     SVKey key = new SVKey( sese, var );
175     Set<VariableSourceToken> s = sv2vst.get( key );
176     if( s == null ) {
177       return;
178     }
179     
180     trueSet.removeAll( s );
181     sese2vst.remove( sese );
182     var2vst .remove( var  );
183     sv2vst  .remove( key  );
184   }
185
186   public boolean equals( Object o ) {
187     if( o == null ) {
188       return false;
189     }
190
191     if( !(o instanceof VarSrcTokTable) ) {
192       return false;
193     }
194
195     VarSrcTokTable table = (VarSrcTokTable) o;
196     return trueSet.equals( table.trueSet );
197   }
198
199   public int hashCode() {
200     return trueSet.hashCode();
201   }
202
203   public String toString() {
204     return trueSet.toString();
205   }
206 }