historyState.cc
Go to the documentation of this file.
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:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines