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:
unsigned int index() const
Definition: basic_type.h:572
static const Square makeDirect(int value)
Definition: basic_type.h:538
const BoardMask & mask(Square p) const
p中心の3x3 の範囲のbitを立てたもの, centeringなし
Definition: boardMask.h:123
CArray< BoardMask, Square::SIZE > data
Definition: boardMask.h:119
const BoardMask & mask(Square p) const
p中心の5x3 の範囲のbitを立てたもの, centering
Definition: boardMask.h:133
CArray< BoardMask, Square::SIZE > data
Definition: boardMask.h:129
const BoardMask & mask(Square p) const
p中心の5x5 の範囲のbitを立てたもの, centeringなし
Definition: boardMask.h:113
CArray< BoardMask, Square::SIZE > data
Definition: boardMask.h:109
bool test(Square pos) const
Definition: boardMask.h:56
void reset(unsigned int i)
Definition: boardMask.h:47
void set(Square pos)
Definition: boardMask.h:44
void set(unsigned int i)
Definition: boardMask.h:40
CArray< unsigned long long, 3 > contents
the third one is only for edge
Definition: boardMask.h:23
BoardMask & operator|=(const BoardMask &mask)
Definition: boardMask.h:62
BoardMask & operator=(const BoardMask &src)
Definition: boardMask.h:30
static int index(int x, int y)
Definition: boardMask.h:80
friend bool operator==(const BoardMask &, const BoardMask &)
Definition: boardMask.h:102
bool test(unsigned int i) const
Definition: boardMask.h:52
bool anyInRange(const BoardMask &mask) const
Definition: boardMask.h:57
static int index(Square pos)
Definition: boardMask.h:81
static int getIndexOffset()
Definition: boardMask.h:86
static Square toSquare(int n)
Definition: boardMask.h:93
void reset(Square pos)
Definition: boardMask.h:51
bool isInvalid() const
Definition: boardMask.h:39
BoardMask(const BoardMask &src)
Definition: boardMask.h:26
const BoardMask operator|(const BoardMask &l, const BoardMask &r)
Definition: boardMask.h:96
const BoardMaskTable5x5 Board_Mask_Table5x5
Definition: tables.cc:119
bool operator==(BitXmask l, BitXmask r)
Definition: bitXmask.h:33
const BoardMaskTable3x3 Board_Mask_Table3x3
Definition: tables.cc:120
const BoardMaskTable5x3Center Board_Mask_Table5x3_Center
Definition: tables.cc:121
std::ostream & operator<<(std::ostream &, const BitXmask)
Definition: bitXmask.cc:6
@ BLACK
Definition: basic_type.h:9
static int takeOneBit(Integer &mask)
Definition: mask.h:148