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 containsTuple( TokenTuple tt ) {
80 return tokenTuples.contains( tt );
83 // only needs to be done if newSummary is true? RIGHT?
84 public TokenTupleSet increaseArity( Integer token ) {
86 = new TokenTuple( token, true, TokenTuple.ARITY_ONE ).makeCanonical();
87 if( tokenTuples.contains( tt ) ) {
88 tokenTuples.remove( tt );
90 new TokenTuple( token, true, TokenTuple.ARITY_MANY ).makeCanonical()
94 return makeCanonical();
97 public boolean equals( Object o ) {
98 if( !(o instanceof TokenTupleSet) ) {
102 TokenTupleSet tts = (TokenTupleSet) o;
103 return tokenTuples.equals( tts.tokenTuples );
106 public int hashCode() {
107 return tokenTuples.hashCode();
111 public boolean equalWithoutArity( TokenTupleSet ttsIn ) {
112 Iterator itrIn = ttsIn.iterator();
113 while( itrIn.hasNext() ) {
114 TokenTuple ttIn = (TokenTuple) itrIn.next();
116 if( !this.containsToken( ttIn.getToken() ) )
122 Iterator itrThis = this.iterator();
123 while( itrThis.hasNext() ) {
124 TokenTuple ttThis = (TokenTuple) itrThis.next();
126 if( !ttsIn.containsToken( ttThis.getToken() ) )
136 // this should be a hash table so we can do this by key
137 public boolean containsToken( Integer token ) {
138 Iterator itr = tokenTuples.iterator();
139 while( itr.hasNext() ) {
140 TokenTuple tt = (TokenTuple) itr.next();
141 if( token.equals( tt.getToken() ) ) {
148 public TokenTupleSet ageTokens( AllocationSite as ) {
149 TokenTupleSet ttsOut = new TokenTupleSet();
151 TokenTuple ttSummary = null;
152 boolean foundOldest = false;
154 Iterator itrT = this.iterator();
155 while( itrT.hasNext() ) {
156 TokenTuple tt = (TokenTuple) itrT.next();
158 Integer token = tt.getToken();
159 int age = as.getAge( token );
161 // summary tokens and tokens not associated with
162 // the site should be left alone
163 if( age == AllocationSite.AGE_notInThisSite ) {
164 ttsOut.tokenTuples.add( tt );
167 if( age == AllocationSite.AGE_summary ) {
168 // remember the summary tuple, but don't add it
169 // we may combine it with the oldest tuple
172 } else if( age == AllocationSite.AGE_oldest ) {
173 // found an oldest token, again just remember
178 // otherwise, we change this token to the
180 Integer tokenToChangeTo = as.getIthOldest( age + 1 );
181 TokenTuple ttAged = tt.changeTokenTo( tokenToChangeTo );
182 ttsOut.tokenTuples.add( ttAged );
188 // there are four cases to consider here
189 // 1. we found a summary tuple and no oldest tuple
190 // Here we just pass the summary unchanged
191 // 2. we found an oldest tuple, no summary
192 // Make a new, arity-one summary tuple
193 // 3. we found both a summary and an oldest
194 // Merge them by increasing arity of summary
195 // 4. (not handled) we found neither, do nothing
196 if ( ttSummary != null && !foundOldest ) {
197 ttsOut.tokenTuples.add( ttSummary );
199 } else if( ttSummary == null && foundOldest ) {
200 ttsOut.tokenTuples.add( new TokenTuple( as.getSummary(),
202 TokenTuple.ARITY_ONE ).makeCanonical() );
204 } else if( ttSummary != null && foundOldest ) {
205 ttsOut.tokenTuples.add( ttSummary.increaseArity() );
208 return ttsOut.makeCanonical();
211 public String toString() {
212 return tokenTuples.toString();