Go to the documentation of this file.00001
00002
00003 #ifndef OSL_BOARDKEY128_H
00004 #define OSL_BOARDKEY128_H
00005
00006 #include "osl/pieceStand.h"
00007 #include "osl/move.h"
00008 #include "osl/misc/carray.h"
00009 #include <cstddef>
00010
00011 namespace osl
00012 {
00013 namespace hash
00014 {
00015 struct BoardKey96 : public std::pair<uint64_t,uint32_t>
00016 {
00017 BoardKey96() {}
00018 BoardKey96(const std::pair<uint64_t,uint32_t>& src)
00019 : std::pair<uint64_t,uint32_t>(src)
00020 {
00021 }
00022 uint32_t signature() const { return second; }
00023 size_t size() const { return 2; }
00024 uint64_t operator[](size_t i) const { return i ? first : second; }
00025 };
00026 class HashGenTable;
00027 struct HashKey128Layout
00028 {
00029 uint64_t board64;
00030 uint32_t board32, piece_stand;
00031 };
00036 class HashKey128 : private HashKey128Layout
00037 {
00038 friend class HashGenTable;
00039 public:
00040 HashKey128()
00041 {
00042 board64 = board32 = piece_stand = 0;
00043 }
00044 HashKey128(uint64_t h0, uint32_t h1, uint32_t s)
00045 {
00046 board64 = h0;
00047 board32 = h1;
00048 piece_stand = s;
00049 }
00050 HashKey128(const HashKey128Layout& src) : HashKey128Layout(src)
00051 {
00052 }
00053 const BoardKey96 boardKey() const {
00054 return std::make_pair(board64, board32);
00055 }
00056 uint64_t boardKey64() const { return board64; }
00057 uint64_t signature() const { return board32; }
00059 uint64_t hash64() const { return board64 + (piece_stand << 1); }
00060 const PieceStand pieceStand() const{ return PieceStand(piece_stand); }
00061 const PieceStand blackStand() const { return PieceStand(piece_stand); }
00062 void setPieceStand(const PieceStand& p) { piece_stand=p.getFlags(); }
00063
00068 bool isSameBoard(const HashKey128& key) const
00069 {
00070 return boardKey() == key.boardKey();
00071 }
00072 HashKey128& operator+=(const HashKey128& r)
00073 {
00074 board64 += r.board64;
00075 board32 += r.board32;
00076 PieceStand new_stand(piece_stand);
00077 new_stand.addAtmostOnePiece(r.pieceStand());
00078 piece_stand = new_stand.getFlags();
00079 return *this;
00080 }
00081 HashKey128& operator-=(const HashKey128& r)
00082 {
00083 board64 -= r.board64;
00084 board32 -= r.board32;
00085 PieceStand new_stand(piece_stand);
00086 new_stand.subAtmostOnePiece(r.pieceStand());
00087 piece_stand = new_stand.getFlags();
00088 return *this;
00089 }
00090 void add(Move move) { board64 += move.intValue(); }
00091 void changeTurn() { board64 ^= static_cast<uint64_t>(1); }
00092 void setPlayer(Player p)
00093 {
00094 board64 &= ~static_cast<uint64_t>(1);
00095 board64 |= playerToIndex(p);
00096 }
00097 bool playerBit() const { return board64 & 1; }
00098 bool isPlayerOfTurn(Player p) const
00099 {
00100 return playerBit() == playerToIndex(p);
00101 }
00102 Player turn() const { return isPlayerOfTurn(BLACK) ? BLACK : WHITE; }
00107 void setRandom();
00108 size_t size() const { return 2; }
00109 uint64_t operator[](size_t i) const { return i ? board64 : board32; }
00110 };
00111 inline bool operator==(const HashKey128& l, const HashKey128& r)
00112 {
00113 return l.boardKey() == r.boardKey() && l.pieceStand() == r.pieceStand();
00114 }
00115 inline bool operator!=(const HashKey128& l, const HashKey128& r)
00116 {
00117 return !(l==r);
00118 }
00123 inline bool operator<(const HashKey128& l, const HashKey128& r)
00124 {
00125 if (l.pieceStand() < r.pieceStand())
00126 return true;
00127 else if (r.pieceStand() < l.pieceStand())
00128 return false;
00129 return l.boardKey() < r.boardKey();
00130 }
00131 }
00132 }
00133
00134
00135 #endif
00136
00137
00138
00139
00140