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

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