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