1 package Analysis.OwnershipAnalysis;
9 public class ReachabilitySet extends Canonical {
11 private HashSet<TokenTupleSet> possibleReachabilities;
13 public ReachabilitySet() {
14 possibleReachabilities = new HashSet<TokenTupleSet>();
17 public ReachabilitySet( TokenTupleSet tts ) {
19 possibleReachabilities = new HashSet<TokenTupleSet>();
20 possibleReachabilities.add( tts );
23 public ReachabilitySet( TokenTuple tt ) {
24 this( new TokenTupleSet( tt ) );
27 public ReachabilitySet( ReachabilitySet rs ) {
29 possibleReachabilities = (HashSet<TokenTupleSet>) rs.possibleReachabilities.clone(); // again, DEEP COPY?!
32 public ReachabilitySet makeCanonical() {
33 return (ReachabilitySet) Canonical.makeCanonical( this );
36 public boolean contains( TokenTupleSet tts ) {
38 return possibleReachabilities.contains( tts );
41 public Iterator iterator() {
42 return possibleReachabilities.iterator();
45 public ReachabilitySet union( ReachabilitySet rsIn ) {
48 ReachabilitySet rsOut = new ReachabilitySet( this );
49 rsOut.possibleReachabilities.addAll( rsIn.possibleReachabilities );
50 return rsOut.makeCanonical();
53 public ReachabilitySet union( TokenTupleSet ttsIn ) {
56 ReachabilitySet rsOut = new ReachabilitySet( this );
57 rsOut.possibleReachabilities.add( ttsIn );
58 return rsOut.makeCanonical();
61 public ReachabilitySet intersection( ReachabilitySet rsIn ) {
64 ReachabilitySet rsOut = new ReachabilitySet();
66 Iterator i = this.iterator();
67 while( i.hasNext() ) {
68 TokenTupleSet tts = (TokenTupleSet) i.next();
69 if( rsIn.possibleReachabilities.contains( tts ) ) {
70 rsOut.possibleReachabilities.add( tts );
74 return rsOut.makeCanonical();
77 public ChangeTupleSet unionUpArity( ReachabilitySet rsIn ) {
80 ChangeTupleSet ctsOut = new ChangeTupleSet();
82 Iterator itrO = this.iterator();
83 while( itrO.hasNext() ) {
84 TokenTupleSet o = (TokenTupleSet) itrO.next();
86 Iterator itrR = rsIn.iterator();
87 while( itrR.hasNext() ) {
88 TokenTupleSet r = (TokenTupleSet) itrR.next();
90 TokenTupleSet theUnion = new TokenTupleSet();
92 Iterator itrRelement = r.iterator();
93 while( itrRelement.hasNext() ) {
94 TokenTuple e = (TokenTuple) itrRelement.next();
96 if( o.containsToken( e.getToken() ) ) {
97 theUnion = theUnion.union( new TokenTupleSet( e.increaseArity() ) ).makeCanonical();
99 theUnion = theUnion.union( new TokenTupleSet( e ) ).makeCanonical();
103 Iterator itrOelement = o.iterator();
104 while( itrOelement.hasNext() ) {
105 TokenTuple e = (TokenTuple) itrOelement.next();
107 if( !theUnion.containsToken( e.getToken() ) ) {
108 theUnion = theUnion.union( new TokenTupleSet( e ) ).makeCanonical();
112 if( !theUnion.isEmpty() ) {
113 ctsOut = ctsOut.union(
114 new ChangeTupleSet( new ChangeTuple( o, theUnion ) )
120 return ctsOut.makeCanonical();
124 public boolean equals( Object o ) {
125 if( !(o instanceof ReachabilitySet) ) {
129 ReachabilitySet rs = (ReachabilitySet) o;
130 return possibleReachabilities.equals( rs.possibleReachabilities );
133 public int hashCode() {
134 return possibleReachabilities.hashCode();
138 public String toStringEscapeNewline() {
141 Iterator i = this.iterator();
142 while( i.hasNext() ) {
143 s += "\\n "+i.next();
151 public String toString() {
154 Iterator i = this.iterator();
155 while( i.hasNext() ) {