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: