1 #ifndef OSL_NUM_SIMPLE_EFFECT_H 2 #define OSL_NUM_SIMPLE_EFFECT_H 19 class NumSimpleEffectTable;
20 bool operator==(
const NumSimpleEffectTable&,
const NumSimpleEffectTable&);
21 std::ostream&
operator<<(std::ostream&,
const NumSimpleEffectTable&);
53 template<Player P,Ptype T,Direction Dir,NumBitmapEffect::Op OP,
bool UC>
59 effects[target.
index()].template opEqual<OP>(NumBitmapEffect::makeEffect<P>(num));
62 changed_effects[P].set(posIndex+BoardMask::getIndexOffset<Dir,P>());
66 effected_mask[P].set(num1);
70 effected_mask[P].reset(num1);
73 effected_changed_mask[P].set(num1);
88 template<Player P,Ptype T,Direction Dir,NumBitmapEffect::Op OP,
bool UC>
98 assert(!offset.
zero());
104 int count=((SD==
D || SD==
DL || SD==
DR) ? ePos.
y()-pos.
y() :
105 ( (SD==
U || SD==
UL || SD==
UR) ? pos.
y()-ePos.
y() :
106 ( SD==
L ? ePos.
x()-pos.
x() : pos.
x()-ePos.
x())));
107 assert(0<=count && count<=9);
109 for(
int i=1;i<count;i++){
111 posIndex+=BoardMask::getIndexOffset<Dir,BLACK>();
112 effects[pos.
index()].template opEqual<OP>(effect);
113 changed_effects[P].set(posIndex);
120 effects[ePos.
index()].template opEqual<OP>(effect);
121 effected_changed_mask[P].set(num1);
122 posIndex+=BoardMask::getIndexOffset<Dir,BLACK>();
123 changed_effects[P].set(posIndex);
125 effected_mask[P].reset(num1);
130 for(
int i=0;i<count;i++){
132 effects[pos.
index()].template opEqual<OP>(effect);
144 posIndex+=BoardMask::getIndexOffset<Dir,BLACK>();
145 changed_effects[P].set(posIndex);
147 effects[pos.
index()].template opEqual<OP>(effect);
154 effectedNumTable[num1][SD]=num;
155 changed_effects[P].set(posIndex);
156 effected_mask[P].set(num1);
157 effected_changed_mask[P].set(num1);
161 effectedNumTable[num1][SD]=num;
178 template<Player P,Ptype T,NumBitmapEffect::Op OP,
bool UC>
188 template<NumBitmapEffect::Op OP,
bool UC>
197 template<NumBitmapEffect::Op OP,
bool UC>
212 assert(reinterpret_cast<size_t>(
this) % 16 == 0);
221 return effects[pos.
index()];
229 template<NumBitmapEffect::Op OP,
bool UC>
236 return changed_effects[pl];
239 return changed_effect_pieces;
248 changed_effect_pieces |= effect;
251 changed_effects[0].clear();
252 changed_effects[1].clear();
256 changed_effects[0].invalidate();
257 changed_effects[1].invalidate();
258 changed_effect_pieces.
setAll();
261 effected_changed_mask[0].resetAll();
262 effected_changed_mask[1].resetAll();
284 template<osl::effect::NumBitmapEffect::Op OP,
bool UC>
289 setChangedPieces(effects[pos.
index()]);
294 int num=mask1.takeOneBit()+NumBitmapEffect::longToNumOffset;
295 assert(32<=num && num<=39);
303 Square endSquare=mobilityTable.get(d,num);
307 int pos2Index, offset81;
311 offset81=pos2Index-posIndex;
313 for(;pos2!=endSquare;pos2+=offset0){
315 changed_effects[pl1].set(pos2Index);
318 effects[pos2.
index()].template opEqual<OP>(effect);
320 effects[pos2.
index()].template opEqual<OP>(effect);
325 changed_effects[pl1].set(pos2Index);
327 effected_mask[pl1].reset(num1);
329 effected_changed_mask[pl1].set(num1);
330 mobilityTable.set(d,num,pos);
334 mobilityTable.set(d,num,pos);
335 effectedNumTable[piece_num][d]=num;
340 int pos2Index, offset81;
344 offset81=pos2Index-posIndex;
350 mobilityTable.set(d,num,pos2);
352 effectedNumTable[num1][d]=num;
353 effects[pos2.
index()].template opEqual<OP>(effect);
354 changed_effects[pl1].set(pos2Index);
355 effected_mask[pl1].set(num1);
356 effected_changed_mask[pl1].set(num1);
360 effectedNumTable[num1][d]=num;
361 effects[pos2.
index()].template opEqual<OP>(effect);
366 changed_effects[pl1].set(pos2Index);
369 effects[pos2.
index()].template opEqual<OP>(effect);
376 #endif // OSL_NUM_SIMPLE_EFFECT_H
void doBlockAt(const SimpleState &state, Square pos, int piece_num)
posに駒を設置/削除して長い利きをブロック/延長する際の利きデータの更新.
void doEffectLong(const SimpleState &state, Square pos, int num)
ある位置からある方向に長い利きがある時に,その方向の利きを更新する.
mobility::MobilityTable mobilityTable
mobility
GeneralMask< mask_int_t > mask_t
const PtypeO PTYPEO_EDGE __attribute__((unused))
static const mask_t longEffectMask()
bool operator==(const ProofDisproof &l, const ProofDisproof &r)
std::ostream & operator<<(std::ostream &, King8Info)
static mask_t playerEffectMask()
const Piece pieceAt(Square sq) const
const PieceMask effectedChanged(Player pl) const
int y() const
将棋としてのY座標を返す.
void clearEffectedChanged()
CArray< PieceMask, 2 > effected_mask
const BoardMask changedEffects(Player pl) const
int x() const
将棋としてのX座標を返す.
const NumBitmapEffect effectSetAt(Square pos) const
ある位置の利きデータを取り出す.
void invalidateChangedEffects()
const Piece pieceOf(int num) const
static bool isEdgeNum(int num)
void doEffect(const SimpleState &state, Piece p)
ある駒が持つ利きを更新する.
const Square get(Direction d, int num) const
NumSimpleEffectTable(const SimpleState &state)
コンストラクタ.
const PieceMask effectedMask(Player pl) const
constexpr int playerToIndex(Player player)
static bool isEmptyNum(int num)
unsigned int index() const
void set(Direction d, int num, Square pos)
constexpr Direction longToShort(Direction d)
const Square square() const
bool operator!=(const ProofDisproof &l, const ProofDisproof &r)
PtypeO
Player + Ptype [-15, 15] PtypeO の O は Owner の O.
CArray< PieceMask, 2 > effected_changed_mask
void setChangedPieces(NumBitmapEffect const &effect)
CArray< BoardMask, 2 > changed_effects
void doEffectShort(const SimpleState &state, Square pos, int num)
ある位置からある方向に短い利きがある時に,その方向の利きを更新する.
static bool isPieceNum(int num)
Direction getShort8(Square from, Square to) const
EffectedNumTable effectedNumTable
effected num
void clearChangedEffects()
const NumBitmapEffect changedPieces() const
static int index(int x, int y)
static const Square STAND()
const BoardTable Board_Table
static NumBitmapEffect makeLongEffect(int num)
NumBitmapEffect changed_effect_pieces
set of pieces whose effect changed by previous move