00001
00002
00003 #ifndef _BOARDMASK_H
00004 #define _BOARDMASK_H
00005
00006 #include "osl/position.h"
00007 #include "osl/directionTraits.h"
00008 #include "osl/misc/carray.h"
00009 #include "osl/misc/cstdint.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<uint64_t,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(Position pos) {
00045 set(index(pos));
00046 }
00047 bool test(unsigned int i) const {
00048 int j=(i>>6);
00049 return (contents[j]&(1ull<<(i&63)))!=0;
00050 }
00051 bool test(Position pos) const { return test(index(pos)); }
00052 bool anyInRange(const BoardMask& mask) const
00053 {
00054 return (contents[0] & mask.contents[0])
00055 || (contents[1] & mask.contents[1]);
00056 }
00057 BoardMask& operator|=(const BoardMask& mask)
00058 {
00059 contents[0] |= mask.contents[0];
00060 contents[1] |= mask.contents[1];
00061 return *this;
00062 }
00063 static int index(int x,int y){ return x*12+y+1; }
00064 static int index(Position pos) {
00065 int v=pos.index();
00066 return v-((v>>2)&0x3c);
00067 }
00068 template<Direction Dir,Player P>
00069 static int getIndexOffset() {
00070 int blackDx=DirectionTraitsGen<Dir>::blackDx;
00071 int blackDy=DirectionTraitsGen<Dir>::blackDy;
00072 int val=blackDx*12+blackDy;
00073 if(P==BLACK) return val;
00074 else return -val;
00075 }
00076 friend bool operator==(const BoardMask&, const BoardMask&);
00077 };
00078 inline const BoardMask operator|(const BoardMask& l, const BoardMask& r)
00079 {
00080 BoardMask result = l;
00081 result |= r;
00082 return result;
00083 }
00084 inline bool operator==(const BoardMask& l, const BoardMask& r)
00085 {
00086 return l.contents[0] == r.contents[0]
00087 && l.contents[1] == r.contents[1];
00088 }
00089 class BoardMaskTable5x5
00090 {
00091 CArray<BoardMask, Position::SIZE> data;
00092 public:
00093 BoardMaskTable5x5();
00095 const BoardMask& mask(Position p) const { return data[p.index()]; }
00096 };
00097 extern const BoardMaskTable5x5 Board_Mask_Table5x5;
00098
00099 class BoardMaskTable3x3
00100 {
00101 CArray<BoardMask, Position::SIZE> data;
00102 public:
00103 BoardMaskTable3x3();
00105 const BoardMask& mask(Position p) const { return data[p.index()]; }
00106 };
00107 extern const BoardMaskTable3x3 Board_Mask_Table3x3;
00108
00109 class BoardMaskTable5x3Center
00110 {
00111 CArray<BoardMask, Position::SIZE> data;
00112 public:
00113 BoardMaskTable5x3Center();
00115 const BoardMask& mask(Position p) const { return data[p.index()]; }
00116 };
00117 extern const BoardMaskTable5x3Center Board_Mask_Table5x3_Center;
00118 }
00119 using container::BoardMask;
00120 using container::Board_Mask_Table5x5;
00121 using container::Board_Mask_Table5x3_Center;
00122 using container::Board_Mask_Table3x3;
00123 }
00124
00125
00126 #endif
00127
00128
00129
00130