package soot.spl.ifds;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
/**
* Contains functions to lazily compute the power set of some set.
*/
public class Powerset {
public static <T> Iterable<Set<T>> powerset(final Set<T> set) {
return powerset(set, true);
}
public static <T> Iterable<Set<T>> powerset(final Set<T> set, final boolean includeEmptySet) {
return new Iterable<Set<T>>() {
final Iterator<Set<T>> ITER = new PowerSetIterator<T>(set, includeEmptySet);
@Override
public Iterator<Set<T>> iterator() {
return ITER;
}
};
}
private static class PowerSetIterator<T> implements Iterator<Set<T>> {
private final List<T> list;
private final int powerTwo;
private int cursor;
private PowerSetIterator(Set<T> set, boolean includeEmptySet) {
cursor = includeEmptySet ? 0 : 1;
list = new ArrayList<T>(set);
powerTwo = (int) Math.pow(2,set.size());
}
@Override
public boolean hasNext() {
return cursor < powerTwo;
}
@Override
public Set<T> next() {
Set<T> set = new HashSet<T>();
for (int i = 0; i < list.size(); i++) {
if ((cursor>>i & 1)!=0)
set.add(list.get(i));
}
cursor++;
return set;
}
@Override
public void remove() {
throw new UnsupportedOperationException("Cannot remove elements using this iterator.");
}
}
// public static void main(String[] args) {
// for(Set<K> set: powerset(new HashSet<K>(Arrays.asList(K.values())),false)) {
// System.err.println(set);
// }
// }
//
// enum K {A,B,C}
}