package jp.ac.takushoku_u.cs;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.Iterator;

/**
* MathEdgeクラスはEdgeSetの演算用クラスです。
* @version 1.0
* @author 笠島 裕史(Kasajima Hiroshi)
* @see jp.ac.takushoku_u.cs.Edge
* @see jp.ac.takushoku_u.cs.EdgeSet
*/
/*
* 最終更新日 2004年12月14日
*/
public class MathEdge{
	
/**
* コンストラクタ
*/
	private MathEdge(){}
	
/**
* setAとsetBの積集合(AND)を返します。
* @param setA 演算するEdgeSet
* @param setB 演算するEdgeSet
* @return 2つの積集合
*/
	public static EdgeSet getAndEdge(EdgeSet setA, EdgeSet setB){
		EdgeSet returnSet = new EdgeSet();
		
		Iterator i = setA.iterator();
    	while(i.hasNext()){
    		Edge ed = (Edge)i.next();
    		Iterator j = setB.iterator();
    		while(j.hasNext()){
    			Edge ef = (Edge)j.next();
    			if(ed.isSameEdge(ef)){
    				returnSet.add(new Edge(ed.getBegin(), ed.getEnd()));
    			}
    		}
    	}
		
		return returnSet;
	}
	
/**
* setAとsetBの和集合(OR)を返します。
* @param setA 演算するEdgeSet
* @param setB 演算するEdgeSet
* @return 2つの和集合
*/
	public static EdgeSet getOrEdge(EdgeSet setA, EdgeSet setB){
		EdgeSet returnSet = new EdgeSet();
		
		Iterator i = setA.iterator();
    	while(i.hasNext()){
    		Edge ed = (Edge)i.next();
    		returnSet.add(new Edge(ed.getBegin(), ed.getEnd()));
    	}
    		
    	Iterator j = setB.iterator();
    	while(j.hasNext()){
    		Edge ef = (Edge)j.next();
    		returnSet.add(new Edge(ef.getBegin(), ef.getEnd()));
    	}
		
		return returnSet;
	}
	
/**
* setAまたsetBいずれか一方にしかない要素の集合(XOR)を返します。
* @param setA 演算するEdgeSet
* @param setB 演算するEdgeSet
* @return 2つの排他的論理和の集合
*/
	public static EdgeSet getXOrEdge(EdgeSet setA, EdgeSet setB){
		EdgeSet returnSet = new EdgeSet();
		
		Iterator i = setA.iterator();
    	while(i.hasNext()){
    		Edge ed = (Edge)i.next();
    		
    		Iterator j = setB.iterator();
    		boolean flag = true;
    		while(j.hasNext()){
    			Edge ef = (Edge)j.next();
    			if(ed.isSameEdge(ef)){
    				flag = false;
    			}
    		}
    		if(flag){
    			returnSet.add(new Edge(ed.getBegin(), ed.getEnd()));
    		}
    	}
		
		i = setB.iterator();
    	while(i.hasNext()){
    		Edge ed = (Edge)i.next();
    		
    		Iterator j = setA.iterator();
    		boolean flag = true;
    		while(j.hasNext()){
    			Edge ef = (Edge)j.next();
    			if(ed.isSameEdge(ef)){
    				flag = false;
    			}
    		}
    		if(flag){
    			returnSet.add(new Edge(ed.getBegin(), ed.getEnd()));
    		}
    	}
		
		return returnSet;
	}
	
/**
* setAにしか存在しない要素の集合(差集合)を返します。
* @param setA 演算するEdgeSet
* @param setB 演算するEdgeSet
* @return setAにしか存在しない要素の集合
*/
	public static EdgeSet getSubEdge(EdgeSet setA, EdgeSet setB){
		EdgeSet returnSet = new EdgeSet();
		
		Iterator i = setA.iterator();
    	while(i.hasNext()){
    		Edge ed = (Edge)i.next();
    		
    		Iterator j = setB.iterator();
    		boolean flag = true;
    		while(j.hasNext()){
    			Edge ef = (Edge)j.next();
    			if(ed.isSameEdge(ef)){
    				flag = false;
    			}
    		}
    		if(flag){
    			returnSet.add(new Edge(ed.getBegin(), ed.getEnd()));
    		}
    	}
		
		return returnSet;
	}
}