hashKeyMix.h
Go to the documentation of this file.
00001 /* hashKeyMix.h
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 } // namespace hash
00103 } // namespace osl
00104 #endif /* _HASH_KEY_MIX_H */
00105 // ;;; Local Variables:
00106 // ;;; mode:c++
00107 // ;;; c-basic-offset:2
00108 // ;;; End:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines