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"
7
8namespace osl
9{
10 namespace effect
11 {
29 {
30 public:
34 template<Player P>
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);
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>
53 static mask_t playerEffectMask(){
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
65 static mask_t playerEffectMask(Player pl){
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)
const mask_t selectLong() const
static NumBitmapEffect makeEffect(int num)
static NumBitmapEffect playerEffect(Player pl)
NumBitmapEffect & opEqual(NumBitmapEffect const &rhs)
static NumBitmapEffect makeLongEffect(Player pl, int num)
static mask_t playerEffectMask(Player pl)
static NumBitmapEffect makeLongEffect(int num)
Player
Definition basic_type.h:8
@ WHITE
Definition basic_type.h:10
@ BLACK
Definition basic_type.h:9