Main Page
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
include
osl
checkmate
proofDisproof.h
Go to the documentation of this file.
1
#ifndef _PROOF_DISPROOF_H
2
#define _PROOF_DISPROOF_H
3
4
#include "
osl/move.h
"
5
#include <cassert>
6
#include <iosfwd>
7
namespace
osl
8
{
9
namespace
checkmate
10
{
16
class
ProofDisproof
17
{
18
unsigned
long
long
pdp
;
19
public
:
20
enum
{
21
PROOF_SHIFT
= 32,
22
DISPROOF_MASK
= 0xffffffffu,
23
PROOF_MAX
= (0xffffffffu / 16),
24
DISPROOF_MAX
= (0xffffffffu / 16),
26
NO_ESCAPE_DISPROOF
= (
DISPROOF_MAX
- 1),
27
CHECK_MATE_DISPROOF
= (
DISPROOF_MAX
- 2),
29
NO_CHECK_MATE_PROOF
= (
PROOF_MAX
- 1),
30
PAWN_CHECK_MATE_PROOF
= (
PROOF_MAX
- 2),
31
LOOP_DETECTION_PROOF
= (
PROOF_MAX
- 3),
32
ATTACK_BACK_PROOF
= (
PROOF_MAX
- 4),
33
};
34
private
:
35
static
void
testConsistency
();
36
public
:
37
enum
{
39
DISPROOF_LIMIT
= (
DISPROOF_MAX
- 3),
41
PROOF_LIMIT
= (
PROOF_MAX
- 5),
42
};
43
private
:
44
static
unsigned
long
long
45
compose
(
unsigned
long
long
proof
,
unsigned
long
long
disproof
)
46
{
47
return
(proof <<
PROOF_SHIFT
) +
disproof
;
48
}
50
ProofDisproof
(
unsigned
long
long
value) :
pdp
(value)
51
{
52
}
53
static
const
ProofDisproof
54
make
(
unsigned
int
proof
,
unsigned
int
disproof
)
55
{
56
return
ProofDisproof
(
compose
(proof, disproof));
57
}
58
public
:
59
ProofDisproof
() :
pdp
(
compose
(1, 1))
60
{
61
}
62
ProofDisproof
(
unsigned
int
proof
,
unsigned
int
disproof
)
63
:
pdp
(
compose
(proof,disproof))
64
{
65
assert(proof <
PROOF_MAX
);
66
assert(disproof <
DISPROOF_MAX
);
67
assert(proof || disproof);
68
assert((proof == 0) ^ (disproof <
DISPROOF_LIMIT
));
69
assert((disproof == 0) ^ (proof <
PROOF_LIMIT
));
70
}
71
static
const
ProofDisproof
makeDirect
(
unsigned
long
long
value) {
return
ProofDisproof
(value); }
72
73
// constants
74
static
const
ProofDisproof
NoEscape
() {
return
ProofDisproof
(0,
NO_ESCAPE_DISPROOF
); }
75
static
const
ProofDisproof
Checkmate
() {
return
ProofDisproof
(0,
CHECK_MATE_DISPROOF
); }
76
static
const
ProofDisproof
NoCheckmate
() {
return
ProofDisproof
(
NO_CHECK_MATE_PROOF
, 0); }
77
static
const
ProofDisproof
PawnCheckmate
() {
return
ProofDisproof
(
PAWN_CHECK_MATE_PROOF
, 0); }
78
static
const
ProofDisproof
LoopDetection
() {
return
ProofDisproof
(
LOOP_DETECTION_PROOF
, 0); }
79
static
const
ProofDisproof
AttackBack
() {
return
ProofDisproof
(
ATTACK_BACK_PROOF
, 0); }
80
static
const
ProofDisproof
Unknown
() {
return
ProofDisproof
(1, 1); }
82
static
const
ProofDisproof
Bottom
() {
return
make
(
PROOF_MAX
,
DISPROOF_MAX
); }
83
84
unsigned
int
proof
()
const
{
return
pdp
>>
PROOF_SHIFT
; }
85
unsigned
int
disproof
()
const
{
return
pdp
&
DISPROOF_MASK
; }
86
bool
isCheckmateSuccess
()
const
{
return
proof
()==0; }
87
bool
isCheckmateFail
()
const
{
return
disproof
()==0; }
88
bool
isFinal
()
const
{
return
isCheckmateSuccess
() ||
isCheckmateFail
(); }
89
bool
isUnknown
()
const
{
return
!
isFinal
(); }
90
92
bool
isPawnDropFoul
(
Move
move)
const
93
{
94
return
(
pdp
==
NoEscape
().
pdp
) && move.
isNormal
() && move.
isDrop
()
95
&& (move.
ptype
()==
PAWN
);
96
}
97
bool
isLoopDetection
()
const
{
return
pdp
==
LoopDetection
().
pdp
; }
98
99
unsigned
long
long
ulonglongValue
()
const
{
return
pdp
; }
100
101
static
const
unsigned
int
BigProofNumber
=
PROOF_MAX
;
102
106
bool
isBetterForAttack
(
const
ProofDisproof
& r)
const
107
{
108
const
unsigned
int
lp =
proof
();
109
const
unsigned
int
rp = r.
proof
();
110
if
(lp != rp)
111
return
lp < rp;
112
return
disproof
() > r.
disproof
();
113
}
117
bool
isBetterForDefense
(
const
ProofDisproof
& r)
const
118
{
119
const
unsigned
int
ld =
disproof
();
120
const
unsigned
int
rd = r.
disproof
();
121
if
(ld != rd)
122
return
ld < rd;
123
return
proof
() > r.
proof
();
124
}
128
const
ProofDisproof
&
betterForAttack
(
const
ProofDisproof
& r)
const
129
{
130
return
(
isBetterForAttack
(r) ? *
this
: r);
131
}
135
const
ProofDisproof
&
betterForDefense
(
const
ProofDisproof
& r)
const
136
{
137
return
(
isBetterForDefense
(r) ? *
this
: r);
138
}
139
};
140
inline
bool
operator==
(
const
ProofDisproof
& l,
const
ProofDisproof
& r)
141
{
142
return
l.
ulonglongValue
() == r.
ulonglongValue
();
143
}
144
inline
bool
operator!=
(
const
ProofDisproof
& l,
const
ProofDisproof
& r)
145
{
146
return
! (l == r);
147
}
148
inline
bool
operator<
(
const
ProofDisproof
& l,
const
ProofDisproof
& r)
149
{
150
return
l.
ulonglongValue
() < r.
ulonglongValue
();
151
}
152
153
std::ostream&
operator<<
(std::ostream& os,
154
const
ProofDisproof
& proofDisproof);
155
}
// namespace checkmate
156
157
using
checkmate::ProofDisproof;
158
}
// namespace osl
159
#endif // _PROOF_DISPROOF_H
160
// ;;; Local Variables:
161
// ;;; mode:c++
162
// ;;; c-basic-offset:2
163
// ;;; End:
Generated on Sun Jul 21 2013 13:37:26 by
1.8.4