//------------------------------------------------------------
// $Id: mpi2ReaderClass.h,v 1.1.1.1 1999/11/25 06:26:12 yamauchi Exp $
//------------------------------------------------------------
// 	mpi2ReaderClass.h
//	for read (M\pi)^2 data file file headder
//	(M\pi)^2 data file is derived mgf data format
//
//	mpi2 data file を読むためのクラス
//	1996/6/10
//	21 March 1997 読み込みながらの送信と高速化
//	(C) Copyright Hitoshi YAMAUCHI
//	refer readfile.doc
//------------------------------------------------------------
#ifndef _mpi2ReaderClass_h
#define _mpi2ReaderClass_h 1

#include <stdio.h>
// #include <String.h> ... do not work on SP2
#include "myString.h"
#include "SLList.h"
#include "mpi2.h"
#include "constants.h"
#include "material.h"
#include "triangleObject.h"
#include "sphereObject.h"
#include "mpi2dataToken.h"

//------------------------------------------------------------
// mpi2ReaderClass 
//    mpi2 形式のファイルを読み込む
// このクラスの典型的な利用法:
//	mpi2ReaderClass mpi2reader;	// クラス作成
//	mpi2reader.open("filename");	// file open
//	do {
//	    tkn = mpi2reader.getOneLine(&tknum, str, retval);// 一行の情報取得
//	    // 行情報を利用する
//	} while(tkn != EOF_tkn);
//	mpi2reader.close();		// ファイル close
// 実際には define space 読み屋、material 読み屋、geometry 読み屋を作成する
//------------------------------------------------------------
const int MAX_LINE = 4096;

class mpi2ReaderClass {
private:
    mpi2ReaderClass(const mpi2ReaderClass& rhs);
    const mpi2ReaderClass& operator=(const mpi2ReaderClass& rhs);    

protected:
    FILE        *mpFp;
    myString 	mFilename;
    int		mReadLine;
    char 	mReadBuff[MAX_LINE]; // 読み込み用のバッファ
    int		mIdx;		     // buffer 中の処理位置
    
protected:
    int  getFirstTokenOfLine(void);
    YorN getRestDoublePart(int numberOfArgs, double retvals[]);
    void getNextString(char *pRetStr);
    
public:
    mpi2ReaderClass(void) : mpFp(NULL){};
    ~mpi2ReaderClass(void);

    // 読み込んだ line 数を返す
    int getReadLineNum(void) const { return(this->mReadLine); }
    // 一行読み込み、token と引数を返す
    int getOneLine(int *pNumOfToken, double retval[], char *pRetStr);
    
    // 読み込むファイルの指定(成功 YES: 失敗 NO)
    YorN open(const char *pFilename);
    
    // ファイルのクローズ(destruct 時には呼ばれる)
    YorN close(void);
};

//------------------------------------------------------------
// geometry file を読み込むためのクラス
//------------------------------------------------------------
class geoReaderClass {
private:
    geoReaderClass(const geoReaderClass& rhs);
    const geoReaderClass& operator=(const geoReaderClass& rhs);

protected:
    mpi2ReaderClass *mpGeoReader; // 読み込みクラス
    char **mppMatNameTable;	       // material table
    int	   mTableSize;		       // material table size
    int    mCurMatIdx;		       // 現在のコンテクストの material 番号
    materialClass *mpMatArray;	       // material の実体を参照するための ptr

protected:
    int getIdxOfmatTable(const char *pMatName);

public:
    geoReaderClass(void) : mpGeoReader(NULL), mppMatNameTable(NULL),
    mTableSize(-1), mCurMatIdx(-1), mpMatArray(NULL) {}

    YorN open(const char *pGeoFName, int tableSize, char **appMatNameTab,
	      materialClass *pMatArray);
    YorN close(void);
    int  getOneGeoData(objBaseClass **ppObject);
    int  getReadLineNum(void) const 
    { 
	return(this->mpGeoReader->getReadLineNum());
    }
};


//------------------------------------------------------------
// function for reading space information
//------------------------------------------------------------
YorN readDefSpcInfo(const char *pSpcFname,
		    Vector3 *pDefspcMin,  Vector3 *pDefspcMax, 
		    Vector3 *pPartVolMin, Vector3 *pPartVolMax, 
		    int     *pSpcDivNum);

//------------------------------------------------------------
// function for reading material information
//------------------------------------------------------------
YorN readMatInfo(const char *pMatFname, 
		 SLList < materialClass * > *pMatList);

#endif				// #ifndef _mpi2ReaderClass_h
