My Project
numBitmapEffect.h
Go to the documentation of this file.
1 #ifndef OSL_NUM_BITMAP_EFFECT_H
2 #define OSL_NUM_BITMAP_EFFECT_H
3 
4 #include "osl/basic_type.h"
5 #include "osl/bits/ptypeTraits.h"
6 #include "osl/bits/pieceMask.h"
7 
8 namespace osl
9 {
10  namespace effect
11  {
28  class NumBitmapEffect : public PieceMask
29  {
30  public:
32  resetAll();
33  }
34  template<Player P>
36  NumBitmapEffect ret;
37  if (P == BLACK) ret.flip(48);
38  else ret.flip(54);
39  return ret;
40  }
42  mask_t mask1=numToMask(54);
43  mask1-=numToMask(48);
44  mask1&=mask_t::makeDirect(pl);
45  mask1+=numToMask(48);
46  NumBitmapEffect ret;
47  ret.setMask(1,mask1);
48  assert((pl==BLACK && ret==playerEffect<BLACK>()) ||
49  (pl==WHITE && ret==playerEffect<WHITE>()));
50  return ret;
51  }
52  template<Player P>
54  if (P == BLACK) {
55  mask_t mask1=numToMask(54);
56  mask1-=numToMask(48);
57  return mask1;
58  } else {
59  mask_t mask1=numToMask(60);
60  mask1-=numToMask(54);
61  return mask1;
62  }
63  }
64 
66  mask_t mask1=numToMask(60);
67  mask1-=numToMask(48);
68  mask1&=mask_t::makeDirect(pl);
69  // pl==BLACK -> mask1 = 0
70  // pl==WHITE -> mask1 = 0x0fff0000(32bit), 0x0fff000000000000(64bit)
71  mask_t mask2=numToMask(54);
72  mask2-=numToMask(48);
73  // mask2 = 0x3f0000(32bit), 0x3f000000000000(64bit)
74  mask1^=mask2;
75  // pl==BLACK -> mask1 = 0x3f0000(32bit), 0x3f000000000000(64bit)
76  // pl==WHITE -> mask2 = 0x0fc00000(32bit), 0x0fc0000000000000(64bit)
77  assert((pl==BLACK && mask1==playerEffectMask<BLACK>()) ||
78  (pl==WHITE && mask1==playerEffectMask<WHITE>()));
79  return mask1;
80  }
81  int countEffect(Player pl) const {
82  int shift=48+(6&pl);
83  mask_t mask=getMask(1);
84  mask>>=numToOffset(shift);
85  mask&=mask_t::makeDirect(0x3f);
86  return static_cast<int>(mask.value());
87  }
88 
89  template<Player P>
90  static NumBitmapEffect makeEffect(int num){
91  NumBitmapEffect effect=playerEffect<P>();
92  effect.flip(num);
93  return effect;
94  }
95  enum Op{
97  };
98  template<Op OP>
100  if (OP == Add)
101  *this+=rhs;
102  else
103  *this-=rhs;
104  return *this;
105  }
106 
107  static const mask_t longEffectMask() {
108 #if OSL_WORDSIZE == 64
109  return mask_t::makeDirect(0xff0000000000uLL);
110 #elif OSL_WORDSIZE == 32
111  return mask_t::makeDirect(0xff00u);
112 #endif
113  }
114 #if OSL_WORDSIZE == 64
115  static const int longToNumOffset=-8;
116 #elif OSL_WORDSIZE == 32
117  static const int longToNumOffset=32-8;
118 #endif
119  static const mask_t makeLongMask(int num)
120  {
121  return mask_t::makeDirect(0x101) << PieceMask::numToOffset(num);
122  }
123  template<Player P>
125  assert(32<=num && num<=39);
126  NumBitmapEffect effect=NumBitmapEffect::playerEffect<P>();
127  effect.orMask(1,makeLongMask(num));
128  return effect;
129  }
131  assert(32<=num && num<=39);
133  effect.orMask(1,makeLongMask(num));
134  return effect;
135  }
136 
137  // utility methods
138  const mask_t selectLong() const
139  {
140  return (getMask(1) & longEffectMask());
141  }
142  bool hasLong() const
143  {
144  return selectLong().any();
145  }
146  template <Ptype PTYPE> const mask_t selectLong() const
147  {
148  return selectLong()
149  & mask_t::makeDirect(PtypeFuns<PTYPE>::indexMask << 8);
150  }
151  template <Ptype PTYPE> bool hasLong() const
152  {
153  return selectLong<PTYPE>().any();
154  }
155  template <Ptype PTYPE> bool hasAny() const
156  {
158  & mask_t::makeDirect(PtypeFuns<PTYPE>::indexMask)).any();
159  }
160  };
161  } // namespace effect
162 } // namespace osl
163 #endif // _NUM_BITMAP_EFFECT_H
164 // ;;; Local Variables:
165 // ;;; mode:c++
166 // ;;; c-basic-offset:2
167 // ;;; End:
駒番号のビットセット.
Definition: pieceMask.h:21
const mask_t getMask() const
unpromote(PTYPE) の駒のbit を*含む*mask_tを取り出す
Definition: pieceMask.h:62
void setMask(int index, mask_t val)
Definition: pieceMask.h:28
void orMask(int index, mask_t val)
Definition: pieceMask.h:42
void flip(int num)
Definition: pieceMask.h:51
static const mask_t numToMask(int num)
Definition: pieceMask.h:25
static int numToOffset(int num)
Definition: pieceMask64.h:17
現在の定義 (2005/3/4以降)
int countEffect(Player pl) const
static NumBitmapEffect playerEffect()
static const mask_t longEffectMask()
const mask_t selectLong() const
static const mask_t makeLongMask(int num)
NumBitmapEffect & opEqual(NumBitmapEffect const &rhs)
const mask_t selectLong() const
static NumBitmapEffect makeEffect(int num)
static mask_t playerEffectMask()
static NumBitmapEffect playerEffect(Player pl)
static NumBitmapEffect makeLongEffect(Player pl, int num)
static mask_t playerEffectMask(Player pl)
static NumBitmapEffect makeLongEffect(int num)
GeneralMask< mask_int_t > mask_t
Definition: mask.h:351
Player
Definition: basic_type.h:8
@ WHITE
Definition: basic_type.h:10
@ BLACK
Definition: basic_type.h:9