// Path: src/com/infdot/analysis/solver/DataflowExpression.java
// public interface DataflowExpression<V> {
// 	/**
// 	 * Evaluates expression using the given variable values.
// 	 */
// 	V eval(V[] values);
// 	
// 	/**
// 	 * Helper to collect all variables,
// 	 */
// 	void collectVariables(Set<Integer> variables);
// }
// 
// Path: src/com/infdot/analysis/solver/DataflowVariable.java
// public class DataflowVariable<V>
// 	implements DataflowExpression<V> {
// 	
// 	private int id;
// 	private AbstractNode node;
// 	
// 	public DataflowVariable(int id, AbstractNode node) {
// 		this.id = id;
// 		this.node = node;
// 	}
// 
// 	@Override
// 	public V eval(V[] values) {
// 		return values[id];
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "[[" + node + "]]";
// 	}
// 
// 	@Override
// 	public void collectVariables(Set<Integer> variables) {
// 		variables.add(id);
// 	}
// 
// }
// 
// Path: src/com/infdot/analysis/util/StringUtil.java
// public class StringUtil {
// 	
// 	public static String join(Collection<?> col, String separator) {
// 		StringBuilder builder = new StringBuilder();
// 		
// 		boolean first = true;
// 		for (Object o : col) {
// 			if (first) {
// 				first = false;
// 			} else {
// 				builder.append(separator);
// 			}
// 			builder.append(o);
// 		}
// 		
// 		return builder.toString();
// 	}
// }


import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.infdot.analysis.solver.DataflowExpression;
import com.infdot.analysis.solver.DataflowVariable;
import com.infdot.analysis.util.StringUtil;
package com.infdot.analysis.solver.lattice.powerset;



/**
 * Union operator for powerset operator for powerset domain.
 * 
 * @author Raivo Laanemets
 *
 * @param <V> type of set element of set whose powerset is used.
 */
public class AllUnionOperation<V> implements DataflowExpression<Set<V>> {
	private List<DataflowVariable<Set<V>>> variables;

	public AllUnionOperation(List<DataflowVariable<Set<V>>> variables) {
		this.variables = variables;
	}

	@Override
	public Set<V> eval(Set<V>[] values) {
		Set<V> set = new HashSet<V>();
		
		for (DataflowVariable<Set<V>> v : variables) {
			set.addAll(v.eval(values));
		}
		
		return set;
	}

	@Override
	public String toString() {
// Path: src/com/infdot/analysis/solver/DataflowExpression.java
// public interface DataflowExpression<V> {
// 	/**
// 	 * Evaluates expression using the given variable values.
// 	 */
// 	V eval(V[] values);
// 	
// 	/**
// 	 * Helper to collect all variables,
// 	 */
// 	void collectVariables(Set<Integer> variables);
// }
// 
// Path: src/com/infdot/analysis/solver/DataflowVariable.java
// public class DataflowVariable<V>
// 	implements DataflowExpression<V> {
// 	
// 	private int id;
// 	private AbstractNode node;
// 	
// 	public DataflowVariable(int id, AbstractNode node) {
// 		this.id = id;
// 		this.node = node;
// 	}
// 
// 	@Override
// 	public V eval(V[] values) {
// 		return values[id];
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "[[" + node + "]]";
// 	}
// 
// 	@Override
// 	public void collectVariables(Set<Integer> variables) {
// 		variables.add(id);
// 	}
// 
// }
// 
// Path: src/com/infdot/analysis/util/StringUtil.java
// public class StringUtil {
// 	
// 	public static String join(Collection<?> col, String separator) {
// 		StringBuilder builder = new StringBuilder();
// 		
// 		boolean first = true;
// 		for (Object o : col) {
// 			if (first) {
// 				first = false;
// 			} else {
// 				builder.append(separator);
// 			}
// 			builder.append(o);
// 		}
// 		
// 		return builder.toString();
// 	}
// }


// Path: src/com/infdot/analysis/solver/lattice/powerset/AllUnionOperation.java
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.infdot.analysis.solver.DataflowExpression;
import com.infdot.analysis.solver.DataflowVariable;
import com.infdot.analysis.util.StringUtil;

package com.infdot.analysis.solver.lattice.powerset;



/**
 * Union operator for powerset operator for powerset domain.
 * 
 * @author Raivo Laanemets
 *
 * @param <V> type of set element of set whose powerset is used.
 */
public class AllUnionOperation<V> implements DataflowExpression<Set<V>> {
	private List<DataflowVariable<Set<V>>> variables;

	public AllUnionOperation(List<DataflowVariable<Set<V>>> variables) {
		this.variables = variables;
	}

	@Override
	public Set<V> eval(Set<V>[] values) {
		Set<V> set = new HashSet<V>();
		
		for (DataflowVariable<Set<V>> v : variables) {
			set.addAll(v.eval(values));
		}
		
		return set;
	}

	@Override
	public String toString() {
		return "U(" + StringUtil.join(variables, ",") + ")";