説明を見る。00001
00002
00003 #ifndef OSL_PTYPETRAITS_H
00004 #define OSL_PTYPETRAITS_H
00005
00006 #include "osl/basic_type.h"
00007 #include "osl/bits/directionTraits.h"
00008
00009 namespace osl
00010 {
00011 template<Ptype T>
00012 struct PtypeTraits;
00013
00014 template <>
00015 struct PtypeTraits<PTYPE_EMPTY>
00016 {
00017 static const bool isBasic=false;
00018 static const bool canPromote=false;
00020 static const bool betterToPromote=false;
00021 static const char *name() { return "PTYPE_EMPTY";}
00022 static const char *csaName() { return "..";}
00023 static const int moveMask=0;
00024 };
00025
00026 template <>
00027 struct PtypeTraits<PTYPE_EDGE>
00028 {
00029 static const bool isBasic=false;
00030 static const bool canPromote=false;
00031 static const bool betterToPromote=false;
00032 static const char *name() { return "PTYPE_EDGE";}
00033 static const char *csaName() { return "XX";}
00034 static const int moveMask=0;
00035 };
00036
00037 template <>
00038 struct PtypeTraits<GOLD>
00039 {
00040 static const bool isBasic=true;
00041 static const bool canPromote=false;
00042 static const bool betterToPromote=false;
00043 static const Ptype moveType=GOLD;
00044 static const char *name() { return "GOLD";}
00045 static const char *csaName() { return "KI";}
00046 static const int indexMin=26;
00047 static const int indexLimit=30;
00048 static const int dropBlackFromY=1;
00049 static const int dropBlackToY=9;
00050 static const Ptype basicType=GOLD;
00051 static const int moveMask=
00052 DirectionTraits<UL>::mask|DirectionTraits<U>::mask
00053 |DirectionTraits<UR>::mask|DirectionTraits<L>::mask
00054 |DirectionTraits<R>::mask|DirectionTraits<D>::mask;
00055 };
00056
00057 template <>
00058 struct PtypeTraits<PAWN>
00059 {
00060 static const bool isBasic=true;
00061 static const bool canPromote=true;
00062 static const bool betterToPromote=true;
00063 static const Ptype moveType=PAWN;
00064 static const Ptype basicType=PAWN;
00065 static const char *name() { return "PAWN";}
00066 static const char *csaName() { return "FU";}
00067 static const int indexMin=0;
00068 static const int indexLimit=18;
00069 static const int dropBlackFromY=2;
00070 static const int dropBlackToY=9;
00071 static const int mayPromoteToY=4;
00072 static const int moveMask=DirectionTraits<U>::mask;
00073 };
00074
00075 template <>
00076 struct PtypeTraits<PPAWN>
00077 {
00078 static const bool isBasic=false;
00079 static const bool canPromote=false;
00080
00081 static const bool betterToPromote=true;
00082 static const Ptype moveType=GOLD;
00083 static const char *name() { return "PPAWN";}
00084 static const char *csaName() { return "TO";}
00085 static const int moveMask=PtypeTraits<GOLD>::moveMask;
00086 static const Ptype basicType=PAWN;
00087 static const int indexMin=PtypeTraits<basicType>::indexMin;
00088 };
00089
00090 template <>
00091 struct PtypeTraits<LANCE>
00092 {
00093 static const bool isBasic=true;
00094 static const bool canPromote=true;
00095 static const bool betterToPromote=false;
00096 static const Ptype moveType=LANCE;
00097 static const Ptype basicType=LANCE;
00098 static const char *name() { return "LANCE";}
00099 static const char *csaName() { return "KY";}
00100 static const int indexMin=32;
00101 static const int indexLimit=36;
00102 static const int dropBlackFromY=2;
00103 static const int dropBlackToY=9;
00104 static const int mayPromoteToY=9;
00105 static const int moveMask=DirectionTraits<LONG_U>::mask;
00106 };
00107
00108 template <>
00109 struct PtypeTraits<PLANCE>
00110 {
00111 static const bool isBasic=false;
00112 static const bool canPromote=false;
00113 static const bool betterToPromote=false;
00114 static const Ptype moveType=GOLD;
00115 static const char *name() { return "PLANCE";}
00116 static const char *csaName() { return "NY";}
00117 static const int moveMask=PtypeTraits<GOLD>::moveMask;
00118 static const Ptype basicType=LANCE;
00119 static const int indexMin=PtypeTraits<basicType>::indexMin;
00120 };
00121
00122 template <>
00123 struct PtypeTraits<KNIGHT>
00124 {
00125 static const bool isBasic=true;
00126 static const bool canPromote=true;
00127 static const bool betterToPromote=false;
00128 static const Ptype moveType=KNIGHT;
00129 static const Ptype basicType=KNIGHT;
00130 static const char *name() { return "KNIGHT";}
00131 static const char *csaName() { return "KE";}
00132 static const int indexMin=18;
00133 static const int indexLimit=22;
00134 static const int dropBlackFromY=3;
00135 static const int dropBlackToY=9;
00136 static const int mayPromoteToY=5;
00137 static const int moveMask=DirectionTraits<UUL>::mask|DirectionTraits<UUR>::mask;
00138 };
00139
00140 template <>
00141 struct PtypeTraits<PKNIGHT>
00142 {
00143 static const bool isBasic=false;
00144 static const bool canPromote=false;
00145 static const bool betterToPromote=false;
00146 static const Ptype moveType=GOLD;
00147 static const char *name() { return "PKNIGHT";}
00148 static const char *csaName() { return "NK";}
00149 static const int moveMask=PtypeTraits<GOLD>::moveMask;
00150 static const Ptype basicType=KNIGHT;
00151 static const int indexMin=PtypeTraits<basicType>::indexMin;
00152 };
00153
00154 template <>
00155 struct PtypeTraits<SILVER>
00156 {
00157 static const bool isBasic=true;
00158 static const bool canPromote=true;
00159 static const bool betterToPromote=false;
00160 static const Ptype moveType=SILVER;
00161 static const Ptype basicType=SILVER;
00162 static const char *name() { return "SILVER";}
00163 static const char *csaName() { return "GI";}
00164 static const int indexMin=22;
00165 static const int indexLimit=26;
00166 static const int dropBlackFromY=1;
00167 static const int dropBlackToY=9;
00168 static const int mayPromoteToY=4;
00169 static const int moveMask=
00170 DirectionTraits<UL>::mask|DirectionTraits<U>::mask
00171 |DirectionTraits<UR>::mask|DirectionTraits<DL>::mask
00172 |DirectionTraits<DR>::mask;
00173 };
00174
00175 template <>
00176 struct PtypeTraits<PSILVER>
00177 {
00178 static const bool isBasic=false;
00179 static const bool canPromote=false;
00180 static const bool betterToPromote=false;
00181 static const Ptype moveType=GOLD;
00182 static const char *name() { return "PSILVER";}
00183 static const char *csaName() { return "NG";}
00184 static const int moveMask=PtypeTraits<GOLD>::moveMask;
00185 static const Ptype basicType=SILVER;
00186 static const int indexMin=PtypeTraits<basicType>::indexMin;
00187 };
00188
00189 template <>
00190 struct PtypeTraits<BISHOP>
00191 {
00192 static const bool isBasic=true;
00193 static const bool canPromote=true;
00194 static const bool betterToPromote=true;
00195 static const Ptype moveType=BISHOP;
00196 static const Ptype basicType=BISHOP;
00197 static const char *name() { return "BISHOP";}
00198 static const char *csaName() { return "KA";}
00199 static const int indexMin=36;
00200 static const int indexLimit=38;
00201 static const int dropBlackFromY=1;
00202 static const int dropBlackToY=9;
00203 static const int mayPromoteToY=9;
00204 static const int moveMask=
00205 DirectionTraits<LONG_UL>::mask|DirectionTraits<LONG_UR>::mask
00206 |DirectionTraits<LONG_DL>::mask|DirectionTraits<LONG_DR>::mask;
00207 };
00208
00209 template <>
00210 struct PtypeTraits<PBISHOP>
00211 {
00212 static const bool isBasic=false;
00213 static const bool canPromote=false;
00214
00215 static const bool betterToPromote=true;
00216 static const Ptype moveType=PBISHOP;
00217 static const char *name() { return "PBISHOP";}
00218 static const char *csaName() { return "UM";}
00219 static const int moveMask=
00220 DirectionTraits<LONG_UL>::mask|DirectionTraits<LONG_UR>::mask
00221 |DirectionTraits<LONG_DL>::mask|DirectionTraits<LONG_DR>::mask
00222 |DirectionTraits<U>::mask|DirectionTraits<L>::mask
00223 |DirectionTraits<R>::mask|DirectionTraits<D>::mask;
00224 static const Ptype basicType=BISHOP;
00225 static const int indexMin=PtypeTraits<basicType>::indexMin;
00226 };
00227
00228 template <>
00229 struct PtypeTraits<ROOK>
00230 {
00231 static const bool isBasic=true;
00232 static const bool canPromote=true;
00233 static const bool betterToPromote=true;
00234 static const Ptype moveType=ROOK;
00235 static const Ptype basicType=ROOK;
00236 static const char *name() { return "ROOK";}
00237 static const char *csaName() { return "HI";}
00238 static const int indexMin=38;
00239 static const int indexLimit=40;
00240 static const int dropBlackFromY=1;
00241 static const int dropBlackToY=9;
00242 static const int mayPromoteToY=9;
00243 static const int moveMask=
00244 DirectionTraits<LONG_U>::mask|DirectionTraits<LONG_L>::mask
00245 |DirectionTraits<LONG_R>::mask|DirectionTraits<LONG_D>::mask;
00246 };
00247
00248 template <>
00249 struct PtypeTraits<PROOK>
00250 {
00251 static const bool isBasic=false;
00252 static const bool canPromote=false;
00253
00254 static const bool betterToPromote=true;
00255 static const Ptype moveType=PROOK;
00256 static const char *name() { return "PROOK";}
00257 static const char *csaName() { return "RY";}
00258 static const int moveMask=
00259 DirectionTraits<LONG_U>::mask|DirectionTraits<LONG_L>::mask
00260 |DirectionTraits<LONG_R>::mask|DirectionTraits<LONG_D>::mask
00261 |DirectionTraits<UL>::mask|DirectionTraits<UR>::mask
00262 |DirectionTraits<DL>::mask|DirectionTraits<DR>::mask;
00263 static const Ptype basicType=ROOK;
00264 static const int indexMin=PtypeTraits<basicType>::indexMin;
00265 };
00266
00267
00268 template <>
00269 struct PtypeTraits<KING>
00270 {
00271 static const bool isBasic=true;
00272 static const bool canPromote=false;
00273 static const bool betterToPromote=false;
00274 static const Ptype moveType=KING;
00275 static const Ptype basicType=KING;
00276 static const char *name() { return "KING";}
00277 static const char *csaName() { return "OU";}
00278 static const int indexMin=30;
00279 static const int indexLimit=32;
00280 static const int dropBlackFromY=1;
00281 static const int dropBlackToY=9;
00282 static const int moveMask=
00283 DirectionTraits<U>::mask|DirectionTraits<L>::mask
00284 |DirectionTraits<R>::mask|DirectionTraits<D>::mask
00285 |DirectionTraits<UL>::mask|DirectionTraits<UR>::mask
00286 |DirectionTraits<DL>::mask|DirectionTraits<DR>::mask;
00287 };
00288
00289 template<Ptype T,bool IsBasic>
00290 struct PtypeFunsSub;
00291
00292 template<Ptype T>
00293 struct PtypeFunsSub<T,true>
00294 {
00295 static const uint64_t indexMask=(-1LL<<(PtypeTraits<T>::indexMin))^(-1LL<<(PtypeTraits<T>::indexLimit));
00296 static const Ptype promotePtype=static_cast<Ptype>(static_cast<int>(T)-8);
00297 static const Ptype basicType = T;
00298 };
00299
00300 template<Ptype T>
00301 struct PtypeFunsSub<T,false>
00302 {
00303 static const uint64_t indexMask=static_cast<uint64_t>(0);
00304
00305 static const Ptype promotePtype=T;
00306 static const Ptype basicType = PtypeTraits<T>::basicType;
00307 };
00308
00309 template<Ptype T>
00310 struct PtypeFuns
00311 {
00312 #if OSL_WORDSIZE == 64
00313 static const unsigned int indexNum=0;
00314 #elif OSL_WORDSIZE == 32
00315 static const unsigned int indexNum=(PtypeTraits<T>::indexMin >> 5);
00316 #endif
00317 static const bool hasLongMove=(PtypeTraits<T>::indexMin>=32);
00318 static const uint64_t indexMask=PtypeFunsSub<T,PtypeTraits<T>::isBasic>::indexMask;
00319 static const Ptype promotePtype=PtypeFunsSub<T,PtypeTraits<T>::canPromote>::promotePtype;
00320 static const Ptype basicType=PtypeFunsSub<T,PtypeTraits<T>::isBasic>::basicType;
00321 };
00322
00327 enum MoveConstraint {
00329 CannotMove,
00331 OnlyPromoted,
00333 OnlyBasic,
00335 NoConstraint,
00336 };
00337
00338 template<Ptype T,Direction D>
00339 struct PtypeDirectionTraits
00340 {
00341 static const bool hasMove=(PtypeTraits<T>::moveMask & DirectionTraits<D>::mask)!=0;
00342 static const bool canMove=
00343 (PtypeTraits<T>::moveMask & DirectionTraits<D>::mask)!=0 ||
00344 (PtypeTraits<T>::moveMask &
00345 DirectionTraits<DirectionTraits<D>::longDir>::mask)!=0;
00346 static const MoveConstraint moveConstraint =
00347 (PtypeDirectionTraits<T,D>::canMove
00348 ? (PtypeDirectionTraits<PtypeFuns<T>::promotePtype,D>::canMove
00349 ? NoConstraint : OnlyBasic )
00350 : (PtypeDirectionTraits<PtypeFuns<T>::promotePtype,D>::canMove
00351 ? OnlyPromoted : CannotMove));
00352 };
00353
00354
00355 template<Player T>
00356 struct KingTraits
00357 {
00358 static const int index=PtypeTraits<KING>::indexMin+playerToIndex(T);
00359 };
00360
00361 template<Ptype T,Player P>
00362 struct PtypePlayerTraits
00363 {
00364 static bool canDropTo(Square pos)
00365 {
00366 static_assert(PtypeTraits<T>::isBasic, "canDropTo");
00367 if (PtypeTraits<T>::dropBlackFromY == 1)
00368 return true;
00369
00370 if (P==BLACK)
00371 return pos.y() >= PtypeTraits<T>::dropBlackFromY;
00372 else
00373 return pos.y() <= Square::reverseY(PtypeTraits<T>::dropBlackFromY);
00374 }
00379 static bool mayPromote(Square pos)
00380 {
00381 static_assert(PtypeTraits<T>::isBasic&&PtypeTraits<T>::canPromote, "mayPromote");
00382 if (PtypeTraits<T>::mayPromoteToY == 9)
00383 return true;
00384
00385 if (P==BLACK)
00386 return pos.y() <= PtypeTraits<T>::mayPromoteToY;
00387 else
00388 return pos.y() >= Square::reverseY(PtypeTraits<T>::mayPromoteToY);
00389 }
00393 static bool mustPromote(Square pos)
00394 {
00395 if(P==BLACK){
00396 if(T==PAWN || T==LANCE) return pos.yEq<2>();
00397 else if(T==KNIGHT) return pos.yLe<4>();
00398 else return false;
00399 }
00400 else{
00401 if(T==PAWN || T==LANCE) return pos.yEq<8>();
00402 else if(T==KNIGHT) return pos.yGe<6>();
00403 else return false;
00404 }
00405 }
00409 static bool canPromote(Square pos)
00410 {
00411 if(P==BLACK){
00412 if(T==PAWN || T==LANCE) return pos.yLe<4>();
00413 else if(T==KNIGHT) return pos.yLe<5>();
00414 else return pos.yLe<3>();
00415 }
00416 else{
00417 if(T==PAWN || T==LANCE) return pos.yGe<6>();
00418 else if(T==KNIGHT) return pos.yGe<5>();
00419 else return pos.yGe<7>();
00420 }
00421 }
00426 static bool checkPromote(Square pos)
00427 {
00428 if(P==BLACK){
00429 if(T==SILVER) return pos.yEq<4>();
00430 else if(T==LANCE || T==ROOK || T==BISHOP)
00431 return true;
00432 else return false;
00433 }
00434 else{
00435 if(T==SILVER) return pos.yEq<6>();
00436 else if(T==LANCE || T==ROOK || T==BISHOP)
00437 return true;
00438 else return false;
00439 }
00440 }
00444 static bool noPromote(Square pos)
00445 {
00446 if(P==BLACK){
00447 if(T==PAWN || T==SILVER) return pos.yGe<5>();
00448 else if(T==KNIGHT) return pos.yGe<6>();
00449 else if(T==LANCE || T==ROOK || T==BISHOP) return false;
00450 else return true;
00451 }
00452 else{
00453 if(T==PAWN || T==SILVER) return pos.yLe<5>();
00454 else if(T==KNIGHT) return pos.yLe<4>();
00455 else if(T==LANCE || T==ROOK || T==BISHOP) return false;
00456 else return true;
00457 }
00458 }
00459 };
00460
00461
00462 }
00463
00464 #endif
00465
00466
00467
00468