/usr/include/osl/hash/hashKeyMix.h is in libosl-dev 0.6.0-3.3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | /* hashKeyMix.h
*/
#ifndef _HASH_KEY_MIX_H
#define _HASH_KEY_MIX_H
#include "osl/pieceStand.h"
#include <cassert>
namespace osl
{
namespace hash
{
/**
* 2つのhashKey(たとえばHashKey32とHashKey64)を保持して,
* 常に同じ結果(片方で一致して片方で一致しないことがない)であることを
* assertで確認しながら動くHashKey
*/
template<typename hash1_t,typename hash2_t>
class HashKeyMix{
private:
hash1_t hash1;
hash2_t hash2;
hash1_t const& getHash1() const{ return hash1; }
hash1_t & getHash1() { return hash1; }
hash2_t const& getHash2() const{ return hash2; }
hash2_t & getHash2() { return hash2; }
public:
HashKeyMix() :hash1(),hash2(){
}
HashKeyMix(unsigned int v0, unsigned int v1, unsigned int v2,
unsigned int v3, unsigned int v4, unsigned int v5)
: hash1(v0,v1,v2,v3,v4,v5),hash2(v0,v1,v2,v3,v4,v5){
}
public:
bool isSameBoard(const HashKeyMix& key) const{
if(hash1.isSameBoard(key.getHash1())){
assert(hash2.isSameBoard(key.getHash2()));
return true;
}
assert(!hash2.isSameBoard(key.getHash2()));
return false;
}
HashKeyMix& operator+=(const HashKeyMix& r){
hash1+=r.getHash1();
hash2+=r.getHash2();
return *this;
}
HashKeyMix& operator-=(const HashKeyMix& r){
hash1-=r.getHash1();
hash2-=r.getHash2();
return *this;
}
PieceStand blackStand() const {
PieceStand ret=hash1.blackStand();
assert(ret==hash2.blackStand());
return ret;
}
void changeTurn() {
hash1.changeTurn();
hash2.changeTurn();
}
void setPlayer(Player p){
hash1.setPlayer(p);
hash2.setPlayer(p);
}
bool isPlayerOfTurn(Player p) const{
bool ret=hash1.isPlayerOfTurn(p);
assert(ret==hash2.isPlayerOfTurn(p));
return ret;
}
size_t size() const
{
return std::max(hash1.size(),hash2.size());
}
size_t value(unsigned int i) const
{
assert(i<size());
return (hash1.size() > hash2.size()) ? hash1.value(i) : hash2.value(i);
}
void setRandom(){
hash1.setRandom();
hash2.setRandom();
}
friend bool operator==(HashKeyMix const& l, HashKeyMix const& r){
bool ret=(l.getHash1()==r.getHash1());
assert(ret==(l.getHash2()==r.getHash2()));
return ret;
}
/**
* ここの順序はset等に入れるためだけに使うので,完全に一致する必要はない
*/
friend bool operator<(HashKeyMix const& l, HashKeyMix const& r){
bool ret=(l.getHash1()<r.getHash1());
if(ret){
assert(l.getHash2()<r.getHash2() ||
r.getHash2()<l.getHash2());
}
return ret;
}
friend bool operator!=(const HashKeyMix& h1,const HashKeyMix& h2){
return !(h1==h2);
}
};
} // namespace hash
} // namespace osl
#endif /* _HASH_KEY_MIX_H */
// ;;; Local Variables:
// ;;; mode:c++
// ;;; c-basic-offset:2
// ;;; End:
|