All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
hashKeyMix.h
Go to the documentation of this file.
1 /* hashKeyMix.h
2  */
3 #ifndef _HASH_KEY_MIX_H
4 #define _HASH_KEY_MIX_H
5 #include "osl/pieceStand.h"
6 #include <cassert>
7 namespace osl
8 {
9 namespace hash
10 {
16  template<typename hash1_t,typename hash2_t>
17  class HashKeyMix{
18  private:
19  hash1_t hash1;
20  hash2_t hash2;
21  hash1_t const& getHash1() const{ return hash1; }
22  hash1_t & getHash1() { return hash1; }
23  hash2_t const& getHash2() const{ return hash2; }
24  hash2_t & getHash2() { return hash2; }
25  public:
27  }
28  HashKeyMix(unsigned int v0, unsigned int v1, unsigned int v2,
29  unsigned int v3, unsigned int v4, unsigned int v5)
30  : hash1(v0,v1,v2,v3,v4,v5),hash2(v0,v1,v2,v3,v4,v5){
31  }
32  public:
33  bool isSameBoard(const HashKeyMix& key) const{
34  if(hash1.isSameBoard(key.getHash1())){
35  assert(hash2.isSameBoard(key.getHash2()));
36  return true;
37  }
38  assert(!hash2.isSameBoard(key.getHash2()));
39  return false;
40  }
42  hash1+=r.getHash1();
43  hash2+=r.getHash2();
44  return *this;
45  }
47  hash1-=r.getHash1();
48  hash2-=r.getHash2();
49  return *this;
50  }
52  PieceStand ret=hash1.blackStand();
53  assert(ret==hash2.blackStand());
54  return ret;
55  }
56  void changeTurn() {
57  hash1.changeTurn();
58  hash2.changeTurn();
59  }
60  void setPlayer(Player p){
61  hash1.setPlayer(p);
62  hash2.setPlayer(p);
63  }
64  bool isPlayerOfTurn(Player p) const{
65  bool ret=hash1.isPlayerOfTurn(p);
66  assert(ret==hash2.isPlayerOfTurn(p));
67  return ret;
68  }
69  size_t size() const
70  {
71  return std::max(hash1.size(),hash2.size());
72  }
73  size_t value(unsigned int i) const
74  {
75  assert(i<size());
76  return (hash1.size() > hash2.size()) ? hash1.value(i) : hash2.value(i);
77  }
78  void setRandom(){
79  hash1.setRandom();
80  hash2.setRandom();
81  }
82  friend bool operator==(HashKeyMix const& l, HashKeyMix const& r){
83  bool ret=(l.getHash1()==r.getHash1());
84  assert(ret==(l.getHash2()==r.getHash2()));
85  return ret;
86  }
90  friend bool operator<(HashKeyMix const& l, HashKeyMix const& r){
91  bool ret=(l.getHash1()<r.getHash1());
92  if(ret){
93  assert(l.getHash2()<r.getHash2() ||
94  r.getHash2()<l.getHash2());
95  }
96  return ret;
97  }
98  friend bool operator!=(const HashKeyMix& h1,const HashKeyMix& h2){
99  return !(h1==h2);
100  }
101  };
102 } // namespace hash
103 } // namespace osl
104 #endif /* _HASH_KEY_MIX_H */
105 // ;;; Local Variables:
106 // ;;; mode:c++
107 // ;;; c-basic-offset:2
108 // ;;; End: