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