00001 #ifndef OSL_NUM_BITMAP_EFFECT_H 00002 #define OSL_NUM_BITMAP_EFFECT_H 00003 00004 #include "osl/basic_type.h" 00005 #include "osl/bits/ptypeTraits.h" 00006 #include "osl/bits/pieceMask.h" 00007 00008 namespace osl 00009 { 00010 namespace effect 00011 { 00028 class NumBitmapEffect : public PieceMask 00029 { 00030 public: 00031 NumBitmapEffect(){ 00032 resetAll(); 00033 } 00034 template<Player P> 00035 static NumBitmapEffect playerEffect(){ 00036 NumBitmapEffect ret; 00037 if (P == BLACK) ret.flip(48); 00038 else ret.flip(54); 00039 return ret; 00040 } 00041 static NumBitmapEffect playerEffect(Player pl){ 00042 mask_t mask1=numToMask(54); 00043 mask1-=numToMask(48); 00044 mask1&=mask_t::makeDirect(pl); 00045 mask1+=numToMask(48); 00046 NumBitmapEffect ret; 00047 ret.setMask(1,mask1); 00048 assert((pl==BLACK && ret==playerEffect<BLACK>()) || 00049 (pl==WHITE && ret==playerEffect<WHITE>())); 00050 return ret; 00051 } 00052 template<Player P> 00053 static mask_t playerEffectMask(){ 00054 if (P == BLACK) { 00055 mask_t mask1=numToMask(54); 00056 mask1-=numToMask(48); 00057 return mask1; 00058 } else { 00059 mask_t mask1=numToMask(60); 00060 mask1-=numToMask(54); 00061 return mask1; 00062 } 00063 } 00064 00065 static mask_t playerEffectMask(Player pl){ 00066 mask_t mask1=numToMask(60); 00067 mask1-=numToMask(48); 00068 mask1&=mask_t::makeDirect(pl); 00069 // pl==BLACK -> mask1 = 0 00070 // pl==WHITE -> mask1 = 0x0fff0000(32bit), 0x0fff000000000000(64bit) 00071 mask_t mask2=numToMask(54); 00072 mask2-=numToMask(48); 00073 // mask2 = 0x3f0000(32bit), 0x3f000000000000(64bit) 00074 mask1^=mask2; 00075 // pl==BLACK -> mask1 = 0x3f0000(32bit), 0x3f000000000000(64bit) 00076 // pl==WHITE -> mask2 = 0x0fc00000(32bit), 0x0fc0000000000000(64bit) 00077 assert((pl==BLACK && mask1==playerEffectMask<BLACK>()) || 00078 (pl==WHITE && mask1==playerEffectMask<WHITE>())); 00079 return mask1; 00080 } 00081 int countEffect(Player pl) const { 00082 int shift=48+(6&pl); 00083 mask_t mask=getMask(1); 00084 mask>>=numToOffset(shift); 00085 mask&=mask_t::makeDirect(0x3f); 00086 return static_cast<int>(mask.value()); 00087 } 00088 00089 template<Player P> 00090 static NumBitmapEffect makeEffect(int num){ 00091 NumBitmapEffect effect=playerEffect<P>(); 00092 effect.flip(num); 00093 return effect; 00094 } 00095 enum Op{ 00096 Add,Sub, 00097 }; 00098 template<Op OP> 00099 NumBitmapEffect& opEqual(NumBitmapEffect const& rhs){ 00100 if (OP == Add) 00101 *this+=rhs; 00102 else 00103 *this-=rhs; 00104 return *this; 00105 } 00106 00107 static const mask_t longEffectMask() { 00108 #if OSL_WORDSIZE == 64 00109 return mask_t::makeDirect(0xff0000000000uLL); 00110 #elif OSL_WORDSIZE == 32 00111 return mask_t::makeDirect(0xff00u); 00112 #endif 00113 } 00114 #if OSL_WORDSIZE == 64 00115 static const int longToNumOffset=-8; 00116 #elif OSL_WORDSIZE == 32 00117 static const int longToNumOffset=32-8; 00118 #endif 00119 static const mask_t makeLongMask(int num) 00120 { 00121 return mask_t::makeDirect(0x101) << PieceMask::numToOffset(num); 00122 } 00123 template<Player P> 00124 static NumBitmapEffect makeLongEffect(int num){ 00125 assert(32<=num && num<=39); 00126 NumBitmapEffect effect=NumBitmapEffect::playerEffect<P>(); 00127 effect.orMask(1,makeLongMask(num)); 00128 return effect; 00129 } 00130 static NumBitmapEffect makeLongEffect(Player pl,int num){ 00131 assert(32<=num && num<=39); 00132 NumBitmapEffect effect=NumBitmapEffect::playerEffect(pl); 00133 effect.orMask(1,makeLongMask(num)); 00134 return effect; 00135 } 00136 00137 // utility methods 00138 const mask_t selectLong() const 00139 { 00140 return (getMask(1) & longEffectMask()); 00141 } 00142 bool hasLong() const 00143 { 00144 return selectLong().any(); 00145 } 00146 template <Ptype PTYPE> const mask_t selectLong() const 00147 { 00148 return selectLong() 00149 & mask_t::makeDirect(PtypeFuns<PTYPE>::indexMask << 8); 00150 } 00151 template <Ptype PTYPE> bool hasLong() const 00152 { 00153 return selectLong<PTYPE>().any(); 00154 } 00155 template <Ptype PTYPE> bool hasAny() const 00156 { 00157 return (getMask(PtypeFuns<PTYPE>::indexNum) 00158 & mask_t::makeDirect(PtypeFuns<PTYPE>::indexMask)).any(); 00159 } 00160 }; 00161 } // namespace effect 00162 } // namespace osl 00163 #endif // _NUM_BITMAP_EFFECT_H 00164 // ;;; Local Variables: 00165 // ;;; mode:c++ 00166 // ;;; c-basic-offset:2 00167 // ;;; End: