boardBitEffect.h
Go to the documentation of this file.
00001 /* boardBitEffect.h
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                                    Square from, Square 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                                  Square 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                                     Square from,Square 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   } // namespace effect
00082 } // namespace osl
00083 
00084 #endif // _BOARD_BIT_EFFECT_H
00085 // ;;; Local Variables:
00086 // ;;; mode:c++
00087 // ;;; c-basic-offset:2
00088 // ;;; End:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines