1 #ifndef OSL_NUM_SIMPLE_EFFECT_H 
    2 #define OSL_NUM_SIMPLE_EFFECT_H 
   13 #include <boost/static_assert.hpp> 
   23     class NumSimpleEffectTable;
 
   24     bool operator==(
const NumSimpleEffectTable&,
const NumSimpleEffectTable&);
 
   25     std::ostream& 
operator<<(std::ostream&, 
const NumSimpleEffectTable&);
 
   33       CArray<NumBitmapEffect, Square::SIZE> 
effects 
   57       template<Player P,Ptype T,Direction Dir,NumBitmapEffect::Op OP,
bool UC>
 
   63             effects[target.
index()].template opEqual<OP>(NumBitmapEffect::makeEffect<P>(num));
 
   65               int posIndex=BoardMask::index(pos);
 
   92       template<Player P,Ptype T,Direction Dir,NumBitmapEffect::Op OP,
bool UC>
 
   99               posIndex=BoardMask::index(pos);
 
  102             assert(!offset.
zero());
 
  108               int count=((SD==
D || SD==
DL || SD==
DR) ? ePos.
y()-pos.
y() :
 
  109                          ( (SD==
U || SD==
UL || SD==
UR) ? pos.
y()-ePos.
y() :
 
  110                            ( SD==
L ? ePos.
x()-pos.
x() : pos.
x()-ePos.
x())));
 
  111               assert(0<=count && count<=9);
 
  113                 for(
int i=1;i<
count;i++){
 
  115                   posIndex+=BoardMask::getIndexOffset<Dir,BLACK>();
 
  121                 int num1=state.pieceAt(ePos).number();
 
  126                   posIndex+=BoardMask::getIndexOffset<Dir,BLACK>();
 
  134                 for(
int i=0;i<
count;i++){
 
  138                 int num1=state.pieceAt(ePos).number();
 
  148                     posIndex+=BoardMask::getIndexOffset<Dir,BLACK>();
 
  153                   int num1=state.pieceAt(pos).number();
 
  182       template<Player P,Ptype T,NumBitmapEffect::Op OP,
bool UC>
 
  192       template<NumBitmapEffect::Op OP,
bool UC>
 
  201       template<NumBitmapEffect::Op OP,
bool UC>
 
  210       void init(
const SimpleState& state);
 
  216         assert(reinterpret_cast<size_t>(
this) % 16 == 0);
 
  233       template<NumBitmapEffect::Op OP,
bool UC>
 
  278   using effect::NumBitmapEffect;
 
  288 template<osl::effect::NumBitmapEffect::Op OP,
bool UC>
 
  293     setChangedPieces(effects[pos.
index()]);
 
  296                  & NumBitmapEffect::longEffectMask());
 
  298     int num=mask1.takeOneBit()+NumBitmapEffect::longToNumOffset;
 
  299     assert(32<=num && num<=39);
 
  300     Piece p1=state.pieceOf(num);
 
  306     if(OP==NumBitmapEffect::Sub){
 
  307       Square endSquare=mobilityTable.get(d,num);
 
  311       int pos2Index, offset81;
 
  313         int posIndex=BoardMask::index(pos);
 
  314         pos2Index=BoardMask::index(pos2);
 
  315         offset81=pos2Index-posIndex;
 
  317       for(;pos2!=endSquare;pos2+=offset0){
 
  319           changed_effects[pl1].set(pos2Index);
 
  322         effects[pos2.
index()].template opEqual<OP>(effect);
 
  324       effects[pos2.
index()].template opEqual<OP>(effect);
 
  325       int num1=state.pieceAt(endSquare).number();
 
  326       if (!Piece::isEdgeNum(num1)){
 
  329           changed_effects[pl1].set(pos2Index);
 
  330           if((effects[endSquare.
index()].getMask(1)&NumBitmapEffect::playerEffectMask(pl1)).none()){
 
  331             effected_mask[pl1].reset(num1);
 
  333           effected_changed_mask[pl1].set(num1);
 
  334           mobilityTable.set(d,num,pos);
 
  338         mobilityTable.set(d,num,pos);
 
  339       effectedNumTable[piece_num][d]=num;
 
  344       int pos2Index, offset81;
 
  346         int posIndex=BoardMask::index(pos);
 
  347         pos2Index=BoardMask::index(pos2);
 
  348         offset81=pos2Index-posIndex;
 
  351         int num1=state.pieceAt(pos2).number();
 
  352         if(!Piece::isEmptyNum(num1)){
 
  354             mobilityTable.set(d,num,pos2);
 
  355             if(!Piece::isEdgeNum(num1)){
 
  356               effectedNumTable[num1][d]=num;
 
  357               effects[pos2.
index()].template opEqual<OP>(effect);
 
  358               changed_effects[pl1].set(pos2Index);
 
  359               effected_mask[pl1].set(num1);
 
  360               effected_changed_mask[pl1].set(num1);
 
  363           else if(!Piece::isEdgeNum(num1)){
 
  364             effectedNumTable[num1][d]=num;
 
  365             effects[pos2.
index()].template opEqual<OP>(effect);
 
  370           changed_effects[pl1].set(pos2Index);
 
  373         effects[pos2.
index()].template opEqual<OP>(effect);
 
  380 #endif // OSL_NUM_SIMPLE_EFFECT_H