signatureEffect.h
Go to the documentation of this file.
00001 #ifndef _SIGNATURE_EFFECT_H
00002 #define _SIGNATURE_EFFECT_H
00003 
00004 #include "osl/effect/moveSignature.h"
00005 #include "osl/piece.h"
00006 #include "osl/misc/carray.h"
00007 
00008 namespace osl 
00009 {
00010   namespace effect
00011   {
00015   class SignatureTable{
00016     CArray<MoveSignature,16*(9+4)> signatures;
00017   public:
00018     template<typename State>
00019     SignatureTable(State& state){
00020       std::fill(signatures.begin(),signatures.end(),signature_EDGE);
00021       for(int y=1;y<=9;y++)
00022         for(int x=1;x<=9;x++){
00023           Square pos(x,y);
00024           PtypeO ptypeO=getPtypeO(state.pieceAt(pos));
00025           set(pos,Move_Signature_Table.getSignature(ptypeO));
00026         }
00027     }
00028     MoveSignature get(Square pos) const{
00029       return signatures[pos.index()];
00030     }
00031     void set(Square pos,MoveSignature signature){ 
00032       signatures[pos.index()]=signature;
00033     }
00034   };
00035 
00036   template <Player P,class State>
00037   struct ApplyDoUndoSimpleMove;
00038   template <Player P,class State>
00039   struct ApplyDoUndoCaptureMove;
00040   template <Player P,class State>
00041   struct ApplyDoUndoDropMove;
00042 
00049   template<class State>
00050   class SignatureEffect: public State{
00051   public:
00052     SignatureTable signatureTable;
00054     typedef SignatureEffect<State> effect_state_t;
00055   public:
00056     template<typename OrigState>
00057     explicit SignatureEffect(OrigState const& st) :State(st),signatureTable(st){}
00058     MoveSignature getSignature(Square pos) const{
00059       return signatureTable.get(pos);
00060     }
00061     void setSignature(Square pos,MoveSignature signature){ 
00062       signatureTable.set(pos,signature);
00063     }
00064   };
00065 
00066   template<Player P,typename BaseState>
00067   struct ApplyDoUndoSimpleMove<P,SignatureEffect<BaseState> >
00068   {
00069     typedef SignatureEffect<BaseState> state_t;
00070     template <typename F>
00071     static void doUndoSimpleMove(state_t& s, 
00072                                  Square from, Square to, int promoteMask,F& func){
00073       /* signatureのset */
00074       Piece oldPiece=s.pieceAt(from);
00075       PtypeO ptypeO=oldPiece.promoteWithMask(promoteMask).ptypeO();
00076       MoveSignature oldSignature=s.getSignature(from);
00077       s.setSignature(from,signature_EMPTY);
00078       s.setSignature(to,Move_Signature_Table.getSignature(ptypeO));
00079 
00080       ApplyDoUndoSimpleMove<P,BaseState>::doUndoSimpleMove(s,from,to,promoteMask,func);
00081 
00082       /* signatureの書き戻し */
00083       s.setSignature(from,oldSignature);
00084       s.setSignature(to,signature_EMPTY);
00085     }
00086   };
00087   
00088   template<Player P,typename BaseState>
00089   struct ApplyDoUndoDropMove<P,SignatureEffect<BaseState> >
00090   {
00091     typedef SignatureEffect<BaseState> state_t;
00092     template <typename F>
00093     static void doUndoDropMove(state_t& s, 
00094                                Square to, Ptype ptype,F& func){
00095       /* signatureのset */
00096       PtypeO ptypeO=newPtypeO(P,ptype);
00097       s.setSignature(to,Move_Signature_Table.getSignature(ptypeO));
00098 
00099       ApplyDoUndoDropMove<P,BaseState>::doUndoDropMove(s,to,ptype,func);
00100       /* signatureのundo */
00101       s.setSignature(to,signature_EMPTY);
00102 
00103     }
00104   };
00105 
00106   template<Player P,typename BaseState>
00107   struct ApplyDoUndoCaptureMove<P,SignatureEffect<BaseState> >
00108   {
00109     typedef SignatureEffect<BaseState> state_t;
00110     template <typename F>
00111     static void doUndoCaptureMove(state_t& s,
00112                                   Square from,Square to, Piece p1, int promoteMask,F& func){
00113       /* signatureのset */
00114       Piece oldPiece=s.pieceAt(from);
00115       PtypeO ptypeO=oldPiece.promoteWithMask(promoteMask).ptypeO();
00116       MoveSignature oldSignatureFrom=s.getSignature(from);
00117       s.setSignature(from,signature_EMPTY);
00118       MoveSignature oldSignatureTo=s.getSignature(to);
00119       s.setSignature(to,Move_Signature_Table.getSignature(ptypeO));
00120       /* base classの呼び出し */
00121       ApplyDoUndoCaptureMove<P,BaseState>::doUndoCaptureMove(s,from,to,p1,promoteMask,func);
00122       /* signatureの書き戻し */
00123       s.setSignature(from,oldSignatureFrom);
00124       s.setSignature(to,oldSignatureTo);
00125     }
00126   };
00127 } // namespace effect
00128 } // namespace osl
00129 #endif // _SIGNATURE_EFFECT_H
00130 // ;;; Local Variables:
00131 // ;;; mode:c++
00132 // ;;; c-basic-offset:2
00133 // ;;; End:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines