1 #ifndef HLVARIANT__ICSAPI_WRAPPED_H
2 #define HLVARIANT__ICSAPI_WRAPPED_H
5 #include "tagua_wrapped.h"
9 template <typename Variant
>
10 class WrappedICSAPI
: public ICSAPI
{
12 virtual PositionPtr
createChessboard(int, bool, bool, bool, bool, const Point
&);
13 virtual PiecePtr
createPiece(const QString
& description
);
14 virtual MovePtr
parseVerbose(const QString
& str
, const PositionPtr
& ref
);
19 template <typename Variant
>
20 PositionPtr WrappedICSAPI
<Variant
>::createChessboard(
26 const Point
& enPassant
) {
27 return PositionPtr(new WrappedPosition
<Variant
>(
28 typename VariantData
<Variant
>::GameState(
29 static_cast<typename VariantData
<Variant
>::Piece::Color
>(turn
),
37 template <typename Variant
>
38 PiecePtr WrappedICSAPI
<Variant
>::createPiece(const QString
& description
) {
39 return PiecePtr(new WrappedPiece
<Variant
>(
40 VariantData
<Variant
>::Piece::fromDescription(description
)));
43 template <typename Variant
>
44 MovePtr WrappedICSAPI
<Variant
>::parseVerbose(const QString
& str
, const PositionPtr
& _ref
) {
48 WrappedPosition
<Variant
>* ref
= dynamic_cast<WrappedPosition
<Variant
>*>(_ref
.get());
50 typename VariantData
<Variant
>::Serializer
serializer(
51 VariantData
<Variant
>::Serializer::ICS_VERBOSE
);
52 return MovePtr(new WrappedMove
<Variant
>(
53 serializer
.deserialize(str
, ref
->inner())));
56 MISMATCH(*_ref
.get(), WrappedPosition
<Variant
>);
62 * Helper metafunction to create a null ICSAPI object
63 * if the variant does not support ICS.
65 template <typename Variant
, bool hasICS
>
66 struct ReturnICSAPIAux
{ };
68 template <typename Variant
>
69 struct ReturnICSAPIAux
<Variant
, true> {
70 static ICSAPI
* apply() {
71 return new WrappedICSAPI
<Variant
>();
75 template <typename Variant
>
76 struct ReturnICSAPIAux
<Variant
, false> {
77 static ICSAPI
* apply() { return 0; }
80 template <typename Variant
>
82 : public ReturnICSAPIAux
<Variant
, Variant::hasICS
> { };
88 #endif // HLVARIANT__ICSAPI_WRAPPED_H