My Project
boardMask.h
Go to the documentation of this file.
1 /* boardMask.h
2  */
3 #ifndef OSL_BOARDMASK_H
4 #define OSL_BOARDMASK_H
5 
6 #include "osl/basic_type.h"
8 #include "osl/bits/mask.h"
9 #include "osl/container.h"
10 #include <iosfwd>
11 
12 namespace osl
13 {
14  namespace container
15  {
16  class BoardMask;
17  bool operator==(const BoardMask&, const BoardMask&);
18  std::ostream& operator<<(std::ostream&, const BoardMask&);
20  class BoardMask
21  {
24  public:
26  BoardMask(const BoardMask& src) {
27  contents[0] = src.contents[0];
28  contents[1] = src.contents[1];
29  }
30  BoardMask& operator=(const BoardMask& src) {
31  if (this != &src) {
32  contents[0] = src.contents[0];
33  contents[1] = src.contents[1];
34  }
35  return *this;
36  }
37  void clear() { contents[0]=contents[1]=0; }
38  void invalidate() { contents[0] = static_cast<uint64_t>(-1); }
39  bool isInvalid() const { return contents[0] == static_cast<uint64_t>(-1); }
40  void set(unsigned int i) {
41  int j=(i>>6);
42  contents[j]|=(1ull<<(i&63));
43  }
44  void set(Square pos) {
45  set(index(pos));
46  }
47  void reset(unsigned int i) {
48  int j=(i>>6);
49  contents[j] &= ~(1ull<<(i&63));
50  }
51  void reset(Square pos) { reset(index(pos)); }
52  bool test(unsigned int i) const {
53  int j=(i>>6);
54  return (contents[j]&(1ull<<(i&63)))!=0;
55  }
56  bool test(Square pos) const { return test(index(pos)); }
57  bool anyInRange(const BoardMask& mask) const
58  {
59  return (contents[0] & mask.contents[0])
60  || (contents[1] & mask.contents[1]);
61  }
63  {
64  contents[0] |= mask.contents[0];
65  contents[1] |= mask.contents[1];
66  return *this;
67  }
68  bool any() const
69  {
70  assert(! isInvalid());
71  return contents[0] || contents[1];
72  }
74  {
75  assert(! isInvalid() && any());
76  if (contents[0])
78  return toSquare(BitOp::takeOneBit(contents[1])+64);
79  }
80  static int index(int x,int y){ return x*12+y+1; }
81  static int index(Square pos) {
82  int v=pos.index();
83  return v-((v>>2)&0x3c);
84  }
85  template<Direction Dir,Player P>
86  static int getIndexOffset() {
89  int val=blackDx*12+blackDy;
90  if(P==BLACK) return val;
91  else return -val;
92  }
93  static Square toSquare(int n) { return Square::makeDirect(n+(((n*21)>>8)<<2)); }
94  friend bool operator==(const BoardMask&, const BoardMask&);
95  };
96  inline const BoardMask operator|(const BoardMask& l, const BoardMask& r)
97  {
98  BoardMask result = l;
99  result |= r;
100  return result;
101  }
102  inline bool operator==(const BoardMask& l, const BoardMask& r)
103  {
104  return l.contents[0] == r.contents[0]
105  && l.contents[1] == r.contents[1];
106  }
108  {
110  public:
113  const BoardMask& mask(Square p) const { return data[p.index()]; }
114  };
115  extern const BoardMaskTable5x5 Board_Mask_Table5x5;
116 
118  {
120  public:
123  const BoardMask& mask(Square p) const { return data[p.index()]; }
124  };
125  extern const BoardMaskTable3x3 Board_Mask_Table3x3;
126 
128  {
130  public:
133  const BoardMask& mask(Square p) const { return data[p.index()]; }
134  };
135  extern const BoardMaskTable5x3Center Board_Mask_Table5x3_Center;
136  } // namespace container
137  using container::BoardMask;
141 } // namespace osl
142 
143 
144 #endif /* OSL_BOARDMASK_H */
145 // ;;; Local Variables:
146 // ;;; mode:c++
147 // ;;; c-basic-offset:2
148 // ;;; End:
osl::container::BoardMaskTable5x5::BoardMaskTable5x5
BoardMaskTable5x5()
Definition: boardMask.cc:22
osl::container::BoardMask::BoardMask
BoardMask()
Definition: boardMask.h:25
osl::Square
Definition: basic_type.h:532
osl::container::BoardMaskTable3x3::mask
const BoardMask & mask(Square p) const
p中心の3x3 の範囲のbitを立てたもの, centeringなし
Definition: boardMask.h:123
osl::container::BoardMask::toSquare
static Square toSquare(int n)
Definition: boardMask.h:93
osl::container::BoardMask::test
bool test(Square pos) const
Definition: boardMask.h:56
osl::container::BoardMaskTable5x3Center::mask
const BoardMask & mask(Square p) const
p中心の5x3 の範囲のbitを立てたもの, centering
Definition: boardMask.h:133
osl::DirectionTraitsGen
Definition: directionTraits.h:11
directionTraits.h
osl::container::BoardMask::reset
void reset(unsigned int i)
Definition: boardMask.h:47
osl::container::operator|
const BoardMask operator|(const BoardMask &l, const BoardMask &r)
Definition: boardMask.h:96
basic_type.h
osl::container::BoardMask::any
bool any() const
Definition: boardMask.h:68
osl::container::BoardMask::index
static int index(int x, int y)
Definition: boardMask.h:80
osl::container::BoardMaskTable5x5
Definition: boardMask.h:108
osl::container::BoardMask::invalidate
void invalidate()
Definition: boardMask.h:38
osl::container::BoardMaskTable5x3Center::BoardMaskTable5x3Center
BoardMaskTable5x3Center()
Definition: boardMask.cc:64
osl::container::BoardMaskTable5x3Center
Definition: boardMask.h:128
osl::container::operator==
bool operator==(BitXmask l, BitXmask r)
Definition: bitXmask.h:33
osl::container::BoardMask::operator==
friend bool operator==(const BoardMask &, const BoardMask &)
Definition: boardMask.h:102
osl::Square::index
unsigned int index() const
Definition: basic_type.h:572
osl::container::BoardMask::index
static int index(Square pos)
Definition: boardMask.h:81
osl::container::BoardMaskTable5x5::mask
const BoardMask & mask(Square p) const
p中心の5x5 の範囲のbitを立てたもの, centeringなし
Definition: boardMask.h:113
container.h
osl::container::BoardMask::reset
void reset(Square pos)
Definition: boardMask.h:51
osl::container::BoardMask::isInvalid
bool isInvalid() const
Definition: boardMask.h:39
osl::container::Board_Mask_Table3x3
const BoardMaskTable3x3 Board_Mask_Table3x3
Definition: tables.cc:120
osl::container::BoardMaskTable3x3::BoardMaskTable3x3
BoardMaskTable3x3()
Definition: boardMask.cc:43
mask.h
osl::container::BoardMaskTable5x3Center::data
CArray< BoardMask, Square::SIZE > data
Definition: boardMask.h:129
osl::container::BoardMask::getIndexOffset
static int getIndexOffset()
Definition: boardMask.h:86
osl::container::BoardMaskTable5x5::data
CArray< BoardMask, Square::SIZE > data
Definition: boardMask.h:109
osl::container::BoardMask::contents
CArray< unsigned long long, 3 > contents
the third one is only for edge
Definition: boardMask.h:23
osl::container::BoardMask::operator=
BoardMask & operator=(const BoardMask &src)
Definition: boardMask.h:30
osl::container::BoardMask::anyInRange
bool anyInRange(const BoardMask &mask) const
Definition: boardMask.h:57
osl::container::BoardMask::takeOneBit
Square takeOneBit()
Definition: boardMask.h:73
osl::container::BoardMask::set
void set(Square pos)
Definition: boardMask.h:44
osl::container::BoardMaskTable3x3::data
CArray< BoardMask, Square::SIZE > data
Definition: boardMask.h:119
osl::BLACK
@ BLACK
Definition: basic_type.h:9
osl::container::Board_Mask_Table5x5
const BoardMaskTable5x5 Board_Mask_Table5x5
Definition: tables.cc:119
osl::container::operator<<
std::ostream & operator<<(std::ostream &, const BitXmask)
Definition: bitXmask.cc:6
osl::container::BoardMask::BoardMask
BoardMask(const BoardMask &src)
Definition: boardMask.h:26
osl::Square::makeDirect
static const Square makeDirect(int value)
Definition: basic_type.h:538
osl::container::BoardMask::operator|=
BoardMask & operator|=(const BoardMask &mask)
Definition: boardMask.h:62
osl::container::BoardMaskTable3x3
Definition: boardMask.h:118
osl::misc::BitOp::takeOneBit
static int takeOneBit(Integer &mask)
Definition: mask.h:148
osl::container::BoardMask::test
bool test(unsigned int i) const
Definition: boardMask.h:52
osl::container::BoardMask::set
void set(unsigned int i)
Definition: boardMask.h:40
osl::container::BoardMask::clear
void clear()
Definition: boardMask.h:37
osl::CArray< unsigned long long, 3 >
osl::container::BoardMask
11 x 12
Definition: boardMask.h:21
osl::container::Board_Mask_Table5x3_Center
const BoardMaskTable5x3Center Board_Mask_Table5x3_Center
Definition: tables.cc:121
osl
Definition: additionalEffect.h:6