00001 #ifndef _RECORD_H
00002 #define _RECORD_H
00003 #include "osl/record/searchInfo.h"
00004 #include "osl/move.h"
00005 #include "osl/state/simpleState.h"
00006 #include "osl/misc/carray.h"
00007 #include <boost/ptr_container/ptr_vector.hpp>
00008 #include <iosfwd>
00009
00010 namespace osl
00011 {
00012 namespace record
00013 {
00014 class Record;
00015 class IRecordStream{
00016 public:
00017 virtual void load(Record*)=0;
00018 virtual ~IRecordStream();
00019 private:
00020 };
00021 class ORecordStream{
00022 public:
00023 virtual void save(Record*)=0;
00024 virtual ~ORecordStream();
00025 private:
00026 };
00027
00028 enum NodeType{
00029 MOVE,
00030 TORYO,
00031 MATTA,
00032 CHUDAN,
00033 SENNICHITE,
00034 JISHOGI,
00035 TSUMI,
00036 FUZUMI,
00037 ERROR,
00038 KACHI,
00039 HIKIWAKE,
00040 };
00041
00047 class MoveRecord{
00048 private:
00049 Move move;
00050 int nodeIndex;
00051 int time;
00052 std::string comment;
00053 public:
00054 SearchInfo info;
00055
00056 MoveRecord(const Move& mv, int ni);
00057 const Move getMove() const;
00058 int getNodeIndex() const;
00059 void setTime(int t);
00060 int getTime() const{ return time; }
00061 void setComment(const std::string& com){ comment=com; }
00062 const std::string& getComment() const{ return comment; }
00063 };
00064
00065 class NodeRecord{
00066 private:
00067 NodeType type;
00068 vector<int> moves;
00069 std::string comment;
00070 public:
00071 NodeRecord():type(MOVE){}
00072 NodeType getType() const{ return type; }
00073 int size() const { return moves.size(); }
00074 int at(int index) const{ return moves.at(index); }
00075 void setComment(const std::string& com){ comment=com; }
00076 const std::string& getComment() const{ return comment; }
00077 void addMoveRecord(int moveIndex);
00078 };
00079
00080 class Record{
00081 private:
00082 std::string version;
00083 CArray<std::string,2> playerNames;
00084 vector<NodeRecord> nrs;
00085 vector<MoveRecord> mrs;
00086 SimpleState initialState;
00087 public:
00088 Record();
00089 void init();
00090 void setVersion(const std::string& str);
00091 const std::string& getVersion() const;
00092 void setPlayer(Player player,const std::string& str);
00093 const std::string& getPlayer(Player player) const;
00094 void setInitialState(const SimpleState& state);
00095 SimpleState const& getInitialState() const;
00096 int addNodeRecord();
00097 int addMoveRecord(const MoveRecord& moveRecord);
00098 NodeRecord* nodeOf(int index);
00099 NodeRecord& operator[](int index);
00100 MoveRecord* moveOf(int index);
00101 void load(IRecordStream&);
00102 void save(ORecordStream&);
00103 const vector<Move> getMoves() const;
00104 void getMoves(vector<Move>&, vector<int>&) const;
00105 void getMoves(vector<Move>&, vector<int>&, vector<std::string>&,
00106 vector<SearchInfo>&) const;
00107 const NodeRecord* nodeOf(int index) const;
00108 const MoveRecord* moveOf(int index) const;
00109 };
00110
00111 class RecordVisitor;
00112
00113 class RecordVisitorObserver {
00114 public:
00115 virtual ~RecordVisitorObserver() {}
00116 virtual void update(RecordVisitor* rv) = 0;
00117 };
00118
00119 class RecordVisitor{
00120 private:
00121 Record* rec;
00122 SimpleState* state;
00123 int lastMoveIndex;
00124 int nodeIndex;
00125 boost::ptr_vector<RecordVisitorObserver> observers;
00126 public:
00127 RecordVisitor():rec(NULL),state(NULL),lastMoveIndex(0),nodeIndex(0){}
00128 RecordVisitor(Record& r);
00129 ~RecordVisitor();
00130
00131 SimpleState *getState() const{ return state; }
00132 void setState(SimpleState *s){ state=s;}
00133 Record *getRecord() { return rec; }
00134 void setRecord(Record *r){ rec=r;}
00135 MoveRecord *getLastMove(){ return rec->moveOf(lastMoveIndex); }
00136 void addMoveAndAdvance(Move move);
00137 NodeRecord *getNode(){ return rec->nodeOf(nodeIndex); }
00138 void addObserver(RecordVisitorObserver *observer)
00139 { observers.push_back(observer); }
00140 };
00141
00142 std::ostream& operator<<(std::ostream&,const MoveRecord &);
00143 std::ostream& operator<<(std::ostream&,Record &);
00144
00145 int readInt(std::istream& is);
00146 void writeInt(std::ostream& os, int n);
00147 }
00148 using record::Record;
00149 }
00150 #endif
00151
00152
00153
00154