Go to the documentation of this file.00001
00002
00003 #ifndef _HASH_KEY_MIX_H
00004 #define _HASH_KEY_MIX_H
00005 #include "osl/pieceStand.h"
00006 #include <cassert>
00007 namespace osl
00008 {
00009 namespace hash
00010 {
00016 template<typename hash1_t,typename hash2_t>
00017 class HashKeyMix{
00018 private:
00019 hash1_t hash1;
00020 hash2_t hash2;
00021 hash1_t const& getHash1() const{ return hash1; }
00022 hash1_t & getHash1() { return hash1; }
00023 hash2_t const& getHash2() const{ return hash2; }
00024 hash2_t & getHash2() { return hash2; }
00025 public:
00026 HashKeyMix() :hash1(),hash2(){
00027 }
00028 HashKeyMix(unsigned int v0, unsigned int v1, unsigned int v2,
00029 unsigned int v3, unsigned int v4, unsigned int v5)
00030 : hash1(v0,v1,v2,v3,v4,v5),hash2(v0,v1,v2,v3,v4,v5){
00031 }
00032 public:
00033 bool isSameBoard(const HashKeyMix& key) const{
00034 if(hash1.isSameBoard(key.getHash1())){
00035 assert(hash2.isSameBoard(key.getHash2()));
00036 return true;
00037 }
00038 assert(!hash2.isSameBoard(key.getHash2()));
00039 return false;
00040 }
00041 HashKeyMix& operator+=(const HashKeyMix& r){
00042 hash1+=r.getHash1();
00043 hash2+=r.getHash2();
00044 return *this;
00045 }
00046 HashKeyMix& operator-=(const HashKeyMix& r){
00047 hash1-=r.getHash1();
00048 hash2-=r.getHash2();
00049 return *this;
00050 }
00051 PieceStand blackStand() const {
00052 PieceStand ret=hash1.blackStand();
00053 assert(ret==hash2.blackStand());
00054 return ret;
00055 }
00056 void changeTurn() {
00057 hash1.changeTurn();
00058 hash2.changeTurn();
00059 }
00060 void setPlayer(Player p){
00061 hash1.setPlayer(p);
00062 hash2.setPlayer(p);
00063 }
00064 bool isPlayerOfTurn(Player p) const{
00065 bool ret=hash1.isPlayerOfTurn(p);
00066 assert(ret==hash2.isPlayerOfTurn(p));
00067 return ret;
00068 }
00069 size_t size() const
00070 {
00071 return std::max(hash1.size(),hash2.size());
00072 }
00073 size_t value(unsigned int i) const
00074 {
00075 assert(i<size());
00076 return (hash1.size() > hash2.size()) ? hash1.value(i) : hash2.value(i);
00077 }
00078 void setRandom(){
00079 hash1.setRandom();
00080 hash2.setRandom();
00081 }
00082 friend bool operator==(HashKeyMix const& l, HashKeyMix const& r){
00083 bool ret=(l.getHash1()==r.getHash1());
00084 assert(ret==(l.getHash2()==r.getHash2()));
00085 return ret;
00086 }
00090 friend bool operator<(HashKeyMix const& l, HashKeyMix const& r){
00091 bool ret=(l.getHash1()<r.getHash1());
00092 if(ret){
00093 assert(l.getHash2()<r.getHash2() ||
00094 r.getHash2()<l.getHash2());
00095 }
00096 return ret;
00097 }
00098 friend bool operator!=(const HashKeyMix& h1,const HashKeyMix& h2){
00099 return !(h1==h2);
00100 }
00101 };
00102 }
00103 }
00104 #endif
00105
00106
00107
00108