00001
00002
00003 #ifndef _BOARD_BIT_EFFECT_H
00004 #define _BOARD_BIT_EFFECT_H
00005 #include "osl/applyDoUndoXMove.h"
00006 #include "osl/boardBitMask.h"
00007 namespace osl
00008 {
00009 namespace effect
00010 {
00017 template<class State>
00018 class BoardBitEffect : public State{
00019 typedef BoardBitEffect<State> BoardBitState;
00020 friend class ApplyDoUndoSimpleMove<BLACK,BoardBitState>;
00021 friend class ApplyDoUndoCaptureMove<BLACK,BoardBitState>;
00022 friend class ApplyDoUndoDropMove<BLACK,BoardBitState>;
00023 friend class ApplyDoUndoSimpleMove<WHITE,BoardBitState>;
00024 friend class ApplyDoUndoCaptureMove<WHITE,BoardBitState>;
00025 friend class ApplyDoUndoDropMove<WHITE,BoardBitState>;
00026 public:
00027 BoardBitMask emptyMask;
00028 typedef BoardBitEffect effect_state_t;
00029 template<typename OrigState>
00030 explicit BoardBitEffect(OrigState& st) :State(st),emptyMask(st){
00031 }
00035 explicit BoardBitEffect() {
00036 }
00037 };
00038
00039 template<Player P,typename BaseState>
00040 struct ApplyDoUndoSimpleMove<P,BoardBitEffect<BaseState> >
00041 {
00042 typedef BoardBitEffect<BaseState> state_t;
00043 template <typename F>
00044 static void doUndoSimpleMove(state_t& s,
00045 Position from, Position to, int promoteMask,F& func){
00046 BoardBitMask oldMask=s.emptyMask;
00047 s.emptyMask^=(boardBitMaskTable.getMask(from)^boardBitMaskTable.getMask(to));
00048 ApplyDoUndoSimpleMove<P,BaseState>::doUndoSimpleMove(s,from,to,promoteMask,func);
00049 s.emptyMask=oldMask;
00050 }
00051 };
00052
00053 template<Player P,typename BaseState>
00054 struct ApplyDoUndoDropMove<P,BoardBitEffect<BaseState> >
00055 {
00056 typedef BoardBitEffect<BaseState> state_t;
00057 template <typename F>
00058 static void doUndoDropMove(state_t& s,
00059 Position to, Ptype ptype,F& func){
00060 BoardBitMask oldMask=s.emptyMask;
00061 s.emptyMask^=boardBitMaskTable.getMask(to);
00062 ApplyDoUndoDropMove<P,BaseState>::doUndoDropMove(s,to,ptype,func);
00063 s.emptyMask=oldMask;
00064 }
00065 };
00066
00067 template<Player P,typename BaseState>
00068 struct ApplyDoUndoCaptureMove<P,BoardBitEffect<BaseState> >
00069 {
00070 typedef BoardBitEffect<BaseState> state_t;
00071 template <typename F>
00072 static void doUndoCaptureMove(state_t& s,
00073 Position from,Position to, Piece p1, int promoteMask,F& func){
00074 BoardBitMask oldMask=s.emptyMask;
00075 s.emptyMask^=boardBitMaskTable.getMask(from);
00076 ApplyDoUndoCaptureMove<P,BaseState>::doUndoCaptureMove(s,from,to,p1,promoteMask,func);
00077 s.emptyMask=oldMask;
00078 }
00079 };
00080
00081 }
00082 }
00083
00084 #endif // _BOARD_BIT_EFFECT_H
00085
00086
00087
00088