00001 /* historyState.cc 00002 */ 00003 #include "osl/state/historyState.h" 00004 00005 osl::state::HistoryState::HistoryState() 00006 : dirty(false) 00007 { 00008 assert(current.isConsistent()); 00009 assert(initial_state.isConsistent()); 00010 } 00011 00012 osl::state::HistoryState::HistoryState(const SimpleState& initial) 00013 : initial_state(initial), current(initial), dirty(false) 00014 { 00015 assert(current.isConsistent()); 00016 assert(initial_state.isConsistent()); 00017 } 00018 00019 osl::state::HistoryState::~HistoryState() 00020 { 00021 } 00022 00023 void osl::state::HistoryState::setRoot(const SimpleState& initial) 00024 { 00025 initial_state = current = NumEffectState(initial); 00026 moves.clear(); 00027 dirty = false; 00028 } 00029 00030 void osl::state::HistoryState::makeMove(Move move) 00031 { 00032 if (dirty) 00033 update(); 00034 moves.push_back(move); 00035 current.makeMove(move); 00036 } 00037 00038 void osl::state::HistoryState::unmakeMove() 00039 { 00040 dirty = true; 00041 moves.pop_back(); 00042 } 00043 00044 void osl::state::HistoryState::makeMovePass() 00045 { 00046 makeMove(Move::PASS(state().turn())); 00047 } 00048 00049 void osl::state::HistoryState::unmakeMovePass() 00050 { 00051 assert(! moves.empty() && moves.back().isPass()); 00052 if (! dirty) { 00053 moves.pop_back(); 00054 current.changeTurn(); 00055 return; 00056 } 00057 unmakeMove(); 00058 } 00059 00060 void osl::state::HistoryState::update() const 00061 { 00062 current = initial_state; 00063 for (size_t i=0; i<moves.size(); ++i) 00064 current.makeMove(moves[i]); 00065 dirty = false; 00066 } 00067 00068 // ;;; Local Variables: 00069 // ;;; mode:c++ 00070 // ;;; c-basic-offset:2 00071 // ;;; End: