boardKey128.h
Go to the documentation of this file.
00001 /* boardKey128.h
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   } // namespace hash
00132 } // namespace osl
00133 
00134 
00135 #endif /* OSL_BOARDKEY128_H */
00136 // ;;; Local Variables:
00137 // ;;; mode:c++
00138 // ;;; c-basic-offset:2
00139 // ;;; End:
00140 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines