package jp.ac.takushoku_u.cs;

/**
* Edgeクラスはグラフの枝を保持するクラスです。<BR>
* @version 1.0.1
* @author 笠島 裕史(Kasajima Hiroshi)
* @see EdgeSet
* @see MathEdge
*/
/*
* 最終更新日 2004年12月07日
*/
public class Edge{
	
/**
* 枝の始点の要素番号
*/
	private int start;
	
/**
* 枝の終点の要素番号
*/
	private int goal;
	
/**
* 初期要素番号
*/
	private static final int INITIALIZE_BEGIN_ELEMENT = 0;
	
/**
* 初期要素番号
*/
	private static final int INITIALIZE_END_ELEMENT = 1;
	
/**
* デフォルトの要素で枝を設定します。
* 始点0、終点1で設定されます。
*/
	public Edge(){
		setBegin(INITIALIZE_BEGIN_ELEMENT);
		setEnd(INITIALIZE_END_ELEMENT);
	}
	
/**
* 枝を設定します。
* @param begin 枝の始点
* @param end 枝の終点
* @exception NegativeValueException 指定された要素番号が負である場合
* @exception IllegalRelationValuesException 始点と終点が同一の要素番号である場合
*/
	public Edge(int begin, int end){
		setBegin(begin);
		setEnd(end);
		if(begin == end){
			throw new IllegalRelationValuesException("Relation("+ begin +","+ end +")");
		}
	}
	
/**
* 枝の始点の要素を返します。
* @return 枝の始点要素
*/
	public int getBegin(){
		return start;
	}
/**
* 枝の終点の要素を返します。
* @return 枝の終点要素
*/
	public int getEnd(){
		return goal;
	}
	
/**
* 指定されたEdgeは同じ枝を表しているかを比較します。
* @param ed 比較するEdge
* @return 同じ枝を表していれば true
*/
	public boolean isSameEdge(Edge ed){
		return (getBegin() == ed.getBegin()) && (getEnd() == ed.getEnd());
	}
	
/**
* 枝の始点の設定をします。
* @param begin 始点の要素
* @exception NegativeValueException 指定された要素番号が負である場合
*/
	private void setBegin(int begin){
		if(begin >= 0){
			start = begin;
		}
		else{
			throw new NegativeValueException("begin("+begin+")");
		}
	}
/**
* 枝の終点の設定をします。
* @param end 終点の要素
* @exception NegativeValueException 指定された要素番号が負である場合
*/
	private void setEnd(int end){
		if(end >= 0){
			goal = end;
		}
		else{
			throw new NegativeValueException("end("+ end +")");
		}
	}
	
/**
* 指定された値は負ではないかチェックします。
* @param value チェックする値
* @return 値が正または0であれば true
*/
	private boolean isPositive(int value){
		return value >= 0;
	}
}