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