00001
00002
00003 #ifndef _PTYPETRAITS_H
00004 #define _PTYPETRAITS_H
00005
00006 #include "osl/misc/mask.h"
00007 #include "osl/misc/loki.h"
00008 #include "osl/ptype.h"
00009 #include "osl/directionTraits.h"
00010 #include "osl/position.h"
00011
00012 namespace osl
00013 {
00014 template<Ptype T>
00015 struct PtypeTraits;
00016
00017 template <>
00018 struct PtypeTraits<PTYPE_EMPTY>
00019 {
00020 static const bool isBasic=false;
00021 static const bool canPromote=false;
00023 static const bool betterToPromote=false;
00024 static const char *name() { return "PTYPE_EMPTY";}
00025 static const char *csaName() { return "..";}
00026 static const int moveMask=0;
00027 };
00028
00029 template <>
00030 struct PtypeTraits<PTYPE_EDGE>
00031 {
00032 static const bool isBasic=false;
00033 static const bool canPromote=false;
00034 static const bool betterToPromote=false;
00035 static const char *name() { return "PTYPE_EDGE";}
00036 static const char *csaName() { return "XX";}
00037 static const int moveMask=0;
00038 };
00039
00040 template <>
00041 struct PtypeTraits<GOLD>
00042 {
00043 static const bool isBasic=true;
00044 static const bool canPromote=false;
00045 static const bool betterToPromote=false;
00046 static const Ptype moveType=GOLD;
00047 static const char *name() { return "GOLD";}
00048 static const char *csaName() { return "KI";}
00049 static const int indexMin=26;
00050 static const int indexLimit=30;
00051 static const int dropBlackFromY=1;
00052 static const int dropBlackToY=9;
00053 static const int moveMask=
00054 DirectionTraits<UL>::mask|DirectionTraits<U>::mask
00055 |DirectionTraits<UR>::mask|DirectionTraits<L>::mask
00056 |DirectionTraits<R>::mask|DirectionTraits<D>::mask;
00057 };
00058
00059 template <>
00060 struct PtypeTraits<PAWN>
00061 {
00062 static const bool isBasic=true;
00063 static const bool canPromote=true;
00064 static const bool betterToPromote=true;
00065 static const Ptype moveType=PAWN;
00066 static const char *name() { return "PAWN";}
00067 static const char *csaName() { return "FU";}
00068 static const int indexMin=0;
00069 static const int indexLimit=18;
00070 static const int dropBlackFromY=2;
00071 static const int dropBlackToY=9;
00072 static const int mayPromoteToY=4;
00073 static const int moveMask=DirectionTraits<U>::mask;
00074 };
00075
00076 template <>
00077 struct PtypeTraits<PPAWN>
00078 {
00079 static const bool isBasic=false;
00080 static const bool canPromote=false;
00081
00082 static const bool betterToPromote=true;
00083 static const Ptype moveType=GOLD;
00084 static const char *name() { return "PPAWN";}
00085 static const char *csaName() { return "TO";}
00086 static const int moveMask=PtypeTraits<GOLD>::moveMask;
00087 static const Ptype basicType=PAWN;
00088 static const int indexMin=PtypeTraits<basicType>::indexMin;
00089 };
00090
00091 template <>
00092 struct PtypeTraits<LANCE>
00093 {
00094 static const bool isBasic=true;
00095 static const bool canPromote=true;
00096 static const bool betterToPromote=false;
00097 static const Ptype moveType=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 char *name() { return "KNIGHT";}
00130 static const char *csaName() { return "KE";}
00131 static const int indexMin=18;
00132 static const int indexLimit=22;
00133 static const int dropBlackFromY=3;
00134 static const int dropBlackToY=9;
00135 static const int mayPromoteToY=5;
00136 static const int moveMask=DirectionTraits<UUL>::mask|DirectionTraits<UUR>::mask;
00137 };
00138
00139 template <>
00140 struct PtypeTraits<PKNIGHT>
00141 {
00142 static const bool isBasic=false;
00143 static const bool canPromote=false;
00144 static const bool betterToPromote=false;
00145 static const Ptype moveType=GOLD;
00146 static const char *name() { return "PKNIGHT";}
00147 static const char *csaName() { return "NK";}
00148 static const int moveMask=PtypeTraits<GOLD>::moveMask;
00149 static const Ptype basicType=KNIGHT;
00150 static const int indexMin=PtypeTraits<basicType>::indexMin;
00151 };
00152
00153 template <>
00154 struct PtypeTraits<SILVER>
00155 {
00156 static const bool isBasic=true;
00157 static const bool canPromote=true;
00158 static const bool betterToPromote=false;
00159 static const Ptype moveType=SILVER;
00160 static const char *name() { return "SILVER";}
00161 static const char *csaName() { return "GI";}
00162 static const int indexMin=22;
00163 static const int indexLimit=26;
00164 static const int dropBlackFromY=1;
00165 static const int dropBlackToY=9;
00166 static const int mayPromoteToY=4;
00167 static const int moveMask=
00168 DirectionTraits<UL>::mask|DirectionTraits<U>::mask
00169 |DirectionTraits<UR>::mask|DirectionTraits<DL>::mask
00170 |DirectionTraits<DR>::mask;
00171 };
00172
00173 template <>
00174 struct PtypeTraits<PSILVER>
00175 {
00176 static const bool isBasic=false;
00177 static const bool canPromote=false;
00178 static const bool betterToPromote=false;
00179 static const Ptype moveType=GOLD;
00180 static const char *name() { return "PSILVER";}
00181 static const char *csaName() { return "NG";}
00182 static const int moveMask=PtypeTraits<GOLD>::moveMask;
00183 static const Ptype basicType=SILVER;
00184 static const int indexMin=PtypeTraits<basicType>::indexMin;
00185 };
00186
00187 template <>
00188 struct PtypeTraits<BISHOP>
00189 {
00190 static const bool isBasic=true;
00191 static const bool canPromote=true;
00192 static const bool betterToPromote=true;
00193 static const Ptype moveType=BISHOP;
00194 static const char *name() { return "BISHOP";}
00195 static const char *csaName() { return "KA";}
00196 static const int indexMin=36;
00197 static const int indexLimit=38;
00198 static const int dropBlackFromY=1;
00199 static const int dropBlackToY=9;
00200 static const int mayPromoteToY=9;
00201 static const int moveMask=
00202 DirectionTraits<LONG_UL>::mask|DirectionTraits<LONG_UR>::mask
00203 |DirectionTraits<LONG_DL>::mask|DirectionTraits<LONG_DR>::mask;
00204 };
00205
00206 template <>
00207 struct PtypeTraits<PBISHOP>
00208 {
00209 static const bool isBasic=false;
00210 static const bool canPromote=false;
00211
00212 static const bool betterToPromote=true;
00213 static const Ptype moveType=PBISHOP;
00214 static const char *name() { return "PBISHOP";}
00215 static const char *csaName() { return "UM";}
00216 static const int moveMask=
00217 DirectionTraits<LONG_UL>::mask|DirectionTraits<LONG_UR>::mask
00218 |DirectionTraits<LONG_DL>::mask|DirectionTraits<LONG_DR>::mask
00219 |DirectionTraits<U>::mask|DirectionTraits<L>::mask
00220 |DirectionTraits<R>::mask|DirectionTraits<D>::mask;
00221 static const Ptype basicType=BISHOP;
00222 static const int indexMin=PtypeTraits<basicType>::indexMin;
00223 };
00224
00225 template <>
00226 struct PtypeTraits<ROOK>
00227 {
00228 static const bool isBasic=true;
00229 static const bool canPromote=true;
00230 static const bool betterToPromote=true;
00231 static const Ptype moveType=ROOK;
00232 static const char *name() { return "ROOK";}
00233 static const char *csaName() { return "HI";}
00234 static const int indexMin=38;
00235 static const int indexLimit=40;
00236 static const int dropBlackFromY=1;
00237 static const int dropBlackToY=9;
00238 static const int mayPromoteToY=9;
00239 static const int moveMask=
00240 DirectionTraits<LONG_U>::mask|DirectionTraits<LONG_L>::mask
00241 |DirectionTraits<LONG_R>::mask|DirectionTraits<LONG_D>::mask;
00242 };
00243
00244 template <>
00245 struct PtypeTraits<PROOK>
00246 {
00247 static const bool isBasic=false;
00248 static const bool canPromote=false;
00249
00250 static const bool betterToPromote=true;
00251 static const Ptype moveType=PROOK;
00252 static const char *name() { return "PROOK";}
00253 static const char *csaName() { return "RY";}
00254 static const int moveMask=
00255 DirectionTraits<LONG_U>::mask|DirectionTraits<LONG_L>::mask
00256 |DirectionTraits<LONG_R>::mask|DirectionTraits<LONG_D>::mask
00257 |DirectionTraits<UL>::mask|DirectionTraits<UR>::mask
00258 |DirectionTraits<DL>::mask|DirectionTraits<DR>::mask;
00259 static const Ptype basicType=ROOK;
00260 static const int indexMin=PtypeTraits<basicType>::indexMin;
00261 };
00262
00263
00264 template <>
00265 struct PtypeTraits<KING>
00266 {
00267 static const bool isBasic=true;
00268 static const bool canPromote=false;
00269 static const bool betterToPromote=false;
00270 static const Ptype moveType=KING;
00271 static const char *name() { return "KING";}
00272 static const char *csaName() { return "OU";}
00273 static const int indexMin=30;
00274 static const int indexLimit=32;
00275 static const int dropBlackFromY=1;
00276 static const int dropBlackToY=9;
00277 static const int moveMask=
00278 DirectionTraits<U>::mask|DirectionTraits<L>::mask
00279 |DirectionTraits<R>::mask|DirectionTraits<D>::mask
00280 |DirectionTraits<UL>::mask|DirectionTraits<UR>::mask
00281 |DirectionTraits<DL>::mask|DirectionTraits<DR>::mask;
00282 };
00283
00284 template<Ptype T,bool IsBasic>
00285 struct PtypeFunsSub;
00286
00287 template<Ptype T>
00288 struct PtypeFunsSub<T,true>
00289 {
00290 #if OSL_WORDSIZE == 64
00291 static const mask_int_t indexMask=static_cast<mask_int_t>((-1LL<<(PtypeTraits<T>::indexMin))^(-1LL<<(PtypeTraits<T>::indexLimit)));
00292 #elif OSL_WORDSIZE == 32
00293 static const mask_int_t indexMask=static_cast<mask_int_t>((-1<<(PtypeTraits<T>::indexMin&31))^((-1<<(((PtypeTraits<T>::indexLimit-1)&31)))<<1));
00294 #endif
00295 static const Ptype promotePtype=static_cast<Ptype>(static_cast<int>(T)-8);
00296 };
00297
00298 template<Ptype T>
00299 struct PtypeFunsSub<T,false>
00300 {
00301 static const mask_int_t indexMask=static_cast<mask_int_t>(0);
00302
00303 static const Ptype promotePtype=T;
00304 };
00305
00306 template<Ptype T>
00307 struct PtypeFuns
00308 {
00309 #if OSL_WORDSIZE == 64
00310 static const unsigned int indexNum=0;
00311 #elif OSL_WORDSIZE == 32
00312 static const unsigned int indexNum=(PtypeTraits<T>::indexMin >> 5);
00313 #endif
00314 static const bool hasLongMove=(PtypeTraits<T>::indexMin>=32);
00315 static const mask_int_t indexMask=PtypeFunsSub<T,PtypeTraits<T>::isBasic>::indexMask;
00316 static const Ptype promotePtype=PtypeFunsSub<T,PtypeTraits<T>::canPromote>::promotePtype;
00317 };
00318
00323 enum MoveConstraint {
00325 CannotMove,
00327 OnlyPromoted,
00329 OnlyBasic,
00331 NoConstraint,
00332 };
00333
00334 template<Ptype T,Direction D>
00335 struct PtypeDirectionTraits
00336 {
00337 static const bool hasMove=(PtypeTraits<T>::moveMask & DirectionTraits<D>::mask)!=0;
00338 static const bool canMove=
00339 (PtypeTraits<T>::moveMask & DirectionTraits<D>::mask)!=0 ||
00340 (PtypeTraits<T>::moveMask &
00341 DirectionTraits<DirectionTraits<D>::longDir>::mask)!=0;
00342 static const MoveConstraint moveConstraint =
00343 (PtypeDirectionTraits<T,D>::canMove
00344 ? (PtypeDirectionTraits<PtypeFuns<T>::promotePtype,D>::canMove
00345 ? NoConstraint : OnlyBasic )
00346 : (PtypeDirectionTraits<PtypeFuns<T>::promotePtype,D>::canMove
00347 ? OnlyPromoted : CannotMove));
00348 };
00349
00350
00351 template<Player T>
00352 struct KingTraits
00353 {
00354 static const int index=PtypeTraits<KING>::indexMin+PlayerTraits<T>::index;
00355 };
00356
00357 template<Ptype T,Player P>
00358 struct PtypePlayerTraits
00359 {
00360 static bool canDropTo(Position ,Int2Type<false>)
00361 {
00362 assert(0);
00363 return false;
00364 }
00365 static bool canDropTo(Position pos,Int2Type<true>)
00366 {
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() <= Position::reverseY(PtypeTraits<T>::dropBlackFromY);
00374 }
00375 static bool canDropTo(Position pos)
00376 {
00377 return canDropTo(pos,Int2Type<PtypeTraits<T>::isBasic>());
00378 }
00383 static bool mayPromote(Position pos,Int2Type<true>)
00384 {
00385 if (PtypeTraits<T>::mayPromoteToY == 9)
00386 return true;
00387
00388 if (P==BLACK)
00389 return pos.y() <= PtypeTraits<T>::mayPromoteToY;
00390 else
00391 return pos.y() >= Position::reverseY(PtypeTraits<T>::mayPromoteToY);
00392 }
00393 static bool mayPromote(Position pos)
00394 {
00395 return mayPromote(pos,Int2Type<PtypeTraits<T>::isBasic &&
00396 PtypeTraits<T>::canPromote>());
00397 }
00398 };
00399
00400
00401 }
00402
00403 #endif
00404
00405
00406
00407