1 package Analysis.OwnershipAnalysis;
9 public class TokenTupleSet extends Canonical {
11 private HashSet<TokenTuple> tokenTuples;
13 public TokenTupleSet() {
14 tokenTuples = new HashSet<TokenTuple>();
17 public TokenTupleSet( TokenTuple tt ) {
19 tokenTuples.add( tt );
22 public TokenTupleSet( TokenTupleSet tts ) {
23 tokenTuples = (HashSet<TokenTuple>) tts.tokenTuples.clone(); //COPY?!
26 public TokenTupleSet makeCanonical() {
27 return (TokenTupleSet) Canonical.makeCanonical( this );
30 public Iterator iterator() {
31 return tokenTuples.iterator();
35 public TokenTupleSet add( TokenTuple tt ) {
36 TokenTupleSet ttsOut = new TokenTupleSet( tt );
37 return this.union( ttsOut );
41 public TokenTupleSet union( TokenTupleSet ttsIn ) {
42 TokenTupleSet ttsOut = new TokenTupleSet( this );
43 ttsOut.tokenTuples.addAll( ttsIn.tokenTuples );
44 return ttsOut.makeCanonical();
48 public TokenTupleSet unionUpArity( TokenTupleSet ttsIn ) {
49 TokenTupleSet ttsOut = new TokenTupleSet();
51 Iterator itrIn = ttsIn.iterator();
52 while( itrIn.hasNext() ) {
53 TokenTuple ttIn = (TokenTuple) itrIn.next();
55 if( this.containsToken( ttIn.getToken() ) ) {
56 ttsOut.tokenTuples.add( ttIn.increaseArity() );
58 ttsOut.tokenTuples.add( ttIn );
62 Iterator itrThis = this.iterator();
63 while( itrThis.hasNext() ) {
64 TokenTuple ttThis = (TokenTuple) itrThis.next();
66 if( !ttsIn.containsToken( ttThis.getToken() ) ) {
67 ttsOut.tokenTuples.add( ttThis );
71 return ttsOut.makeCanonical();
75 public boolean isEmpty() {
76 return tokenTuples.isEmpty();
79 public boolean isSubset( TokenTupleSet ttsIn ) {
81 return ttsIn.tokenTuples.containsAll( this.tokenTuples );
84 public boolean containsTuple( TokenTuple tt ) {
85 return tokenTuples.contains( tt );
88 // only needs to be done if newSummary is true? RIGHT?
89 public TokenTupleSet increaseArity( Integer token ) {
91 = new TokenTuple( token, true, TokenTuple.ARITY_ONE ).makeCanonical();
92 if( tokenTuples.contains( tt ) ) {
93 tokenTuples.remove( tt );
95 new TokenTuple( token, true, TokenTuple.ARITY_MANY ).makeCanonical()
99 return makeCanonical();
102 public boolean equals( Object o ) {
103 if( !(o instanceof TokenTupleSet) ) {
107 TokenTupleSet tts = (TokenTupleSet) o;
108 return tokenTuples.equals( tts.tokenTuples );
111 public int hashCode() {
112 return tokenTuples.hashCode();
116 public boolean equalWithoutArity( TokenTupleSet ttsIn ) {
117 Iterator itrIn = ttsIn.iterator();
118 while( itrIn.hasNext() ) {
119 TokenTuple ttIn = (TokenTuple) itrIn.next();
121 if( !this.containsToken( ttIn.getToken() ) )
127 Iterator itrThis = this.iterator();
128 while( itrThis.hasNext() ) {
129 TokenTuple ttThis = (TokenTuple) itrThis.next();
131 if( !ttsIn.containsToken( ttThis.getToken() ) )
141 // this should be a hash table so we can do this by key
142 public boolean containsToken( Integer token ) {
143 Iterator itr = tokenTuples.iterator();
144 while( itr.hasNext() ) {
145 TokenTuple tt = (TokenTuple) itr.next();
146 if( token.equals( tt.getToken() ) ) {
153 public TokenTupleSet ageTokens( AllocationSite as ) {
154 TokenTupleSet ttsOut = new TokenTupleSet();
156 TokenTuple ttSummary = null;
157 boolean foundOldest = false;
159 Iterator itrT = this.iterator();
160 while( itrT.hasNext() ) {
161 TokenTuple tt = (TokenTuple) itrT.next();
163 Integer token = tt.getToken();
164 int age = as.getAge( token );
166 // summary tokens and tokens not associated with
167 // the site should be left alone
168 if( age == AllocationSite.AGE_notInThisSite ) {
169 ttsOut.tokenTuples.add( tt );
172 if( age == AllocationSite.AGE_summary ) {
173 // remember the summary tuple, but don't add it
174 // we may combine it with the oldest tuple
177 } else if( age == AllocationSite.AGE_oldest ) {
178 // found an oldest token, again just remember
183 // otherwise, we change this token to the
185 Integer tokenToChangeTo = as.getIthOldest( age + 1 );
186 TokenTuple ttAged = tt.changeTokenTo( tokenToChangeTo );
187 ttsOut.tokenTuples.add( ttAged );
193 // there are four cases to consider here
194 // 1. we found a summary tuple and no oldest tuple
195 // Here we just pass the summary unchanged
196 // 2. we found an oldest tuple, no summary
197 // Make a new, arity-one summary tuple
198 // 3. we found both a summary and an oldest
199 // Merge them by increasing arity of summary
200 // 4. (not handled) we found neither, do nothing
201 if ( ttSummary != null && !foundOldest ) {
202 ttsOut.tokenTuples.add( ttSummary );
204 } else if( ttSummary == null && foundOldest ) {
205 ttsOut.tokenTuples.add( new TokenTuple( as.getSummary(),
207 TokenTuple.ARITY_ONE ).makeCanonical() );
209 } else if( ttSummary != null && foundOldest ) {
210 ttsOut.tokenTuples.add( ttSummary.increaseArity() );
213 return ttsOut.makeCanonical();
216 public String toString() {
217 return tokenTuples.toString();