説明を見る。00001
00002
00003 #ifndef OSL_BOARDMASK_H
00004 #define OSL_BOARDMASK_H
00005
00006 #include "osl/basic_type.h"
00007 #include "osl/bits/directionTraits.h"
00008 #include "osl/bits/mask.h"
00009 #include "osl/container.h"
00010 #include <iosfwd>
00011
00012 namespace osl
00013 {
00014 namespace container
00015 {
00016 class BoardMask;
00017 bool operator==(const BoardMask&, const BoardMask&);
00018 std::ostream& operator<<(std::ostream&, const BoardMask&);
00020 class BoardMask
00021 {
00023 CArray<unsigned long long,3> contents;
00024 public:
00025 BoardMask() { invalidate(); }
00026 BoardMask(const BoardMask& src) {
00027 contents[0] = src.contents[0];
00028 contents[1] = src.contents[1];
00029 }
00030 BoardMask& operator=(const BoardMask& src) {
00031 if (this != &src) {
00032 contents[0] = src.contents[0];
00033 contents[1] = src.contents[1];
00034 }
00035 return *this;
00036 }
00037 void clear() { contents[0]=contents[1]=0; }
00038 void invalidate() { contents[0] = static_cast<uint64_t>(-1); }
00039 bool isInvalid() const { return contents[0] == static_cast<uint64_t>(-1); }
00040 void set(unsigned int i) {
00041 int j=(i>>6);
00042 contents[j]|=(1ull<<(i&63));
00043 }
00044 void set(Square pos) {
00045 set(index(pos));
00046 }
00047 void reset(unsigned int i) {
00048 int j=(i>>6);
00049 contents[j] &= ~(1ull<<(i&63));
00050 }
00051 void reset(Square pos) { reset(index(pos)); }
00052 bool test(unsigned int i) const {
00053 int j=(i>>6);
00054 return (contents[j]&(1ull<<(i&63)))!=0;
00055 }
00056 bool test(Square pos) const { return test(index(pos)); }
00057 bool anyInRange(const BoardMask& mask) const
00058 {
00059 return (contents[0] & mask.contents[0])
00060 || (contents[1] & mask.contents[1]);
00061 }
00062 BoardMask& operator|=(const BoardMask& mask)
00063 {
00064 contents[0] |= mask.contents[0];
00065 contents[1] |= mask.contents[1];
00066 return *this;
00067 }
00068 bool any() const
00069 {
00070 assert(! isInvalid());
00071 return contents[0] || contents[1];
00072 }
00073 Square takeOneBit()
00074 {
00075 assert(! isInvalid() && any());
00076 if (contents[0])
00077 return toSquare(BitOp::takeOneBit(contents[0]));
00078 return toSquare(BitOp::takeOneBit(contents[1])+64);
00079 }
00080 static int index(int x,int y){ return x*12+y+1; }
00081 static int index(Square pos) {
00082 int v=pos.index();
00083 return v-((v>>2)&0x3c);
00084 }
00085 template<Direction Dir,Player P>
00086 static int getIndexOffset() {
00087 int blackDx=DirectionTraitsGen<Dir>::blackDx;
00088 int blackDy=DirectionTraitsGen<Dir>::blackDy;
00089 int val=blackDx*12+blackDy;
00090 if(P==BLACK) return val;
00091 else return -val;
00092 }
00093 static Square toSquare(int n) { return Square::makeDirect(n+(((n*21)>>8)<<2)); }
00094 friend bool operator==(const BoardMask&, const BoardMask&);
00095 };
00096 inline const BoardMask operator|(const BoardMask& l, const BoardMask& r)
00097 {
00098 BoardMask result = l;
00099 result |= r;
00100 return result;
00101 }
00102 inline bool operator==(const BoardMask& l, const BoardMask& r)
00103 {
00104 return l.contents[0] == r.contents[0]
00105 && l.contents[1] == r.contents[1];
00106 }
00107 class BoardMaskTable5x5
00108 {
00109 CArray<BoardMask, Square::SIZE> data;
00110 public:
00111 BoardMaskTable5x5();
00113 const BoardMask& mask(Square p) const { return data[p.index()]; }
00114 };
00115 extern const BoardMaskTable5x5 Board_Mask_Table5x5;
00116
00117 class BoardMaskTable3x3
00118 {
00119 CArray<BoardMask, Square::SIZE> data;
00120 public:
00121 BoardMaskTable3x3();
00123 const BoardMask& mask(Square p) const { return data[p.index()]; }
00124 };
00125 extern const BoardMaskTable3x3 Board_Mask_Table3x3;
00126
00127 class BoardMaskTable5x3Center
00128 {
00129 CArray<BoardMask, Square::SIZE> data;
00130 public:
00131 BoardMaskTable5x3Center();
00133 const BoardMask& mask(Square p) const { return data[p.index()]; }
00134 };
00135 extern const BoardMaskTable5x3Center Board_Mask_Table5x3_Center;
00136 }
00137 using container::BoardMask;
00138 using container::Board_Mask_Table5x5;
00139 using container::Board_Mask_Table5x3_Center;
00140 using container::Board_Mask_Table3x3;
00141 }
00142
00143
00144 #endif
00145
00146
00147
00148