directionTraits.h
Go to the documentation of this file.
00001 /* directionTraits.h
00002  */
00003 #ifndef OSL_DIRECTIONTRAITS_H
00004 #define OSL_DIRECTIONTRAITS_H
00005 
00006 #include "osl/direction.h"
00007 #include "osl/offset.h"
00008 #include "osl/ptype.h"
00009 
00010 namespace osl
00011 {
00012   template<Direction Dir>
00013   struct DirectionTraitsGen;
00014   
00015   template<>
00016   struct DirectionTraitsGen<UL>{
00017       static const int blackDx=1;
00018       static const int blackDy=-1;
00019       static const bool canPromoteTo=true;
00020       static const Direction altDir=DR;
00021       static const Direction longDir=LONG_UL;
00022       static const Direction primDir=UL;
00023       static const int ptypeMask=
00024         (1<<PPAWN)|(1<<PLANCE)|(1<<PKNIGHT)|(1<<PSILVER)|(1<<PBISHOP)|
00025         (1<<PROOK)|(1<<KING)|(1<<GOLD)|(1<<SILVER)|(1<<BISHOP);
00026     };
00027   
00028   template<>
00029     struct DirectionTraitsGen<U>{
00030       static const int blackDx=0;
00031       static const int blackDy=-1;
00032       static const bool canPromoteTo=true;
00033       static const Direction altDir=D;
00034       static const Direction longDir=LONG_U;
00035       static const Direction primDir=U;
00036       static const int ptypeMask=
00037         (1<<PPAWN)|(1<<PLANCE)|(1<<PKNIGHT)|(1<<PSILVER)|(1<<PBISHOP)|
00038         (1<<PROOK)|(1<<KING)|(1<<GOLD)|(1<<PAWN)|(1<<LANCE)|(1<<SILVER)|(1<<ROOK);
00039     };
00040   
00041   template<>
00042     struct DirectionTraitsGen<UR>{
00043       static const int blackDx=-1;
00044       static const int blackDy=-1;
00045       static const bool canPromoteTo=true;
00046       static const Direction altDir=DL;
00047       static const Direction longDir=LONG_UR;
00048       static const Direction primDir=UR;
00049       static const int ptypeMask=
00050         (1<<PPAWN)|(1<<PLANCE)|(1<<PKNIGHT)|(1<<PSILVER)|(1<<PBISHOP)|
00051         (1<<PROOK)|(1<<KING)|(1<<GOLD)|(1<<SILVER)|(1<<BISHOP);
00052     };
00053   template<>
00054     struct DirectionTraitsGen<L>{
00055       static const int blackDx=1;
00056       static const int blackDy=0;
00057       static const bool canPromoteTo=false;
00058       static const Direction altDir=R;
00059       static const Direction longDir=LONG_L;
00060       static const Direction primDir=L;
00061       static const int ptypeMask=
00062         (1<<PPAWN)|(1<<PLANCE)|(1<<PKNIGHT)|(1<<PSILVER)|(1<<PBISHOP)|
00063         (1<<PROOK)|(1<<KING)|(1<<GOLD)|(1<<ROOK);
00064     };
00065   template<>
00066     struct DirectionTraitsGen<R>{
00067       static const int blackDx=-1;
00068       static const int blackDy=0;
00069       static const bool canPromoteTo=false;
00070       static const Direction altDir=L;
00071       static const Direction longDir=LONG_R;
00072       static const Direction primDir=L;
00073       static const int ptypeMask=
00074         (1<<PPAWN)|(1<<PLANCE)|(1<<PKNIGHT)|(1<<PSILVER)|(1<<PBISHOP)|
00075         (1<<PROOK)|(1<<KING)|(1<<GOLD)|(1<<ROOK);
00076     };
00077   template<>
00078     struct DirectionTraitsGen<DL>{
00079       static const int blackDx=1;
00080       static const int blackDy=1;
00081       static const bool canPromoteTo=false;
00082       static const Direction altDir=UR;
00083       static const Direction longDir=LONG_DL;
00084       static const Direction primDir=UR;
00085       static const int ptypeMask=
00086         (1<<PBISHOP)|(1<<PROOK)|(1<<KING)|(1<<SILVER)|(1<<BISHOP);
00087     };
00088   template<>
00089     struct DirectionTraitsGen<D>{
00090       static const int blackDx=0;
00091       static const int blackDy=1;
00092       static const bool canPromoteTo=false;
00093       static const Direction altDir=U;
00094       static const Direction longDir=LONG_D;
00095       static const Direction primDir=U;
00096       static const int ptypeMask=
00097         (1<<PPAWN)|(1<<PLANCE)|(1<<PKNIGHT)|(1<<PSILVER)|(1<<PBISHOP)|
00098         (1<<PROOK)|(1<<KING)|(1<<GOLD)|(1<<ROOK);
00099     };
00100   template<>
00101     struct DirectionTraitsGen<DR>{
00102       static const int blackDx=-1;
00103       static const int blackDy=1;
00104       static const bool canPromoteTo=false;
00105       static const Direction altDir=UL;
00106       static const Direction longDir=LONG_DR;
00107       static const Direction primDir=UL;
00108       static const int ptypeMask=
00109         (1<<PBISHOP)|(1<<PROOK)|(1<<KING)|(1<<SILVER)|(1<<BISHOP);
00110     };
00111   template<>
00112     struct DirectionTraitsGen<UUL>{
00113       static const int blackDx=1;
00114       static const int blackDy=-2;
00115       static const bool canPromoteTo=true;
00116       // no meaning
00117       static const Direction altDir=UUL;
00118       static const Direction longDir=UUL;
00119       static const Direction primDir=UUL;
00120       static const int ptypeMask=
00121         (1<<KNIGHT);
00122     };
00123   template<>
00124     struct DirectionTraitsGen<UUR>{
00125       static const int blackDx=-1;
00126       static const int blackDy=-2;
00127       static const bool canPromoteTo=true;
00128       // no meaning
00129       static const Direction altDir=UUR;
00130       static const Direction longDir=UUR;
00131       static const Direction primDir=UUR;
00132       static const int ptypeMask=
00133         (1<<KNIGHT);
00134     };
00135   
00136   template<>
00137     struct DirectionTraitsGen<LONG_UL>{
00138       static const bool canPromoteTo=true;
00139       static const Direction altDir=LONG_DR;
00140       static const Direction longDir=LONG_UL;
00141       static const Direction primDir=UL;
00142       static const int blackDx=DirectionTraitsGen<UL>::blackDx;
00143       static const int blackDy=DirectionTraitsGen<UL>::blackDy;
00144       static const int ptypeMask=
00145         (1<<PBISHOP)|(1<<BISHOP);
00146     };
00147   
00148   template<>
00149     struct DirectionTraitsGen<LONG_U>{
00150       static const bool canPromoteTo=true;
00151       static const Direction altDir=LONG_D;
00152       static const Direction longDir=LONG_U;
00153       static const Direction primDir=U;
00154       static const int blackDx=DirectionTraitsGen<U>::blackDx;
00155       static const int blackDy=DirectionTraitsGen<U>::blackDy;
00156       static const int ptypeMask=
00157         (1<<LANCE)|(1<<ROOK)|(1<<PROOK);
00158     };
00159   
00160   template<>
00161     struct DirectionTraitsGen<LONG_UR>{
00162       static const bool canPromoteTo=true;
00163       static const Direction altDir=LONG_DL;
00164       static const Direction longDir=LONG_UR;
00165       static const Direction primDir=UR;
00166       static const int blackDx=DirectionTraitsGen<UR>::blackDx;
00167       static const int blackDy=DirectionTraitsGen<UR>::blackDy;
00168       static const int ptypeMask=
00169         (1<<PBISHOP)|(1<<BISHOP);
00170     };
00171   template<>
00172     struct DirectionTraitsGen<LONG_L>{
00173       static const bool canPromoteTo=false;
00174       static const Direction altDir=LONG_R;
00175       static const Direction longDir=LONG_L;
00176       static const Direction primDir=L;
00177       static const int blackDx=DirectionTraitsGen<L>::blackDx;
00178       static const int blackDy=DirectionTraitsGen<L>::blackDy;
00179       static const int ptypeMask=
00180         (1<<ROOK)|(1<<PROOK);
00181     };
00182   template<>
00183     struct DirectionTraitsGen<LONG_R>{
00184       static const bool canPromoteTo=false;
00185       static const Direction altDir=LONG_L;
00186       static const Direction longDir=LONG_R;
00187       static const Direction primDir=L;
00188       static const int blackDx=DirectionTraitsGen<R>::blackDx;
00189       static const int blackDy=DirectionTraitsGen<R>::blackDy;
00190       static const int ptypeMask=
00191         (1<<ROOK)|(1<<PROOK);
00192     };
00193   template<>
00194     struct DirectionTraitsGen<LONG_DL>{
00195       static const bool canPromoteTo=false;
00196       static const Direction altDir=LONG_UR;
00197       static const Direction longDir=LONG_DL;
00198       static const Direction primDir=UR;
00199       static const int blackDx=DirectionTraitsGen<DL>::blackDx;
00200       static const int blackDy=DirectionTraitsGen<DL>::blackDy;
00201       static const int ptypeMask=
00202         (1<<PBISHOP)|(1<<BISHOP);
00203     };
00204   template<>
00205     struct DirectionTraitsGen<LONG_D>{
00206       static const bool canPromoteTo=false;
00207       static const Direction altDir=LONG_U;
00208       static const Direction longDir=LONG_D;
00209       static const Direction primDir=U;
00210       static const int blackDx=DirectionTraitsGen<D>::blackDx;
00211       static const int blackDy=DirectionTraitsGen<D>::blackDy;
00212       static const int ptypeMask=
00213         (1<<ROOK)|(1<<PROOK);
00214     };
00215   template<>
00216     struct DirectionTraitsGen<LONG_DR>{
00217       static const bool canPromoteTo=false;
00218       static const Direction altDir=LONG_UL;
00219       static const Direction longDir=LONG_DR;
00220       static const Direction primDir=UL;
00221       static const int blackDx=DirectionTraitsGen<DR>::blackDx;
00222       static const int blackDy=DirectionTraitsGen<DR>::blackDy;
00223       static const int ptypeMask=
00224         (1<<PBISHOP)|(1<<BISHOP);
00225     };
00226   template<Direction Dir>
00227   struct DirectionTraits{
00228     // これらを関数にすると押し込められる
00229     static const unsigned int mask=1<<static_cast<int>(Dir);
00230     static const bool isLong=(static_cast<int>(Dir) >= LONG_UL);
00231     static const int blackDx=DirectionTraitsGen<Dir>::blackDx;
00232     static const int blackDy=DirectionTraitsGen<Dir>::blackDy;
00233     static const Offset blackOffset() { return Offset(blackDx,blackDy); }
00234       static const bool canPromoteTo=DirectionTraitsGen<Dir>::canPromoteTo;
00235       static const Direction longDir=DirectionTraitsGen<Dir>::longDir;
00236     static const int ptypeMask=DirectionTraitsGen<Dir>::ptypeMask;
00237     static const int ptypeMaskNotKing=DirectionTraitsGen<Dir>::ptypeMask &
00238                                       ~(1<<KING);
00239     static const Direction primDir=DirectionTraitsGen<Dir>::primDir;
00240     static const Direction altDir=DirectionTraitsGen<Dir>::altDir;
00241     };
00242   
00243   template<Direction Dir,Player P>
00244     struct DirectionPlayerTraits;
00245   
00246   template<Direction Dir>
00247     struct DirectionPlayerTraits<Dir,BLACK>{
00248       static const Offset offset() { 
00249         return DirectionTraits<Dir>::blackOffset(); 
00250       }
00251       static const Direction directionByBlack=Dir;
00252     };
00253   template<Direction Dir> 
00254   const Direction DirectionPlayerTraits<Dir,BLACK>::directionByBlack;
00255   
00256   template<Direction Dir>
00257     struct DirectionPlayerTraits<Dir,WHITE>{
00258       static const Offset offset() { 
00259         return -DirectionTraits<Dir>::blackOffset();
00260       }
00261       static const Direction directionByBlack=DirectionTraitsGen<Dir>::altDir;
00262     };
00263   template<Direction Dir> 
00264   const Direction DirectionPlayerTraits<Dir,WHITE>::directionByBlack;
00265 
00266   template <Player P, Direction D>
00267   Offset Offset::make() {
00268     return DirectionPlayerTraits<D,P>::offset();
00269   }
00270 } // namespace osl
00271 
00272 #endif /* OSL_DIRECTIONTRAITS_H */
00273 // ;;; Local Variables:
00274 // ;;; mode:c++
00275 // ;;; c-basic-offset:2
00276 // ;;; coding:utf-8
00277 // ;;; End:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines