00001 #ifndef _NUM_BITMAP_EFFECT_H 00002 #define _NUM_BITMAP_EFFECT_H 00003 00004 #include "osl/player.h" 00005 #include "osl/container/pieceMask.h" 00006 #include "osl/misc/loki.h" 00007 00008 namespace osl 00009 { 00010 namespace effect 00011 { 00028 class NumBitmapEffect : public PieceMask 00029 { 00030 private: 00031 static NumBitmapEffect playerEffect(misc::Int2Type<BLACK>){ 00032 NumBitmapEffect ret; 00033 ret.flip(48); 00034 return ret; 00035 } 00036 static NumBitmapEffect playerEffect(misc::Int2Type<WHITE>){ 00037 NumBitmapEffect ret; 00038 ret.flip(54); 00039 return ret; 00040 } 00041 static mask_t playerEffectMask(misc::Int2Type<BLACK>){ 00042 mask_t mask1=numToMask(54); 00043 mask1-=numToMask(48); 00044 return mask1; 00045 } 00046 static mask_t playerEffectMask(misc::Int2Type<WHITE>){ 00047 mask_t mask1=numToMask(60); 00048 mask1-=numToMask(54); 00049 return mask1; 00050 } 00051 00052 public: 00053 NumBitmapEffect(){ 00054 resetAll(); 00055 } 00056 template<Player P> 00057 static NumBitmapEffect playerEffect(){ 00058 return playerEffect(misc::Int2Type<P>()); 00059 } 00060 static NumBitmapEffect playerEffect(Player pl){ 00061 mask_t mask1=numToMask(54); 00062 mask1-=numToMask(48); 00063 mask1&=mask_t::makeDirect(pl); 00064 mask1+=numToMask(48); 00065 NumBitmapEffect ret; 00066 ret.setMask(1,mask1); 00067 assert((pl==BLACK && ret==playerEffect<BLACK>()) || 00068 (pl==WHITE && ret==playerEffect<WHITE>())); 00069 return ret; 00070 } 00071 template<Player P> 00072 static mask_t playerEffectMask(){ 00073 return playerEffectMask(misc::Int2Type<P>()); 00074 } 00075 static mask_t playerEffectMask(Player pl){ 00076 mask_t mask1=numToMask(60); 00077 mask1-=numToMask(48); 00078 mask1&=mask_t::makeDirect(pl); 00079 // pl==BLACK -> mask1 = 0 00080 // pl==WHITE -> mask1 = 0x0fff0000(32bit), 0x0fff000000000000(64bit) 00081 mask_t mask2=numToMask(54); 00082 mask2-=numToMask(48); 00083 // mask2 = 0x3f0000(32bit), 0x3f000000000000(64bit) 00084 mask1^=mask2; 00085 // pl==BLACK -> mask1 = 0x3f0000(32bit), 0x3f000000000000(64bit) 00086 // pl==WHITE -> mask2 = 0x0fc00000(32bit), 0x0fc0000000000000(64bit) 00087 assert((pl==BLACK && mask1==playerEffectMask<BLACK>()) || 00088 (pl==WHITE && mask1==playerEffectMask<WHITE>())); 00089 return mask1; 00090 } 00091 int countEffect(Player pl) const { 00092 int shift=48+(6&pl); 00093 mask_t mask=getMask(1); 00094 mask>>=numToOffset(shift); 00095 mask&=mask_t::makeDirect(0x3f); 00096 return static_cast<int>(mask.value()); 00097 } 00098 00099 template<Player P> 00100 static NumBitmapEffect makeEffect(int num){ 00101 NumBitmapEffect effect=playerEffect<P>(); 00102 effect.flip(num); 00103 return effect; 00104 } 00105 enum Op{ 00106 Add,Sub, 00107 }; 00108 NumBitmapEffect& opEqual(NumBitmapEffect const& rhs, 00109 misc::Int2Type<Add>){ 00110 *this+=rhs; 00111 return *this; 00112 } 00113 NumBitmapEffect& opEqual(NumBitmapEffect const& rhs, 00114 misc::Int2Type<Sub>){ 00115 *this-=rhs; 00116 return *this; 00117 } 00118 template<Op OP> 00119 NumBitmapEffect& opEqual(NumBitmapEffect const& rhs){ 00120 return opEqual(rhs,misc::Int2Type<OP>()); 00121 } 00122 }; 00123 } // namespace effect 00124 } // namespace osl 00125 #endif // _NUM_BITMAP_EFFECT_H 00126 // ;;; Local Variables: 00127 // ;;; mode:c++ 00128 // ;;; c-basic-offset:2 00129 // ;;; End: