1 #ifndef HLVARIANT__TAGUA_WRAPPED_H
2 #define HLVARIANT__TAGUA_WRAPPED_H
6 #include "movefactory.h"
8 #include "variantdata.h"
11 #define __FUNC__ __PRETTY_FUNCTION__
13 #define __FUNC__ __FUNCTION__
16 #define MISMATCH(x,y) (std::cout << " --> Error in "<<__FUNC__<<", MISMATCH!" << std::endl \
17 << " got type " << prettyTypeName(typeid(x).name()) << std::endl \
18 << " instead of " << prettyTypeName(typeid(y).name()) << std::endl \
19 << " this is " << prettyTypeName(typeid(*this).name()) << std::endl)
23 template <typename Variant
> class WrappedPosition
;
25 template <typename Variant
>
26 class WrappedPool
{ };
28 template <typename Variant
>
29 class WrappedPiece
: public AbstractPiece
{
30 typedef typename VariantData
<Variant
>::Piece Piece
;
34 const Piece
& inner() const { return m_piece
; }
36 WrappedPiece(const Piece
& piece
)
39 virtual bool equals(const PiecePtr
& _other
) const {
40 if (!_other
) return false;
41 WrappedPiece
<Variant
>* other
= dynamic_cast<WrappedPiece
<Variant
>*>(_other
.get());
44 return m_piece
== other
->inner();
46 MISMATCH(*_other
.get(),WrappedPiece
<Variant
>);
51 virtual QString
name() const {
52 return m_piece
.name();
55 virtual PiecePtr
clone() const {
56 return PiecePtr(new WrappedPiece
<Variant
>(m_piece
));
60 template <typename Variant
>
61 class WrappedMove
: public AbstractMove
{
62 typedef typename VariantData
<Variant
>::LegalityCheck LegalityCheck
;
63 typedef typename VariantData
<Variant
>::Serializer Serializer
;
64 typedef typename VariantData
<Variant
>::Move Move
;
65 typedef typename VariantData
<Variant
>::GameState GameState
;
69 const Move
& inner() const { return m_move
; }
70 Move
& inner() { return m_move
; }
72 WrappedMove(const Move
& move
)
75 virtual QString
SAN(const PositionPtr
& _ref
) const {
76 WrappedPosition
<Variant
>* ref
= dynamic_cast<WrappedPosition
<Variant
>*>(_ref
.get());
79 Serializer
serializer(Serializer::COMPACT
);
80 return serializer
.serialize(m_move
, ref
->inner());
83 MISMATCH(*_ref
.get(), WrappedPosition
<Variant
>);
88 virtual DecoratedMove
toDecoratedMove(const PositionPtr
& _ref
) const {
89 WrappedPosition
<Variant
>* ref
= dynamic_cast<WrappedPosition
<Variant
>*>(_ref
.get());
92 Serializer
serializer(Serializer::DECORATED
);
93 return DecoratedMove(serializer
.serialize(m_move
, ref
->inner()));
96 MISMATCH(*_ref
.get(), WrappedPosition
<Variant
>);
97 return DecoratedMove("$@%");
101 virtual QString
toString(const PositionPtr
& _ref
) const {
102 WrappedPosition
<Variant
>* ref
= dynamic_cast<WrappedPosition
<Variant
>*>(_ref
.get());
105 Serializer
serializer(Serializer::SIMPLE
);
106 return serializer
.serialize(m_move
, ref
->inner());
109 MISMATCH(*_ref
.get(), WrappedPosition
<Variant
>);
114 virtual NormalUserMove
toUserMove() const {
115 MoveFactory
<GameState
> factory
;
116 return factory
.toNormal(m_move
);
119 virtual bool equals(const MovePtr
& _other
) const {
120 WrappedMove
<Variant
>* other
= dynamic_cast<WrappedMove
<Variant
>*>(_other
.get());
123 return m_move
== other
->inner();
125 MISMATCH(*_other
.get(), WrappedMove
<Variant
>);
132 * Metafunction that returns a null pointer when
133 * its template argument is NoPool.
135 template <typename Variant
, typename Pool
>
136 struct ReturnPoolAux
{
137 static PoolPtr
apply(typename
Variant::GameState
& state
, int player
) {
138 return PoolPtr(new WrappedPool
<Variant
>(state
.pool(player
)));
142 template <typename Variant
>
143 struct ReturnPoolAux
<Variant
, NoPool
> {
144 static PoolPtr
apply(typename
Variant::GameState
&, int) {
149 template <typename Variant
>
151 static PoolPtr
apply(typename
Variant::GameState
& state
, int player
) {
152 return ReturnPoolAux
<Variant
, typename
Variant::GameState::Pool
>(state
, player
);
156 template <typename Variant
>
157 class WrappedPosition
: public AbstractPosition
{
158 typedef typename VariantData
<Variant
>::LegalityCheck LegalityCheck
;
159 typedef typename VariantData
<Variant
>::GameState GameState
;
160 typedef typename VariantData
<Variant
>::Board Board
;
161 typedef typename VariantData
<Variant
>::Piece Piece
;
162 typedef typename VariantData
<Variant
>::Move Move
;
163 typedef typename VariantData
<Variant
>::Serializer Serializer
;
167 const GameState
& inner() const { return m_state
; }
168 GameState
& inner() { return m_state
; }
170 WrappedPosition(const GameState
& state
)
173 virtual Point
size() const {
174 return m_state
.board().size();
177 virtual QStringList
borderCoords() const {
178 return m_state
.board().borderCoords();
181 virtual void setup() {
185 virtual PiecePtr
get(const Point
& p
) const {
186 Piece piece
= m_state
.board().get(p
);
187 if (piece
!= Piece())
188 return PiecePtr(new WrappedPiece
<Variant
>(piece
));
193 virtual void set(const Point
& p
, const PiecePtr
& _piece
) {
195 m_state
.board().set(p
, Piece());
198 WrappedPiece
<Variant
>* piece
= dynamic_cast<WrappedPiece
<Variant
>*>(_piece
.get());
201 m_state
.board().set(p
, piece
->inner());
203 MISMATCH(*_piece
.get(), WrappedPiece
<Variant
>);
207 virtual PoolPtr
pool(int) {
212 virtual void copyPoolFrom(const PositionPtr
&) {
216 virtual InteractionType
movable(const TurnTest
& test
, const Point
& p
) const {
217 LegalityCheck
check(m_state
);
218 return check
.movable(test
, p
);
221 virtual InteractionType
droppable(const TurnTest
& test
, int index
) const {
222 LegalityCheck
check(m_state
);
223 return check
.droppable(test
, index
);
226 virtual int turn() const {
227 return static_cast<int>(m_state
.turn());
230 virtual void setTurn(int turn
) {
231 m_state
.setTurn(static_cast<typename
Piece::Color
>(turn
));
234 virtual int previousTurn() const {
235 return static_cast<int>(m_state
.previousTurn());
238 virtual void switchTurn() {
239 m_state
.switchTurn();
242 virtual bool testMove(const MovePtr
& _move
) const {
243 WrappedMove
<Variant
>* move
= dynamic_cast<WrappedMove
<Variant
>*>(_move
.get());
246 LegalityCheck
check(m_state
);
247 return check
.legal(move
->inner());
250 MISMATCH(*_move
.get(), WrappedMove
<Variant
>);
255 virtual void move(const MovePtr
& _move
) {
256 WrappedMove
<Variant
>* move
= dynamic_cast<WrappedMove
<Variant
>*>(_move
.get());
259 m_state
.move(move
->inner());
261 MISMATCH(*_move
.get(), WrappedMove
<Variant
>);
264 virtual PositionPtr
clone() const {
265 return PositionPtr(new WrappedPosition
<Variant
>(m_state
));
268 virtual void copyFrom(const PositionPtr
& _p
) {
269 // TODO: check if this is used somewhere
270 WrappedPosition
<Variant
>* p
= dynamic_cast<WrappedPosition
<Variant
>*>(_p
.get());
273 m_state
= p
->inner();
275 MISMATCH(*_p
.get(), WrappedPosition
);
278 virtual bool equals(const PositionPtr
& _other
) const {
279 WrappedPosition
<Variant
>* other
= dynamic_cast<WrappedPosition
<Variant
>*>(_other
.get());
282 return m_state
== other
->inner();
284 MISMATCH(*_other
.get(), WrappedPosition
<Variant
>);
289 virtual MovePtr
getMove(const QString
& san
) const {
290 Serializer
serializer(Serializer::COMPACT
);
291 Move res
= serializer
.deserialize(san
, m_state
);
293 return MovePtr(new WrappedMove
<Variant
>(res
));
299 virtual QString
state() const {
303 virtual QString
fen(int, int) const {
307 virtual PiecePtr
moveHint(const MovePtr
&) const {
308 return PiecePtr(); // BROKEN
311 virtual QString
variant() const {
312 return Variant::m_name
;
315 virtual void dump() const {
322 #include "graphicalapi_unwrapped.h"
324 namespace HLVariant
{
326 template <typename Variant
>
327 class WrappedAnimator
: public AbstractAnimator
{
328 typedef typename VariantData
<Variant
>::GameState GameState
;
329 typedef typename VariantData
<Variant
>::Animator Animator
;
330 typedef typename VariantData
<Variant
>::Move Move
;
334 const Animator
& inner() const { return m_animator
; }
336 WrappedAnimator(const Animator
& animator
)
337 : m_animator(animator
) { }
339 virtual AnimationPtr
warp(const PositionPtr
& _pos
) {
340 WrappedPosition
<Variant
>* pos
= dynamic_cast<WrappedPosition
<Variant
>*>(_pos
.get());
342 return m_animator
.warp(pos
->inner());
344 MISMATCH(*_pos
.get(), WrappedPosition
<Variant
>);
345 return AnimationPtr();
349 virtual AnimationPtr
forward(const PositionPtr
& _pos
, const MovePtr
& _move
) {
350 WrappedPosition
<Variant
>* pos
= dynamic_cast<WrappedPosition
<Variant
>*>(_pos
.get());
351 WrappedMove
<Variant
>* move
= dynamic_cast<WrappedMove
<Variant
>*>(_move
.get());
354 return m_animator
.forward(pos
->inner(), move
->inner());
357 MISMATCH(*_move
.get(), WrappedMove
<Variant
>);
359 MISMATCH(*_pos
.get(), WrappedPosition
<Variant
>);
360 return AnimationPtr();
364 virtual AnimationPtr
back(const PositionPtr
& _pos
, const MovePtr
& _move
) {
365 WrappedPosition
<Variant
>* pos
= dynamic_cast<WrappedPosition
<Variant
>*>(_pos
.get());
366 WrappedMove
<Variant
>* move
= dynamic_cast<WrappedMove
<Variant
>*>(_move
.get());
369 return m_animator
.back(pos
->inner(), move
->inner());
372 MISMATCH(*_move
.get(), WrappedMove
<Variant
>);
374 MISMATCH(*_pos
.get(), WrappedPosition
<Variant
>);
375 return AnimationPtr();
382 template <typename Variant
>
383 class WrappedVariantInfo
: public VariantInfo
{
384 typedef typename VariantData
<Variant
>::Animator Animator
;
385 typedef typename VariantData
<Variant
>::GameState GameState
;
386 typedef typename VariantData
<Variant
>::Piece Piece
;
387 typedef typename VariantData
<Variant
>::Move Move
;
388 // typedef typename VariantData<Variant>::Pool Pool;
390 virtual PositionPtr
createPosition() {
392 new WrappedPosition
<Variant
>(GameState()));
395 virtual PositionPtr
createCustomPosition(const OptList
&) {
397 new WrappedPosition
<Variant
>(GameState())); // BROKEN
400 virtual PositionPtr
createPositionFromFEN(const QString
&) {
401 return PositionPtr(); // BROKEN
404 virtual void forallPieces(class PieceFunction
&) {
408 virtual int moveListLayout() const {
409 return Variant::moveListLayout();
412 virtual AnimatorPtr
createAnimator(GraphicalAPI
* graphical_api
) {
413 return AnimatorPtr(new WrappedAnimator
<Variant
>(
415 typename UnwrappedGraphicalAPIPtr
<Variant
>::type(
416 new UnwrappedGraphicalAPI
<Variant
>(graphical_api
)))));
419 virtual MovePtr
createNormalMove(const NormalUserMove
& move
) {
420 MoveFactory
<GameState
> factory
;
421 Move m
= factory
.createNormalMove(move
);
422 return MovePtr(new WrappedMove
<Variant
>(m
));
425 virtual MovePtr
createDropMove(const DropUserMove
& move
) {
426 MoveFactory
<GameState
> factory
;
427 Move m
= factory
.createDropMove(move
);
428 return MovePtr(new WrappedMove
<Variant
>(m
));
431 virtual MovePtr
getVerboseMove(int, const VerboseNotation
&) const {
432 return MovePtr(); // BROKEN
435 virtual bool simpleMoves() {
436 return Variant::m_simple_moves
;
439 virtual QString
name() const {
440 return Variant::m_name
;
443 virtual QString
themeProxy() const {
444 return Variant::m_theme_proxy
;
447 virtual OptList
positionOptions() const {
448 return Variant::positionOptions();
451 virtual ICSAPIPtr
icsAPI() const {
452 return ICSAPIPtr(); // BROKEN
457 #endif // HLVARIANT__TAGUA_WRAPPED_H