8 public class VarSrcTokTable {
10 // the true set represents the set of (sese, variable, age)
11 // triples that are truly in the table
12 private HashSet<VariableSourceToken> trueSet;
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< TempDescriptor, Set<VariableSourceToken> > var2vst;
19 private Hashtable< FlatSESEEnterNode, Set<VariableSourceToken> > sese2vst;
20 private Hashtable< SVKey, Set<VariableSourceToken> > sv2vst;
22 // maximum age from aging operation
23 private Integer MAX_AGE = new Integer( 2 );
26 public VarSrcTokTable() {
27 trueSet = new HashSet<VariableSourceToken>();
29 sese2vst = new Hashtable< FlatSESEEnterNode, Set<VariableSourceToken> >();
30 var2vst = new Hashtable< TempDescriptor, Set<VariableSourceToken> >();
31 sv2vst = new Hashtable< SVKey, Set<VariableSourceToken> >();
35 public void add( VariableSourceToken vst ) {
38 Set<VariableSourceToken> s;
40 s = sese2vst.get( vst.getSESE() );
42 s = new HashSet<VariableSourceToken>();
45 sese2vst.put( vst.getSESE(), s );
47 s = var2vst.get( vst.getVarLive() );
49 s = new HashSet<VariableSourceToken>();
52 var2vst.put( vst.getVarLive(), s );
54 SVKey key = new SVKey( vst.getSESE(), vst.getVarLive() );
55 s = sv2vst.get( key );
57 s = new HashSet<VariableSourceToken>();
63 public void addAll( Set<VariableSourceToken> s ) {
64 Iterator<VariableSourceToken> itr = s.iterator();
65 while( itr.hasNext() ) {
71 public Set<VariableSourceToken> get() {
75 public Set<VariableSourceToken> get( FlatSESEEnterNode sese ) {
76 Set<VariableSourceToken> s = sese2vst.get( sese );
78 s = new HashSet<VariableSourceToken>();
79 sese2vst.put( sese, s );
81 s.retainAll( trueSet );
85 public Set<VariableSourceToken> get( TempDescriptor var ) {
86 Set<VariableSourceToken> s = var2vst.get( var );
88 s = new HashSet<VariableSourceToken>();
89 var2vst.put( var, s );
91 s.retainAll( trueSet );
95 public Set<VariableSourceToken> get( SVKey key ) {
96 Set<VariableSourceToken> s = sv2vst.get( key );
98 s = new HashSet<VariableSourceToken>();
101 s.retainAll( trueSet );
106 public void merge( VarSrcTokTable table ) {
108 if( table == null ) {
112 trueSet.addAll( table.trueSet );
117 itr = sese2vst.entrySet().iterator();
118 while( itr.hasNext() ) {
119 Map.Entry me = (Map.Entry) itr.next();
120 FlatSESEEnterNode sese = (FlatSESEEnterNode) me.getKey();
121 Set<VariableSourceToken> s1 = (Set<VariableSourceToken>) me.getValue();
122 Set<VariableSourceToken> s2 = table.sese2vst.get( sese );
130 s = table.sese2vst.entrySet();
131 s.removeAll( sese2vst.entrySet() );
132 sese2vst.putAll( table.sese2vst );
134 itr = var2vst.entrySet().iterator();
135 while( itr.hasNext() ) {
136 Map.Entry me = (Map.Entry) itr.next();
137 TempDescriptor var = (TempDescriptor) me.getKey();
138 Set<VariableSourceToken> s1 = (Set<VariableSourceToken>) me.getValue();
139 Set<VariableSourceToken> s2 = table.var2vst.get( var );
147 s = table.var2vst.entrySet();
148 s.removeAll( var2vst.entrySet() );
149 var2vst.putAll( table.var2vst );
151 itr = sv2vst.entrySet().iterator();
152 while( itr.hasNext() ) {
153 Map.Entry me = (Map.Entry) itr.next();
154 SVKey key = (SVKey) me.getKey();
155 Set<VariableSourceToken> s1 = (Set<VariableSourceToken>) me.getValue();
156 Set<VariableSourceToken> s2 = table.sv2vst.get( key );
164 s = table.sv2vst.entrySet();
165 s.removeAll( sv2vst.entrySet() );
166 sv2vst.putAll( table.sv2vst );
170 public void remove( FlatSESEEnterNode sese ) {
171 Set<VariableSourceToken> s = sese2vst.get( sese );
176 trueSet.removeAll( s );
177 sese2vst.remove( sese );
180 public void remove( TempDescriptor var ) {
181 Set<VariableSourceToken> s = var2vst.get( var );
186 trueSet.removeAll( s );
187 var2vst.remove( var );
190 public void remove( FlatSESEEnterNode sese,
191 TempDescriptor var ) {
193 SVKey key = new SVKey( sese, var );
194 Set<VariableSourceToken> s = sv2vst.get( key );
199 trueSet.removeAll( s );
200 sv2vst.remove( key );
203 public void remove( VariableSourceToken vst ) {
204 trueSet.remove( vst );
208 // return a new table based on this one and
209 // age tokens with respect to SESE curr, where
210 // any child becomes curr with age 0, and any
211 // curr tokens increase age by 1
212 public VarSrcTokTable age( FlatSESEEnterNode curr ) {
214 VarSrcTokTable out = new VarSrcTokTable();
216 Iterator<VariableSourceToken> itr = trueSet.iterator();
217 while( itr.hasNext() ) {
218 VariableSourceToken vst = itr.next();
219 if( vst.getSESE().equals( curr ) ) {
220 Integer newAge = vst.getAge()+1;
221 if( newAge > MAX_AGE ) {
224 out.add( new VariableSourceToken( curr,
228 assert curr.getChildren().contains( vst.getSESE() );
229 out.add( new VariableSourceToken( curr,
231 new Integer( 1 ) ) );
239 public boolean equals( Object o ) {
244 if( !(o instanceof VarSrcTokTable) ) {
248 VarSrcTokTable table = (VarSrcTokTable) o;
249 return trueSet.equals( table.trueSet );
252 public int hashCode() {
253 return trueSet.hashCode();
256 public Iterator<VariableSourceToken> iterator() {
257 return trueSet.iterator();
260 public String toString() {
261 return "trueSet ="+trueSet.toString()+"\n"+
262 "sese2vst="+sese2vst.toString()+"\n"+
263 "var2vst ="+var2vst.toString()+"\n"+
264 "sv2vst ="+sv2vst.toString();