moveSignature.h
Go to the documentation of this file.
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:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines