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

/**
* EdgeSetクラスはグラフの枝を集合として保持するためのクラスです。<BR>
* Edge を集合として扱えるよう Java.util.HashSet を改良したクラスです。
* このクラスのコンストラクタとメソッドは継承している HashSet と同じものです。
* @version 1.0
* @author 笠島 裕史(Kasajima Hiroshi)
* @see jp.ac.takushoku_u.cs.Edge
* @see jp.ac.takushoku_u.cs.MathEdge
*/
/*
* 最終更新日 2004年12月07日
*/
public class EdgeSet extends HashSet{
	
/**
* 新しい空のセットを作成します。
* 基となる HashMap のインスタンスはデフォルトの初期容量 (16) および負荷係数 (0.75) を持ちます。 
*/
	public EdgeSet(){
		super();
	}
	
/**
* 指定されたコレクションの要素を格納する新規セットを作成します。
* デフォルトの負荷係数 (0.75) 、および指定されたコレクションの要素を格納するのに十分な初期容量により、HashMap は作成されます。
* @param c 要素がセットに配置されるコレクション
* @exception NullPointerException 指定されたコレクションが null である場合
*/
	public EdgeSet(Collection c){
		super(c);
	}
	
/**
* 新しい空のセットを作成します。
* 基となる HashMap のインスタンスは、指定された初期容量およびデフォルトの負荷係数 (0.75) を持ちます。
* @param initialCapacity ハッシュテーブルの初期容量
* @exception IllegalArgumentException 初期容量が 0 より小さい場合
*/
	public EdgeSet(int initialCapacity){
		super(initialCapacity);
	}
	
/**
* 新しい空のセットを作成します。
* 基となる HashMap のインスタンスは指定された初期容量および指定された負荷係数を持ちます。
* @param initialCapacity ハッシュマップの初期容量
* @param loadFactor ハッシュマップの負荷係数
* @exception IllegalArgumentException 初期容量が 0 より小さいか、負荷係数が正の値ではない場合
*/
	public EdgeSet(int initialCapacity, float loadFactor){
		super(initialCapacity, loadFactor);
	}
	
	
/**
* 指定された要素がセットの要素として存在しない場合に、その要素をセットに追加します。 
* @param o セットに追加される要素
* @return セットが指定された要素を保持していなかった場合は true
*/
	public boolean add(Object o){
		Edge ed = new Edge();
		Edge ef = new Edge();
		ef = (Edge)o;
		boolean flag = true;
		Iterator i = iterator();
    	while(i.hasNext()){
    		ed = (Edge)i.next();
    		if(ef.getBegin() == ed.getBegin() &&
    			ef.getEnd() == ed.getEnd()){
    				flag = false;
    		}
    	}
		if(flag){
			super.add(o);
		}
		return flag;
	}
	
/**
* すべての要素をセットから削除します。
*/
	public void clear(){
		super.clear();
	}
	
/**
* EdgeSet のインスタンスのシャローコピーを返します。要素自体は複製されません。
* @return このセットのシャローコピー
*/
	public Object clone(){
		return super.clone();
	}
	
/**
* セットが、指定された要素を保持している場合に true を返します。
* @param o セットにあるかどうかを調べる要素
* @return セットが、指定された要素を保持している場合は true
*/
	public boolean contains(Object o){
		Edge ed = new Edge();
		Edge ef = new Edge();
		ef = (Edge)o;
		boolean flag = false;
		Iterator i = iterator();
    	while(i.hasNext()){
    		ed = (Edge)i.next();
    		if(ef.getBegin() == ed.getBegin() &&
    			ef.getEnd() == ed.getEnd()){
    				flag = true;
    		}
    	}
		return flag;
	}
	
/**
* セットが要素を 1 つも保持していない場合に true を返します。
* @return セットが要素を 1 つも保持していない場合は true
*/
	public boolean isEmpty(){
		return super.isEmpty();
	}
	
/**
* セットの要素の反復子を返します。要素が返されるときに特定の順序はありません。
* @return セットの要素の Iterator
*/
	public Iterator iterator(){
		return super.iterator();
	}
	
/**
* 指定された要素があればセットから削除します。 
* @param o セットにあれば削除されるオブジェクト
* @return 指定された要素がセット内にあった場合は true
*/
	public boolean remove(Object o){
		Edge ed = new Edge();
		Edge ef = new Edge();
		ef = (Edge)o;
		boolean flag = false;
		Iterator i = iterator();
    	while(i.hasNext()){
    		ed = (Edge)i.next();
    		if(ef.getBegin() == ed.getBegin() &&
    			ef.getEnd() == ed.getEnd()){
    				i.remove();
    				flag = true;
    		}
    	}
		return flag;
	}
	
/**
* セット内の要素数を返します。 
* @return セット内の要素数
*/
	public int size(){
		return super.size();
	}
	
}