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 Position pos(x,y);
00024 PtypeO ptypeO=getPtypeO(state.getPieceAt(pos));
00025 set(pos,Move_Signature_Table.getSignature(ptypeO));
00026 }
00027 }
00028 MoveSignature get(Position pos) const{
00029 return signatures[pos.index()];
00030 }
00031 void set(Position 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(Position pos) const{
00059 return signatureTable.get(pos);
00060 }
00061 void setSignature(Position 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 Position from, Position to, int promoteMask,F& func){
00073
00074 Piece oldPiece=s.getPieceAt(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
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 Position to, Ptype ptype,F& func){
00095
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
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 Position from,Position to, Piece p1, int promoteMask,F& func){
00113
00114 Piece oldPiece=s.getPieceAt(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
00121 ApplyDoUndoCaptureMove<P,BaseState>::doUndoCaptureMove(s,from,to,p1,promoteMask,func);
00122
00123 s.setSignature(from,oldSignatureFrom);
00124 s.setSignature(to,oldSignatureTo);
00125 }
00126 };
00127 }
00128 }
00129 #endif // _SIGNATURE_EFFECT_H
00130
00131
00132
00133