00001 /* doUndoMoveStack.h 00002 */ 00003 #ifndef _DOUNDOMOVESTACK_H 00004 #define _DOUNDOMOVESTACK_H 00005 00006 #include "osl/move.h" 00007 #include "osl/apply_move/doUndoMoveLock.h" 00008 #include "osl/stl/stack.h" 00009 00010 namespace osl 00011 { 00012 namespace apply_move 00013 { 00014 template <class State> 00015 class DoUndoMoveStack 00016 { 00017 stack<DoUndoMoveLock*> move_stack; 00018 int memory_emergency; 00019 public: 00020 DoUndoMoveStack(); 00021 ~DoUndoMoveStack(); 00022 void push(State& s, Move m) 00023 { 00024 DoUndoMoveLock *l = new DoUndoMoveLock(s, m); 00025 move_stack.push(l); 00026 } 00027 void pop() 00028 { 00029 DoUndoMoveLock *l = move_stack.top(); 00030 delete l; 00031 move_stack.pop(); 00032 } 00033 void clear() 00034 { 00035 while (! move_stack.empty()) 00036 pop(); 00037 } 00038 void setEmergency() 00039 { 00040 memory_emergency = true; 00041 } 00042 bool empty() const { return move_stack.empty(); } 00043 }; 00044 00045 template <class State> 00046 DoUndoMoveStack<State>::DoUndoMoveStack() 00047 : memory_emergency(false) 00048 { 00049 } 00050 template <class State> 00051 DoUndoMoveStack<State>::~DoUndoMoveStack() 00052 { 00053 if (! memory_emergency) 00054 clear(); 00055 } 00056 00057 } // namespace apply_move 00058 using apply_move::DoUndoMoveStack; 00059 } // namespace osl 00060 00061 #endif /* _DOUNDOMOVESTACK_H */ 00062 // ;;; Local Variables: 00063 // ;;; mode:c++ 00064 // ;;; c-basic-offset:2 00065 // ;;; End: