00001 #ifndef _KISEN_H
00002 #define _KISEN_H
00003
00004 #include "osl/record/record.h"
00005 #include "osl/state/numEffectState.h"
00006 #include "osl/misc/carray.h"
00007 #include <string>
00008 #include <iosfwd>
00009 #include <fstream>
00010 namespace osl
00011 {
00012 namespace record
00013 {
00014 class KisenUtils{
00015 public:
00016 static Position convertPosition( int pos );
00017 static Move convertMove(state::SimpleState const& state,int c0,int c1 );
00018 static int convertPosition(Position pos);
00019 };
00020
00021 class IKisenStream : public IRecordStream{
00022 private:
00023 CArray<unsigned char, 512> cbuf;
00024 state::SimpleState state;
00025 RecordVisitor rv;
00026 public:
00027 IKisenStream(char const readbuf[]) : state(HIRATE) {
00028 std::copy(&readbuf[0],&readbuf[512],&cbuf[0]);
00029 }
00030 state::SimpleState getState() const { return state;}
00031 virtual void load(Record*);
00032 virtual ~IKisenStream(){};
00033 };
00038 class KisenFile{
00039 private:
00040 std::ifstream ifs;
00041 size_t numberOfGames;
00042 state::SimpleState const initialState;
00043 const std::string fileName;
00044 public:
00045 static const size_t maxMoves=256;
00046 explicit KisenFile(const std::string& fileName);
00047 ~KisenFile();
00048
00049 size_t size() const{ return numberOfGames; }
00050 const NumEffectState getInitialState() const{ return NumEffectState(initialState); }
00051 const vector<Move> getMoves(size_t index);
00052 const std::string& getFileName() const { return fileName; }
00053 const std::string ipxFileName() const { return ipxFileName(fileName); }
00054 static const std::string ipxFileName(const std::string&);
00055 };
00061 class KisenIpxFile{
00062 std::ifstream ifs;
00063 size_t numberOfGames;
00064 const std::string file_name;
00065 public:
00066 enum{
00067 BY_PARITY=0,
00068 BLACK_WIN=1,
00069 WHITE_WIN=2,
00070 SENNNICHITE=3,
00071 JISHOGI=4,
00072 BLACK_WIN_256=5,
00073 WHITE_WIN_256=6,
00074 SENNNICHITE_256=7,
00075 JISHOGI_256=8,
00076 };
00077 explicit KisenIpxFile(std::string const& fileName);
00078 ~KisenIpxFile();
00079
00080 size_t size() const{ return numberOfGames; }
00081 const std::string getPlayer(size_t index,Player pl);
00082 const std::string getTitle(size_t index,Player pl);
00083 unsigned int getRating(size_t index,Player pl);
00084 unsigned int getResult(size_t index);
00085 const std::string& getFileName() const { return file_name; }
00086 };
00091 class KisenPlusFile{
00092 private:
00093 std::ifstream ifs;
00094 size_t numberOfGames;
00095 SimpleState const initialState;
00096 public:
00097 static const size_t maxMoves=256;
00098 explicit KisenPlusFile(const std::string& fileName);
00099 size_t size() const{ return numberOfGames; }
00100 SimpleState const& getInitialState() const{ return initialState; }
00101 const vector<Move> getMoves(size_t index);
00102 void getMoves(size_t index, vector<Move>&, vector<int>&);
00103 };
00104
00105 class OKisenStream : public ORecordStream {
00106 public:
00107 OKisenStream(std::ostream &ostream) : os(ostream) { }
00108 void save(SimpleState state, const vector<Move> &moves);
00109 virtual void save(Record *);
00110 virtual ~OKisenStream() { }
00111 private:
00112 std::ostream &os;
00113 };
00114
00121 class KisenIpxWriter
00122 {
00123 public:
00124 KisenIpxWriter(std::ostream &ostream) : os(ostream) { }
00125 void save(const Record &,
00126 int black_rating, int white_rating,
00127 const std::string &black_title,
00128 const std::string &white_title);
00129 private:
00130 void writeString(const std::string &name, size_t length);
00131 void writeRating(int rating);
00132 std::ostream &os;
00133 };
00134 }
00135 using record::KisenFile;
00136 using record::KisenIpxFile;
00137 }
00138 #endif // _KISEN_H
00139
00140
00141
00142