public Set possibleTypes() {
   if (subsets == null) {
     return Collections.EMPTY_SET;
   }
   HashSet ret = new HashSet();
   for (Iterator subsetIt = subsets.iterator(); subsetIt.hasNext(); ) {
     final PointsToSet subset = (PointsToSet) subsetIt.next();
     ret.addAll(subset.possibleTypes());
   }
   return ret;
 }
 public boolean addAll(PointsToSet s) {
   boolean ret = false;
   if (subsets == null) subsets = new HashSet();
   if (s instanceof Union) {
     MemoryEfficientRasUnion meru = (MemoryEfficientRasUnion) s;
     if (meru.subsets == null || subsets.containsAll(meru.subsets)) {
       return false;
     }
     return subsets.addAll(meru.subsets);
   } else {
     PointsToSet r = (PointsToSet) s;
     return subsets.add(s);
   }
 }