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
12namespace osl
13{
14 namespace container
15 {
16 class BoardMask;
17 bool operator==(const BoardMask&, const BoardMask&);
18 std::ostream& operator<<(std::ostream&, const BoardMask&);
21 {
24 public:
26 BoardMask(const BoardMask& src) {
27 contents[0] = src.contents[0];
28 contents[1] = src.contents[1];
29 }
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 &src)
Definition boardMask.h:30
BoardMask & operator|=(const BoardMask &mask)
Definition boardMask.h:62
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
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