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
&) const {
89 return DecoratedMove(); // BROKEN
92 virtual QString
toString(const PositionPtr
&) const {
96 virtual NormalUserMove
toUserMove() const {
97 return NormalUserMove(); // BROKEN
100 virtual bool equals(const MovePtr
& _other
) const {
101 WrappedMove
<Variant
>* other
= dynamic_cast<WrappedMove
<Variant
>*>(_other
.get());
104 return m_move
== other
->inner();
106 MISMATCH(*_other
.get(), WrappedMove
<Variant
>);
113 * Metafunction that returns a null pointer when
114 * its template argument is NoPool.
116 template <typename Variant
, typename Pool
>
117 struct ReturnPoolAux
{
118 static PoolPtr
apply(typename
Variant::GameState
& state
, int player
) {
119 return PoolPtr(new WrappedPool
<Variant
>(state
.pool(player
)));
123 template <typename Variant
>
124 struct ReturnPoolAux
<Variant
, NoPool
> {
125 static PoolPtr
apply(typename
Variant::GameState
&, int) {
130 template <typename Variant
>
132 static PoolPtr
apply(typename
Variant::GameState
& state
, int player
) {
133 return ReturnPoolAux
<Variant
, typename
Variant::GameState::Pool
>(state
, player
);
137 template <typename Variant
>
138 class WrappedPosition
: public AbstractPosition
{
139 typedef typename VariantData
<Variant
>::LegalityCheck LegalityCheck
;
140 typedef typename VariantData
<Variant
>::GameState GameState
;
141 typedef typename VariantData
<Variant
>::Board Board
;
142 typedef typename VariantData
<Variant
>::Piece Piece
;
143 typedef typename VariantData
<Variant
>::Move Move
;
144 typedef typename VariantData
<Variant
>::Serializer Serializer
;
148 const GameState
& inner() const { return m_state
; }
149 GameState
& inner() { return m_state
; }
151 WrappedPosition(const GameState
& state
)
154 virtual Point
size() const {
155 return m_state
.board().size();
158 virtual QStringList
borderCoords() const {
160 return QStringList();
163 virtual void setup() {
167 virtual PiecePtr
get(const Point
& p
) const {
168 Piece piece
= m_state
.board().get(p
);
169 if (piece
!= Piece())
170 return PiecePtr(new WrappedPiece
<Variant
>(piece
));
175 virtual void set(const Point
& p
, const PiecePtr
& _piece
) {
177 m_state
.board().set(p
, Piece());
180 WrappedPiece
<Variant
>* piece
= dynamic_cast<WrappedPiece
<Variant
>*>(_piece
.get());
183 m_state
.board().set(p
, piece
->inner());
185 MISMATCH(*_piece
.get(), WrappedPiece
<Variant
>);
189 virtual PoolPtr
pool(int) {
194 virtual void copyPoolFrom(const PositionPtr
&) {
198 virtual InteractionType
movable(const TurnTest
& test
, const Point
& p
) const {
199 LegalityCheck
check(m_state
);
200 return check
.movable(test
, p
);
203 virtual InteractionType
droppable(const TurnTest
& test
, int index
) const {
204 LegalityCheck
check(m_state
);
205 return check
.droppable(test
, index
);
208 virtual int turn() const {
209 return static_cast<int>(m_state
.turn());
212 virtual void setTurn(int turn
) {
213 m_state
.setTurn(static_cast<typename
Piece::Color
>(turn
));
216 virtual int previousTurn() const {
217 return static_cast<int>(m_state
.previousTurn());
220 virtual void switchTurn() {
221 m_state
.switchTurn();
224 virtual bool testMove(const MovePtr
& _move
) const {
225 WrappedMove
<Variant
>* move
= dynamic_cast<WrappedMove
<Variant
>*>(_move
.get());
228 LegalityCheck
check(m_state
);
229 return check
.legal(move
->inner());
232 MISMATCH(*_move
.get(), WrappedMove
<Variant
>);
237 virtual void move(const MovePtr
& _move
) {
238 WrappedMove
<Variant
>* move
= dynamic_cast<WrappedMove
<Variant
>*>(_move
.get());
241 m_state
.move(move
->inner());
243 MISMATCH(*_move
.get(), WrappedMove
<Variant
>);
246 virtual PositionPtr
clone() const {
247 return PositionPtr(new WrappedPosition
<Variant
>(m_state
));
250 virtual void copyFrom(const PositionPtr
& _p
) {
251 // TODO: check if this is used somewhere
252 WrappedPosition
<Variant
>* p
= dynamic_cast<WrappedPosition
<Variant
>*>(_p
.get());
255 m_state
= p
->inner();
257 MISMATCH(*_p
.get(), WrappedPosition
);
260 virtual bool equals(const PositionPtr
& _other
) const {
261 WrappedPosition
<Variant
>* other
= dynamic_cast<WrappedPosition
<Variant
>*>(_other
.get());
264 return m_state
== other
->inner();
266 MISMATCH(*_other
.get(), WrappedPosition
<Variant
>);
271 virtual MovePtr
getMove(const AlgebraicNotation
&) const {
276 virtual MovePtr
getMove(const QString
& san
) const {
277 Serializer
serializer(Serializer::COMPACT
);
278 Move res
= serializer
.deserialize(san
, m_state
);
280 return MovePtr(new WrappedMove
<Variant
>(res
));
286 virtual QString
state() const {
290 virtual QString
fen(int, int) const {
294 virtual PiecePtr
moveHint(const MovePtr
&) const {
295 return PiecePtr(); // BROKEN
298 virtual QString
variant() const {
299 return Variant::m_name
;
302 virtual void dump() const {
309 #include "graphicalapi_unwrapped.h"
311 namespace HLVariant
{
313 template <typename Variant
>
314 class WrappedAnimator
: public AbstractAnimator
{
315 typedef typename VariantData
<Variant
>::GameState GameState
;
316 typedef typename VariantData
<Variant
>::Animator Animator
;
317 typedef typename VariantData
<Variant
>::Move Move
;
321 const Animator
& inner() const { return m_animator
; }
323 WrappedAnimator(const Animator
& animator
)
324 : m_animator(animator
) { }
326 virtual AnimationPtr
warp(const PositionPtr
& _pos
) {
327 WrappedPosition
<Variant
>* pos
= dynamic_cast<WrappedPosition
<Variant
>*>(_pos
.get());
329 return m_animator
.warp(pos
->inner());
331 MISMATCH(*_pos
.get(), WrappedPosition
<Variant
>);
332 return AnimationPtr();
336 virtual AnimationPtr
forward(const PositionPtr
& _pos
, const MovePtr
& _move
) {
337 WrappedPosition
<Variant
>* pos
= dynamic_cast<WrappedPosition
<Variant
>*>(_pos
.get());
338 WrappedMove
<Variant
>* move
= dynamic_cast<WrappedMove
<Variant
>*>(_move
.get());
341 return m_animator
.forward(pos
->inner(), move
->inner());
344 MISMATCH(*_move
.get(), WrappedMove
<Variant
>);
346 MISMATCH(*_pos
.get(), WrappedPosition
<Variant
>);
347 return AnimationPtr();
351 virtual AnimationPtr
back(const PositionPtr
& _pos
, const MovePtr
& _move
) {
352 WrappedPosition
<Variant
>* pos
= dynamic_cast<WrappedPosition
<Variant
>*>(_pos
.get());
353 WrappedMove
<Variant
>* move
= dynamic_cast<WrappedMove
<Variant
>*>(_move
.get());
356 return m_animator
.back(pos
->inner(), move
->inner());
359 MISMATCH(*_move
.get(), WrappedMove
<Variant
>);
361 MISMATCH(*_pos
.get(), WrappedPosition
<Variant
>);
362 return AnimationPtr();
369 template <typename Variant
>
370 class WrappedVariantInfo
: public VariantInfo
{
371 typedef typename VariantData
<Variant
>::Animator Animator
;
372 typedef typename VariantData
<Variant
>::GameState GameState
;
373 typedef typename VariantData
<Variant
>::Piece Piece
;
374 typedef typename VariantData
<Variant
>::Move Move
;
375 // typedef typename VariantData<Variant>::Pool Pool;
377 virtual PositionPtr
createPosition() {
379 new WrappedPosition
<Variant
>(GameState()));
382 virtual PositionPtr
createCustomPosition(const OptList
&) {
384 new WrappedPosition
<Variant
>(GameState())); // BROKEN
387 virtual PositionPtr
createPositionFromFEN(const QString
&) {
388 return PositionPtr(); // BROKEN
391 virtual void forallPieces(class PieceFunction
&) {
395 virtual int moveListLayout() const {
396 return Variant::moveListLayout();
399 virtual AnimatorPtr
createAnimator(GraphicalAPI
* graphical_api
) {
401 new WrappedAnimator
<Variant
>(
402 Animator(typename UnwrappedGraphicalAPI
<Variant
>::Ptr(
403 new UnwrappedGraphicalAPI
<Variant
>(graphical_api
)))));
406 virtual MovePtr
createNormalMove(const NormalUserMove
& move
) {
407 MoveFactory
<GameState
> factory
;
408 Move m
= factory
.createNormalMove(move
);
409 return MovePtr(new WrappedMove
<Variant
>(m
));
412 virtual MovePtr
createDropMove(const DropUserMove
& move
) {
413 MoveFactory
<GameState
> factory
;
414 Move m
= factory
.createDropMove(move
);
415 return MovePtr(new WrappedMove
<Variant
>(m
));
418 virtual MovePtr
getVerboseMove(int turn
, const VerboseNotation
& m
) const {
419 return MovePtr(); // BROKEN
422 virtual bool simpleMoves() {
423 return Variant::m_simple_moves
;
426 virtual QString
name() const {
427 return Variant::m_name
;
430 virtual QString
themeProxy() const {
431 return Variant::m_theme_proxy
;
434 virtual OptList
positionOptions() const {
435 return Variant::positionOptions();
438 virtual ICSAPIPtr
icsAPI() const {
439 return ICSAPIPtr(); // BROKEN
444 #endif // HLVARIANT__TAGUA_WRAPPED_H