Added some functionality to reachability classes that is apparently
[IRC.git] / Robust / src / Analysis / OwnershipAnalysis / TokenTupleSet.java
1 package Analysis.OwnershipAnalysis;
2
3 import IR.*;
4 import IR.Flat.*;
5 import java.util.*;
6 import java.io.*;
7
8
9 public class TokenTupleSet extends Canonical {
10
11     private HashSet<TokenTuple> tokenTuples;
12
13     public TokenTupleSet() {
14         tokenTuples = new HashSet<TokenTuple>();
15     }
16
17     public TokenTupleSet( TokenTuple tt ) {
18         this();
19         tokenTuples.add( tt );
20     }
21
22     public TokenTupleSet( TokenTupleSet tts ) {
23         tokenTuples = (HashSet<TokenTuple>) tts.tokenTuples.clone(); //COPY?!
24     }
25
26     public TokenTupleSet makeCanonical() {
27         return (TokenTupleSet) Canonical.makeCanonical( this );
28     }
29
30     public Iterator iterator() {
31         return tokenTuples.iterator();
32     }
33
34     public TokenTupleSet add( TokenTuple tt ) {
35         TokenTupleSet ttsOut = new TokenTupleSet( tt );
36         return this.union( ttsOut );
37     }
38
39     public TokenTupleSet union( TokenTupleSet ttsIn ) {
40         TokenTupleSet ttsOut = new TokenTupleSet( this );
41         ttsOut.tokenTuples.addAll( ttsIn.tokenTuples );
42         return ttsOut.makeCanonical();
43     }
44
45     /*
46     public TokenTupleSet unionUpArity( TokenTupleSet ttsIn ) {
47         TokenTupleSet ttsOut = new TokenTupleSet();
48         
49         Iterator itrIn = ttsIn.iterator();
50         while( itrIn.hasNext() ) {
51             TokenTuple ttIn = (TokenTuple) itrIn.next();
52
53             if( this.containsToken( ttIn.getToken() ) ) {       
54                 ttsOut.tokenTuples.add( ttIn.increaseArity() );
55             } else {
56                 ttsOut.tokenTuples.add( ttIn );
57             }
58         }
59
60         Iterator itrThis = this.iterator();
61         while( itrThis.hasNext() ) {
62             TokenTuple ttThis = (TokenTuple) itrThis.next();
63
64             if( !ttsIn.containsToken( ttThis.getToken() ) ) {
65                 ttsOut.tokenTuples.add( ttThis );
66             }
67         }
68         
69         return ttsOut.makeCanonical();
70     }
71     */
72
73     public boolean isEmpty() {
74         return tokenTuples.isEmpty();
75     }
76
77     public boolean containsTuple( TokenTuple tt ) {
78         return tokenTuples.contains( tt );
79     }
80
81     // only needs to be done if newSummary is true?  RIGHT?
82     public TokenTupleSet increaseArity( Integer token ) {
83         TokenTuple tt 
84             = new TokenTuple( token, true, TokenTuple.ARITY_ONE ).makeCanonical();
85         if( tokenTuples.contains( tt ) ) {
86             tokenTuples.remove( tt );
87             tokenTuples.add( 
88               new TokenTuple( token, true, TokenTuple.ARITY_MANY ).makeCanonical()
89                              );
90         }
91         
92         return makeCanonical();
93     }
94
95     public boolean equals( Object o ) {
96         if( !(o instanceof TokenTupleSet) ) {
97             return false;
98         }
99
100         TokenTupleSet tts = (TokenTupleSet) o;
101         return tokenTuples.equals( tts.tokenTuples );
102     }
103
104     public int hashCode() {
105         return tokenTuples.hashCode();
106     }
107
108     /*
109     public boolean equalWithoutArity( TokenTupleSet ttsIn ) {
110         Iterator itrIn = ttsIn.iterator();
111         while( itrIn.hasNext() ) {
112             TokenTuple ttIn = (TokenTuple) itrIn.next();
113
114             if( !this.containsToken( ttIn.getToken() ) )
115             {
116                 return false;
117             }
118         }
119
120         Iterator itrThis = this.iterator();
121         while( itrThis.hasNext() ) {
122             TokenTuple ttThis = (TokenTuple) itrThis.next();
123
124             if( !ttsIn.containsToken( ttThis.getToken() ) )
125             {
126                 return false;
127             }
128         }
129         
130         return true;
131     }
132     */
133
134     // this should be a hash table so we can do this by key
135     public boolean containsToken( Integer token ) {
136         Iterator itr = tokenTuples.iterator();
137         while( itr.hasNext() ) {
138             TokenTuple tt = (TokenTuple) itr.next();
139             if( token.equals( tt.getToken() ) ) {
140                 return true;
141             }
142         }
143         return false;
144     }
145
146     public String toString() {
147         return tokenTuples.toString();
148     }
149 }