00001 #ifndef _MOVE_SIGNATURE_H 00002 #define _MOVE_SIGNATURE_H 00003 #include "osl/misc/carray.h" 00004 #include "osl/ptype.h" 00005 #include "osl/ptypeTraits.h" 00006 #include <iosfwd> 00007 00008 namespace osl 00009 { 00010 namespace effect 00011 { 00016 // enumˤsizeof(MoveSignature)1ˤʤʤǽΤ 00017 typedef unsigned char MoveSignature; 00018 const int MS_PLAYER=(1<<7); 00019 const int MS_LONG_U=(1<<5); 00020 const int MS_U=(1<<4); 00021 const int MS_UL_UR=(1<<3); 00022 const int MS_L_R_D=(1<<2); 00023 const int MS_DL_DR=(1<<1); 00024 const int MS_UUL_UUR=(1<<0); 00025 00026 template<Player P> 00027 inline MoveSignature getPlayerMask(); 00028 00029 template<> 00030 inline MoveSignature getPlayerMask<BLACK>(){ return 0; } 00031 00032 template<> 00033 inline MoveSignature getPlayerMask<WHITE>(){ return MS_PLAYER; } 00034 00035 std::ostream& operator<<(std::ostream& os,const MoveSignature signature); 00036 00037 template<Ptype T> 00038 struct SignatureTraits{ 00039 static const MoveSignature signature= 00040 ((PtypeTraits<T>::moveMask & DirectionTraits<LONG_U>::mask)!=0 ? MS_LONG_U : 0) | 00041 ((PtypeTraits<T>::moveMask & (DirectionTraits<LONG_U>::mask | DirectionTraits<U>::mask) )!=0 ? MS_U : 0) | 00042 ((PtypeTraits<T>::moveMask & (DirectionTraits<LONG_UL>::mask | DirectionTraits<UL>::mask) )!=0 ? MS_UL_UR : 0) | 00043 ((PtypeTraits<T>::moveMask & (DirectionTraits<LONG_L>::mask | DirectionTraits<L>::mask) )!=0 ? MS_L_R_D : 0) | 00044 ((PtypeTraits<T>::moveMask & (DirectionTraits<LONG_DL>::mask | DirectionTraits<DL>::mask) )!=0 ? MS_DL_DR : 0) | 00045 ((PtypeTraits<T>::moveMask & DirectionTraits<UUL>::mask)!=0 ? MS_UUL_UUR : 0); 00046 }; 00047 00048 const MoveSignature signature_EMPTY=getPlayerMask<BLACK>(); 00049 const MoveSignature signature_EDGE=getPlayerMask<WHITE>(); 00050 00054 class MoveSignatureTable{ 00055 CArray<MoveSignature,PTYPEO_SIZE> signatures; 00056 private: 00057 template<Ptype T> 00058 void setSignature(); 00059 template<Ptype T> 00060 void setSignatures(Int2Type<T>); 00061 public: 00062 MoveSignatureTable(); 00063 MoveSignature getSignature(PtypeO ptypeo) const{ 00064 assert(isValidPtypeO(ptypeo)); 00065 return signatures[static_cast<int>(ptypeo)-PTYPEO_MIN]; 00066 } 00067 }; 00068 extern const MoveSignatureTable Move_Signature_Table; 00069 } // namespace effect 00070 } // namespace osl 00071 #endif // _MOVE_SIGNATURE_H 00072 // ;;; Local Variables: 00073 // ;;; mode:c++ 00074 // ;;; c-basic-offset:2 00075 // ;;; End: