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));
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>();
122 posIndex+=BoardMask::getIndexOffset<Dir,BLACK>();
130 for(
int i=0;i<count;i++){
144 posIndex+=BoardMask::getIndexOffset<Dir,BLACK>();
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);
229 template<NumBitmapEffect::Op OP,
bool UC>
274 using effect::NumBitmapEffect;
284 template<osl::effect::NumBitmapEffect::Op OP,
bool UC>
289 setChangedPieces(effects[pos.
index()]);
292 & NumBitmapEffect::longEffectMask());
294 int num=mask1.takeOneBit()+NumBitmapEffect::longToNumOffset;
295 assert(32<=num && num<=39);
302 if(OP==NumBitmapEffect::Sub){
303 Square endSquare=mobilityTable.get(d,num);
307 int pos2Index, offset81;
309 int posIndex=BoardMask::index(pos);
310 pos2Index=BoardMask::index(pos2);
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);
322 if (!Piece::isEdgeNum(num1)){
325 changed_effects[pl1].set(pos2Index);
326 if((effects[endSquare.
index()].getMask(1)&NumBitmapEffect::playerEffectMask(pl1)).none()){
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;
342 int posIndex=BoardMask::index(pos);
343 pos2Index=BoardMask::index(pos2);
344 offset81=pos2Index-posIndex;
348 if(!Piece::isEmptyNum(num1)){
350 mobilityTable.set(d,num,pos2);
351 if(!Piece::isEdgeNum(num1)){
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);
359 else if(!Piece::isEdgeNum(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);
Direction getShort8(Square from, Square to) const
const Square square() const
static bool isPieceNum(int num)
static bool isEmptyNum(int num)
static bool isEdgeNum(int num)
const Piece pieceOf(int num) const
const Piece pieceAt(Square sq) const
unsigned int index() const
int y() const
将棋としてのY座標を返す.
static const Square STAND()
int x() const
将棋としてのX座標を返す.
static int index(int x, int y)
static mask_t playerEffectMask()
void clearEffectedChanged()
void copyFrom(const NumSimpleEffectTable &src)
主要部分を高速にコピーする.
void doEffect(const SimpleState &state, PtypeO ptypeo, Square pos, int num)
ある種類の駒が持つ利きを更新する.
EffectedNumTable effectedNumTable
effected num
const BoardMask changedEffects(Player pl) const
void doEffectLong(const SimpleState &state, Square pos, int num)
ある位置からある方向に長い利きがある時に,その方向の利きを更新する.
void doEffectShort(const SimpleState &state, Square pos, int num)
ある位置からある方向に短い利きがある時に,その方向の利きを更新する.
void clearChangedEffects()
const NumBitmapEffect effectSetAt(Square pos) const
ある位置の利きデータを取り出す.
void doEffect(const SimpleState &state, Piece p)
ある駒が持つ利きを更新する.
void invalidateChangedEffects()
const NumBitmapEffect changedPieces() const
const PieceMask effectedMask(Player pl) const
friend bool operator==(const NumSimpleEffectTable &et1, const NumSimpleEffectTable &et2)
NumSimpleEffectTable(const SimpleState &state)
コンストラクタ.
void init(const SimpleState &state)
盤面のデータを元に初期化する.
void doBlockAt(const SimpleState &state, Square pos, int piece_num)
posに駒を設置/削除して長い利きをブロック/延長する際の利きデータの更新.
void doEffectBy(const SimpleState &state, Square pos, int num)
ある種類の駒が持つ利きを更新する.
CArray< NumBitmapEffect, Square::SIZE > effects
const PieceMask effectedChanged(Player pl) const
mobility::MobilityTable mobilityTable
mobility
CArray< PieceMask, 2 > effected_mask
void setChangedPieces(NumBitmapEffect const &effect)
CArray< BoardMask, 2 > changed_effects
CArray< PieceMask, 2 > effected_changed_mask
NumBitmapEffect changed_effect_pieces
set of pieces whose effect changed by previous move
const Square get(Direction d, int num) const
void set(Direction d, int num, Square pos)
std::ostream & operator<<(std::ostream &, const EffectedNumTable &)
bool operator==(const EffectedNumTable &, const EffectedNumTable &)
bool operator!=(const NumSimpleEffectTable &et1, const NumSimpleEffectTable &et2)
GeneralMask< mask_int_t > mask_t
constexpr Direction longToShort(Direction d)
constexpr int playerToIndex(Player player)
const BoardTable Board_Table
const PtypeO PTYPEO_EDGE __attribute__((unused))
PtypeO
Player + Ptype [-15, 15] PtypeO の O は Owner の O.