package jp.ac.takushoku_u.cs;
import java.io.FileReader;
import java.io.BufferedReader;

/**
* MatrixReaderクラスはファイルから正方のArithmeticMatrixやBooleanMatrixを生成するクラスです。
* 読み込むファイルの書式は1行目に生成するマトリクスの大きさ<BR>
* 2行目以降に値を設定する要素の行番号、半角スペース、列番号の順となります。<BR>
* なお、ここでいう要素の行番号と列番号は1から始まる番号です。(0から始まるMatrixとは異なります。)<BR><BR>
* ファイルの書式例<BR>
* 13<BR>
* 1 8<BR>
* 5 7<BR><BR>
* この場合13行13列のMatrixが生成され、Matrixの要素(0,7)と(4,6)に値が設定されます。
* @version 1.0
* @author 笠島 裕史(Kasajima Hiroshi)
*/
/*
* 最終更新日 2004年12月07日
*/
public final class MatrixReader{
	
/**
* 読み込んだ要素に設定する定数
*/
	private static final double READER_DOUBLE_TRUE = 1.0;
	
/**
* 読み込んだ要素に設定する定数
*/
	private static final boolean READER_BOOLEAN_TRUE = true;
	
/**
* コンストラクタ
*/
	private MatrixReader(){
	}
	
/**
* ファイルから読み込んだ値で設定したArithmeticMatrixを返します。
* 読み込んだ要素に1.0を設定します。その他の値は0.0となります。
* @param fileName 読み込むファイル名
* @return 設定したArithmeticMatrix
* @exception NotElementException ファイルで読み込んだ点が存在しない場合
* @throws java.io.FileNotFoundException ファイルが開けなかった場合
* @throws java.io.IOException 何らかの出入力例外が発生した場合
*/
	public static final ArithmeticMatrix getArithmeticMatrixReader(String fileName) throws java.io.FileNotFoundException, java.io.IOException{
		FileReader fr;
		ArithmeticMatrix mat;
		
		try{
			fr = new FileReader(fileName);
			BufferedReader in = new BufferedReader(fr);
			String s;
			int row;
			int col;
			boolean flag;
			
			s = in.readLine();
			mat = new ArithmeticMatrix(Integer.parseInt(s), Integer.parseInt(s), 1);
			
			while((s = in.readLine()) != null){
				row = 0;
				col = 0;
				flag = true;
				for(int i = 0;i < s.length();i++){
					if(s.charAt(i) != ' ' && flag){
						row = row * 10 + Character.getNumericValue(s.charAt(i));
					}
					else if(s.charAt(i) != ' ' && (flag == false)){
						col = col * 10 + Character.getNumericValue(s.charAt(i));
					}
					else{
						flag = false;
					}
				}
				mat.setCell(row-1, col-1, READER_DOUBLE_TRUE);
			}
			
			
		}
		catch(NotElementException e){
			throw new NotElementException(e+"");
		}
		
		return mat;
	}
	
/**
* ファイルから読み込んだ値で設定したArithmeticMatrixを返します。
* 読み込んだ要素に value を設定します。その他の値は0.0となります。
* @param fileName 読み込むファイル名
* @param value 設定する値
* @return 設定したArithmeticMatrix
* @exception NotElementException ファイルで読み込んだ点が存在しない場合
* @throws java.io.FileNotFoundException ファイルが開けなかった場合
* @throws java.io.IOException 何らかの出入力例外が発生した場合
*/
	public static final ArithmeticMatrix getArithmeticMatrixReader(String fileName, double value) throws java.io.FileNotFoundException, java.io.IOException{
		FileReader fr;
		ArithmeticMatrix mat;
		
		try{
			fr = new FileReader(fileName);
			BufferedReader in = new BufferedReader(fr);
			String s;
			int row;
			int col;
			boolean flag;
			
			s = in.readLine();
			mat = new ArithmeticMatrix(Integer.parseInt(s), Integer.parseInt(s), 1);
			
			while((s = in.readLine()) != null){
				row = 0;
				col = 0;
				flag = true;
				for(int i = 0;i < s.length();i++){
					if(s.charAt(i) != ' ' && flag){
						row = row * 10 + Character.getNumericValue(s.charAt(i));
					}
					else if(s.charAt(i) != ' ' && (flag == false)){
						col = col * 10 + Character.getNumericValue(s.charAt(i));
					}
					else{
						flag = false;
					}
				}
				mat.setCell(row-1, col-1, value);
			}
			
			
		}
		catch(NotElementException e){
			throw new NotElementException(e+"");
		}
		
		return mat;
	}
	
/**
* ファイルから読み込んだ値で設定したBooleanMatrixを返します。
* 読み込んだ要素に true を設定します。その他の値は false になります。
* @param fileName 読み込むファイル名
* @return 設定したArithmeticMatrix
* @exception NotElementException ファイルで読み込んだ点が存在しない場合
* @throws java.io.FileNotFoundException ファイルが開けなかった場合
* @throws java.io.IOException 何らかの出入力例外が発生した場合
*/
	public static final BooleanMatrix getBooleanMatrixReader(String fileName) throws java.io.FileNotFoundException, java.io.IOException{
		FileReader fr;
		BooleanMatrix mat;
		
		try{
			fr = new FileReader(fileName);
			BufferedReader in = new BufferedReader(fr);
			String s;
			int row;
			int col;
			boolean flag;
			
			s = in.readLine();
			mat = new BooleanMatrix(Integer.parseInt(s), Integer.parseInt(s), 1);
			
			while((s = in.readLine()) != null){
				row = 0;
				col = 0;
				flag = true;
				for(int i = 0;i < s.length();i++){
					if(s.charAt(i) != ' ' && flag){
						row = row * 10 + Character.getNumericValue(s.charAt(i));
					}
					else if(s.charAt(i) != ' ' && (flag == false)){
						col = col * 10 + Character.getNumericValue(s.charAt(i));
					}
					else{
						flag = false;
					}
				}
				mat.setCell(row-1, col-1, READER_BOOLEAN_TRUE);
			}
			
			
		}
		catch(NotElementException e){
			throw new NotElementException(e+"");
		}
		
		return mat;
	}
}