1 #ifndef HLVARIANT__TAGUA_WRAPPED_H
2 #define HLVARIANT__TAGUA_WRAPPED_H
9 #define __FUNC__ __PRETTY_FUNCTION__
11 #define __FUNC__ __FUNCTION__
14 #define MISMATCH(x,y) (std::cout << " --> Error in "<<__FUNC__<<", MISMATCH!" << std::endl \
15 << " got type " << prettyTypeName(typeid(x).name()) << std::endl \
16 << " instead of " << prettyTypeName(typeid(y).name()) << std::endl \
17 << " this is " << prettyTypeName(typeid(*this).name()) << std::endl)
21 template <typename Variant
> class WrappedPosition
;
23 template <typename Variant
>
24 class WrappedPool
{ };
26 template <typename Variant
>
27 class WrappedPiece
: public AbstractPiece
{
28 typedef typename
Variant::LegalityCheck::GameState::Board::Piece Piece
;
32 const Piece
& inner() const { return m_piece
; }
34 WrappedPiece(const Piece
& piece
)
37 virtual bool equals(const PiecePtr
& _other
) const {
38 if (!_other
) return false;
39 WrappedPiece
<Variant
>* other
= dynamic_cast<WrappedPiece
<Variant
>*>(_other
.get());
42 return m_piece
== other
->inner();
44 MISMATCH(*_other
.get(),WrappedPiece
<Variant
>);
49 virtual QString
name() const {
50 return m_piece
.name();
53 virtual PiecePtr
clone() const {
54 return PiecePtr(new WrappedPiece
<Variant
>(m_piece
));
58 template <typename Variant
>
59 class WrappedMove
: public AbstractMove
{
60 typedef typename
Variant::LegalityCheck LegalityCheck
;
61 typedef typename
LegalityCheck::Move Move
;
62 typedef typename
LegalityCheck::GameState GameState
;
66 const Move
& inner() const { return m_move
; }
67 Move
& inner() { return m_move
; }
69 WrappedMove(const Move
& move
)
72 virtual QString
SAN(const PositionPtr
& _ref
) const {
73 WrappedPosition
<Variant
>* ref
= dynamic_cast<WrappedPosition
<Variant
>*>(_ref
.get());
76 // MoveSerializer<Position> serializer(m_move, pos->inner());
80 MISMATCH(*_ref
.get(), WrappedPosition
<Variant
>);
85 virtual DecoratedMove
toDecoratedMove(const PositionPtr
&) const {
86 return DecoratedMove(); // BROKEN
89 virtual QString
toString(const PositionPtr
&) const {
93 virtual NormalUserMove
toUserMove() const {
94 return NormalUserMove(); // BROKEN
97 virtual bool equals(const MovePtr
& _other
) const {
98 WrappedMove
<Variant
>* other
= dynamic_cast<WrappedMove
<Variant
>*>(_other
.get());
101 return m_move
== other
->inner();
103 MISMATCH(*_other
.get(), WrappedMove
<Variant
>);
110 * Metafunction that returns a null pointer when
111 * its template argument is NoPool.
113 template <typename Variant
, typename Pool
>
114 struct ReturnPoolAux
{
115 static PoolPtr
apply(typename
Variant::GameState
& state
, int player
) {
116 return PoolPtr(new WrappedPool
<Variant
>(state
.pool(player
)));
120 template <typename Variant
>
121 struct ReturnPoolAux
<Variant
, NoPool
> {
122 static PoolPtr
apply(typename
Variant::GameState
&, int) {
127 template <typename Variant
>
129 static PoolPtr
apply(typename
Variant::GameState
& state
, int player
) {
130 return ReturnPoolAux
<Variant
, typename
Variant::GameState::Pool
>(state
, player
);
134 template <typename Variant
>
135 class WrappedPosition
: public AbstractPosition
{
136 typedef typename
Variant::LegalityCheck LegalityCheck
;
137 typedef typename
LegalityCheck::GameState GameState
;
138 typedef typename
GameState::Board Board
;
139 typedef typename
Board::Piece Piece
;
140 typedef typename
GameState::Move Move
;
144 const GameState
& inner() const { return m_state
; }
145 GameState
& inner() { return m_state
; }
147 WrappedPosition(const GameState
& state
)
150 virtual Point
size() const {
151 return m_state
.board().size();
154 virtual QStringList
borderCoords() const {
156 return QStringList();
159 virtual void setup() {
163 virtual PiecePtr
get(const Point
& p
) const {
164 Piece piece
= m_state
.board().get(p
);
165 if (piece
!= Piece())
166 return PiecePtr(new WrappedPiece
<Variant
>(piece
));
171 virtual void set(const Point
& p
, const PiecePtr
& _piece
) {
173 m_state
.board().set(p
, Piece());
176 WrappedPiece
<Variant
>* piece
= dynamic_cast<WrappedPiece
<Variant
>*>(_piece
.get());
179 m_state
.board().set(p
, piece
->inner());
181 MISMATCH(*_piece
.get(), WrappedPiece
<Variant
>);
185 virtual PoolPtr
pool(int) {
190 virtual void copyPoolFrom(const PositionPtr
&) {
194 virtual InteractionType
movable(const TurnTest
& test
, const Point
& p
) const {
195 LegalityCheck
check(m_state
);
196 return check
.movable(test
, p
);
199 virtual InteractionType
droppable(const TurnTest
& test
, int index
) const {
200 LegalityCheck
check(m_state
);
201 return check
.droppable(test
, index
);
204 virtual int turn() const {
205 return static_cast<int>(m_state
.turn());
208 virtual void setTurn(int turn
) {
209 m_state
.setTurn(static_cast<typename
Piece::Color
>(turn
));
212 virtual int previousTurn() const {
213 return static_cast<int>(m_state
.previousTurn());
216 virtual void switchTurn() {
217 m_state
.switchTurn();
220 virtual bool testMove(const MovePtr
& _move
) const {
221 WrappedMove
<Variant
>* move
= dynamic_cast<WrappedMove
<Variant
>*>(_move
.get());
224 LegalityCheck
check(m_state
);
225 return check
.legal(move
->inner());
228 MISMATCH(*_move
.get(), WrappedMove
<Variant
>);
233 virtual void move(const MovePtr
& _move
) {
234 WrappedMove
<Variant
>* move
= dynamic_cast<WrappedMove
<Variant
>*>(_move
.get());
237 m_state
.move(move
->inner());
239 MISMATCH(*_move
.get(), WrappedMove
<Variant
>);
242 virtual PositionPtr
clone() const {
243 return PositionPtr(new WrappedPosition
<Variant
>(m_state
));
246 virtual void copyFrom(const PositionPtr
& _p
) {
247 // TODO: check if this is used somewhere
248 WrappedPosition
<Variant
>* p
= dynamic_cast<WrappedPosition
<Variant
>*>(_p
.get());
251 m_state
= p
->inner();
253 MISMATCH(*_p
.get(), WrappedPosition
);
256 virtual bool equals(const PositionPtr
& _other
) const {
257 WrappedPosition
<Variant
>* other
= dynamic_cast<WrappedPosition
<Variant
>*>(_other
.get());
260 return m_state
== other
->inner();
262 MISMATCH(*_other
.get(), WrappedPosition
<Variant
>);
267 virtual MovePtr
getMove(const AlgebraicNotation
&) const {
272 virtual MovePtr
getMove(const QString
&) const {
277 virtual QString
state() const {
281 virtual QString
fen(int, int) const {
285 virtual PiecePtr
moveHint(const MovePtr
&) const {
286 return PiecePtr(); // BROKEN
289 virtual QString
variant() const {
290 return Variant::m_name
;
293 virtual void dump() const {
301 #endif // HLVARIANT__TAGUA_WRAPPED_H