00001
00002
00003 #ifndef _SIMPLE_STATE_TCC
00004 #define _SIMPLE_STATE_TCC
00005
00006 #include "osl/state/simpleState.h"
00007
00008 namespace osl
00009 {
00010 namespace simple_state_detail
00011 {
00012 template <bool checkDone> struct CheckDoneIf;
00013 template <> struct CheckDoneIf<true>
00014 {
00015 template <class Action>
00016 static bool done(Action& a) { return a.done(); }
00017 };
00018 template <> struct CheckDoneIf<false>
00019 {
00020 template <class Action>
00021 static bool done(Action&) { return false; }
00022 };
00023 }
00024 }
00025
00026 template <class Action>
00027 void osl::SimpleState::forEachEffectOfPiece(Piece piece,Action & action) const
00028 {
00029 Position piecePosition = piece.position();
00030 switch (piece.ptypeO()) {
00031 case NEW_PTYPEO(WHITE,PAWN): forEachEffectOfPiece<WHITE,PAWN,Action>(piecePosition,action); break;
00032 case NEW_PTYPEO(WHITE,LANCE): forEachEffectOfPiece<WHITE,LANCE,Action>(piecePosition,action); break;
00033 case NEW_PTYPEO(WHITE,KNIGHT): forEachEffectOfPiece<WHITE,KNIGHT,Action>(piecePosition,action); break;
00034 case NEW_PTYPEO(WHITE,SILVER): forEachEffectOfPiece<WHITE,SILVER,Action>(piecePosition,action); break;
00035 case NEW_PTYPEO(WHITE,PPAWN): forEachEffectOfPiece<WHITE,PPAWN,Action>(piecePosition,action); break;
00036 case NEW_PTYPEO(WHITE,PLANCE): forEachEffectOfPiece<WHITE,PLANCE,Action>(piecePosition,action); break;
00037 case NEW_PTYPEO(WHITE,PKNIGHT): forEachEffectOfPiece<WHITE,PKNIGHT,Action>(piecePosition,action); break;
00038 case NEW_PTYPEO(WHITE,PSILVER): forEachEffectOfPiece<WHITE,PSILVER,Action>(piecePosition,action); break;
00039 case NEW_PTYPEO(WHITE,GOLD): forEachEffectOfPiece<WHITE,GOLD,Action>(piecePosition,action); break;
00040 case NEW_PTYPEO(WHITE,BISHOP): forEachEffectOfPiece<WHITE,BISHOP,Action>(piecePosition,action); break;
00041 case NEW_PTYPEO(WHITE,PBISHOP): forEachEffectOfPiece<WHITE,PBISHOP,Action>(piecePosition,action); break;
00042 case NEW_PTYPEO(WHITE,ROOK): forEachEffectOfPiece<WHITE,ROOK,Action>(piecePosition,action); break;
00043 case NEW_PTYPEO(WHITE,PROOK): forEachEffectOfPiece<WHITE,PROOK,Action>(piecePosition,action); break;
00044 case NEW_PTYPEO(WHITE,KING): forEachEffectOfPiece<WHITE,KING,Action>(piecePosition,action); break;
00045 case NEW_PTYPEO(BLACK,PAWN): forEachEffectOfPiece<BLACK,PAWN,Action>(piecePosition,action); break;
00046 case NEW_PTYPEO(BLACK,LANCE): forEachEffectOfPiece<BLACK,LANCE,Action>(piecePosition,action); break;
00047 case NEW_PTYPEO(BLACK,KNIGHT): forEachEffectOfPiece<BLACK,KNIGHT,Action>(piecePosition,action); break;
00048 case NEW_PTYPEO(BLACK,SILVER): forEachEffectOfPiece<BLACK,SILVER,Action>(piecePosition,action); break;
00049 case NEW_PTYPEO(BLACK,PPAWN): forEachEffectOfPiece<BLACK,PPAWN,Action>(piecePosition,action); break;
00050 case NEW_PTYPEO(BLACK,PLANCE): forEachEffectOfPiece<BLACK,PLANCE,Action>(piecePosition,action); break;
00051 case NEW_PTYPEO(BLACK,PKNIGHT): forEachEffectOfPiece<BLACK,PKNIGHT,Action>(piecePosition,action); break;
00052 case NEW_PTYPEO(BLACK,PSILVER): forEachEffectOfPiece<BLACK,PSILVER,Action>(piecePosition,action); break;
00053 case NEW_PTYPEO(BLACK,GOLD): forEachEffectOfPiece<BLACK,GOLD,Action>(piecePosition,action); break;
00054 case NEW_PTYPEO(BLACK,BISHOP): forEachEffectOfPiece<BLACK,BISHOP,Action>(piecePosition,action); break;
00055 case NEW_PTYPEO(BLACK,PBISHOP): forEachEffectOfPiece<BLACK,PBISHOP,Action>(piecePosition,action); break;
00056 case NEW_PTYPEO(BLACK,ROOK): forEachEffectOfPiece<BLACK,ROOK,Action>(piecePosition,action); break;
00057 case NEW_PTYPEO(BLACK,PROOK): forEachEffectOfPiece<BLACK,PROOK,Action>(piecePosition,action); break;
00058 case NEW_PTYPEO(BLACK,KING): forEachEffectOfPiece<BLACK,KING,Action>(piecePosition,action); break;
00059 default: assert(0);
00060 }
00061 }
00062
00063 template <osl::Player P, osl::Ptype Type, class Action>
00064 void osl::SimpleState::forEachEffectPtype(Position pos,Action & action) const
00065 {
00066 forEachEffectPtypeDirection<P,Type,UL,Action>(pos,action);
00067 forEachEffectPtypeDirection<P,Type,UR,Action>(pos,action);
00068 forEachEffectPtypeDirection<P,Type,L,Action>(pos,action);
00069 forEachEffectPtypeDirection<P,Type,R,Action>(pos,action);
00070 forEachEffectPtypeDirection<P,Type,DL,Action>(pos,action);
00071 forEachEffectPtypeDirection<P,Type,D,Action>(pos,action);
00072 forEachEffectPtypeDirection<P,Type,DR,Action>(pos,action);
00073 forEachEffectPtypeDirection<P,Type,UUL,Action>(pos,action);
00074 forEachEffectPtypeDirection<P,Type,UUR,Action>(pos,action);
00075
00076 if (Type!=LANCE && Type!=ROOK) {
00077 forEachEffectPtypeDirection<P,Type,U,Action>(pos,action);
00078 }
00079 else{
00080 Position pos1=pos-DirectionPlayerTraits<U,P>::offset();
00081 Piece p=getPieceAt(pos1);
00082 if (p.isEmpty()) {
00083 pos1-=DirectionPlayerTraits<U,P>::offset();
00084 while((p=getPieceAt(pos1)).isEmpty()) {
00085 pos1-=DirectionPlayerTraits<U,P>::offset();
00086 }
00087 PtypeO ptypeo=p.ptypeO();
00088 int moveMask=Ptype_Table.getMoveMask(getPtype(ptypeo))&
00089 DirectionTraits<LONG_U>::mask;
00090 int playerMask= (~(static_cast<signed int>(ptypeo)>>31)) ^
00091 PlayerTraits<P>::mask;
00092 if ((moveMask&playerMask)!=0 && unpromote(getPtype(ptypeo))==Type ) {
00093 action.template doAction<P>(p,pos);
00094 }
00095 }
00096 else{
00097 PtypeO ptypeo=p.ptypeO();
00098 int moveMask=Ptype_Table.getMoveMask(getPtype(ptypeo))&
00099 (DirectionTraits<U>::mask|DirectionTraits<LONG_U>::mask);
00100 int playerMask= (~(static_cast<signed int>(ptypeo)>>31)) ^
00101 PlayerTraits<P>::mask;
00102 if ((moveMask&playerMask)!=0 && unpromote(getPtype(ptypeo))==Type) {
00103 action.template doAction<P>(p,pos);
00104 }
00105 }
00106 }
00107 if (Type==BISHOP) {
00108 for (int num=36;num<=37;num++) {
00109 Piece p=getPieceOf(num);
00110 if (p.isOnBoardByOwner<P>()) {
00111 Position pos1=p.position();
00112 EffectContent effect=Ptype_Table.getEffectNotLongU(p.ptypeO(),pos,pos1);
00113 if (effect.hasEffect()) {
00114 Offset offset=effect.offset();
00115 Position pos2=pos1+offset;
00116 do{
00117 if (! getPieceAt(pos2).isEmpty()) goto retryBIshop;
00118 pos2+=offset;
00119 } while(pos2!=pos);
00120 action.template doAction<P>(p,pos);
00121 }
00122 retryBIshop:;
00123 }
00124 }
00125 }
00126 else if (Type==ROOK) {
00127 for (int num=38;num<=39;num++) {
00128 Piece p=getPieceOf(num);
00129 if (p.isOnBoardByOwner<P>()) {
00130 Position pos1=p.position();
00131 EffectContent effect=Ptype_Table.getEffectNotLongU(p.ptypeO(),pos,pos1);
00132 if (effect.hasEffect()) {
00133 Offset offset=effect.offset();
00134 Position pos2=pos1+offset;
00135 do{
00136 if (! getPieceAt(pos2).isEmpty()) goto retryRook;
00137 pos2+=offset;
00138 } while(pos2!=pos);
00139 action.template doAction<P>(p,pos);
00140 }
00141 retryRook:;
00142 }
00143 }
00144 }
00145 }
00146
00147
00148 template <osl::Player P, class Action,bool checkDone, class PositionCheck>
00149 inline
00150 void osl::SimpleState::
00151 forEachEffectWithCheck(Position pos,Action & action,PositionCheck const& positionCheck) const
00152 {
00153 for (int i=0;i<U;i++) {
00154 Direction dir=static_cast<Direction>(i);
00155 Position pos1=pos-Board_Table.template getOffset<P>(dir);
00156 Piece p=getPieceAt(pos1);
00157 PtypeO ptypeo=p.ptypeO();
00158 if (Ptype_Table.getShortMoveMask(P,ptypeo,dir)!=0) {
00159 action.template doAction<P>(p,pos);
00160 if (simple_state_detail::CheckDoneIf<checkDone>::done(action)) return;
00161 }
00162 }
00163 for (int i=U+1;i<=SHORT_DIRECTION_MAX;i++) {
00164 Direction dir=static_cast<Direction>(i);
00165 Position pos1=pos-Board_Table.template getOffset<P>(dir);
00166 Piece p=getPieceAt(pos1);
00167 PtypeO ptypeo=p.ptypeO();
00168 if (Ptype_Table.getShortMoveMask(P,ptypeo,dir)!=0) {
00169 action.template doAction<P>(p,pos);
00170 if (simple_state_detail::CheckDoneIf<checkDone>::done(action)) return;
00171 }
00172 }
00173
00174 {
00175 Position pos1=pos-DirectionPlayerTraits<U,P>::offset();
00176 Piece p=getPieceAt(pos1);
00177 if (p.isEmpty() || positionCheck(pos1)) {
00178 pos1-=DirectionPlayerTraits<U,P>::offset();
00179 while((p=getPieceAt(pos1), p.isEmpty()) || positionCheck(pos1)) {
00180 pos1-=DirectionPlayerTraits<U,P>::offset();
00181 }
00182 PtypeO ptypeo=p.ptypeO();
00183 int moveMask=Ptype_Table.getMoveMask(getPtype(ptypeo))&
00184 DirectionTraits<LONG_U>::mask;
00185 int playerMask= (~(static_cast<signed int>(ptypeo)>>31)) ^
00186 PlayerTraits<P>::mask;
00187 if ((moveMask&playerMask)!=0) {
00188 action.template doAction<P>(p,pos);
00189 if (simple_state_detail::CheckDoneIf<checkDone>::done(action)) return;
00190 }
00191 }
00192 else{
00193 PtypeO ptypeo=p.ptypeO();
00194 int moveMask=Ptype_Table.getMoveMask(getPtype(ptypeo))&
00195 (DirectionTraits<U>::mask|DirectionTraits<LONG_U>::mask);
00196 int playerMask= (~(static_cast<signed int>(ptypeo)>>31)) ^
00197 PlayerTraits<P>::mask;
00198 if ((moveMask&playerMask)!=0) {
00199 action.template doAction<P>(p,pos);
00200 if (simple_state_detail::CheckDoneIf<checkDone>::done(action)) return;
00201 }
00202 }
00203 }
00204 for (int num=36;num<=39;num++) {
00205 Piece p=getPieceOf(num);
00206 if (p.isOnBoardByOwner<P>()) {
00207 Position pos1=p.position();
00208 EffectContent effect=Ptype_Table.getEffectNotLongU(p.ptypeO(),pos1,pos);
00209 if (effect.hasEffect()) {
00210 Offset offset=effect.offset();
00211 Position pos2=pos1+offset;
00212 do{
00213 if (! getPieceAt(pos2).isEmpty() && !positionCheck(pos2)) goto retry;
00214 pos2+=offset;
00215 } while(pos2!=pos);
00216 action.template doAction<P>(p,pos);
00217 if (simple_state_detail::CheckDoneIf<checkDone>::done(action)) return;
00218 }
00219 retry:;
00220 }
00221 }
00222 }
00223
00224 template <osl::Player P, osl::Ptype Type, class Action>
00225 void osl::SimpleState::
00226 forEachEffectOfPiece(Position piecePosition,Action & action) const
00227 {
00228 forEachEffectOfPieceDir<P,Type,Action,UL>(piecePosition,action);
00229 forEachEffectOfPieceDir<P,Type,Action,U>(piecePosition,action);
00230 forEachEffectOfPieceDir<P,Type,Action,UR>(piecePosition,action);
00231 forEachEffectOfPieceDir<P,Type,Action,L>(piecePosition,action);
00232 forEachEffectOfPieceDir<P,Type,Action,R>(piecePosition,action);
00233 forEachEffectOfPieceDir<P,Type,Action,DL>(piecePosition,action);
00234 forEachEffectOfPieceDir<P,Type,Action,D>(piecePosition,action);
00235 forEachEffectOfPieceDir<P,Type,Action,DR>(piecePosition,action);
00236 forEachEffectOfPieceDir<P,Type,Action,UUL>(piecePosition,action);
00237 forEachEffectOfPieceDir<P,Type,Action,UUR>(piecePosition,action);
00238 forEachEffectOfPieceLongDir<P,Type,Action,LONG_UL>(piecePosition,action);
00239 forEachEffectOfPieceLongDir<P,Type,Action,LONG_U>(piecePosition,action);
00240 forEachEffectOfPieceLongDir<P,Type,Action,LONG_UR>(piecePosition,action);
00241 forEachEffectOfPieceLongDir<P,Type,Action,LONG_L>(piecePosition,action);
00242 forEachEffectOfPieceLongDir<P,Type,Action,LONG_R>(piecePosition,action);
00243 forEachEffectOfPieceLongDir<P,Type,Action,LONG_DL>(piecePosition,action);
00244 forEachEffectOfPieceLongDir<P,Type,Action,LONG_D>(piecePosition,action);
00245 forEachEffectOfPieceLongDir<P,Type,Action,LONG_DR>(piecePosition,action);
00246 }
00247
00248 #endif
00249
00250
00251
00252