From f3dcfa3b39f0f999bb1295311c48ff0d13eefdd0 Mon Sep 17 00:00:00 2001 From: Yann Dirson Date: Sat, 15 Mar 2008 16:18:30 +0100 Subject: [PATCH] Attempt to put the *State class hierarchy back on its feet. --- src/core/defaultstate.h | 2 +- src/core/delegators/defaultstate.h | 23 ++++++++++++++++++++++- src/core/delegators/state.h | 2 +- src/variants/minishogi/minishogi.cpp | 2 +- src/variants/minishogi/state.cpp | 2 +- src/variants/minishogi/state.h | 4 ++-- 6 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/core/defaultstate.h b/src/core/defaultstate.h index 7d14b18..6c602b2 100644 --- a/src/core/defaultstate.h +++ b/src/core/defaultstate.h @@ -8,7 +8,7 @@ #include -class TAGUA_EXPORT DefaultState : public IState { +class TAGUA_EXPORT DefaultState : virtual public IState { public: virtual std::vector theoreticalMoves(const Piece& piece, const Point& src) const; diff --git a/src/core/delegators/defaultstate.h b/src/core/delegators/defaultstate.h index 45ac51b..35e93a9 100644 --- a/src/core/delegators/defaultstate.h +++ b/src/core/delegators/defaultstate.h @@ -2,11 +2,32 @@ #define DELEGATORS__DEFAULT_STATE_H #include "state.h" +#include "../defaultstate.h" + +#include + +#include namespace Delegators { -class DefaultState : public State, public DefaultState { +class DefaultState : public State, public ::DefaultState { +protected: + ::DefaultState* m_state; public: + DefaultState(IState* state) + : State(state) { + ::DefaultState* dstate = dynamic_cast< ::DefaultState*>(state); + if (dstate == NULL) { + kError() << "Delegators::DefaultState needs a ::DefaultState, cannot use a" + << typeid(state).name(); + abort(); + } + + m_state = dstate; + m_state->setDelegator(this); + } + virtual ~DefaultState() { delete m_state; } + virtual std::vector theoreticalMoves(const Piece& piece, const Point& src) const { return m_state->theoreticalMoves(piece, src); } diff --git a/src/core/delegators/state.h b/src/core/delegators/state.h index 10c28d9..a53f0ed 100644 --- a/src/core/delegators/state.h +++ b/src/core/delegators/state.h @@ -14,7 +14,7 @@ namespace Delegators { -class State : public IState { +class State : virtual public IState { protected: IState* m_state; public: diff --git a/src/variants/minishogi/minishogi.cpp b/src/variants/minishogi/minishogi.cpp index a2c5eab..6b8acac 100644 --- a/src/variants/minishogi/minishogi.cpp +++ b/src/variants/minishogi/minishogi.cpp @@ -50,7 +50,7 @@ taguaminishogi_initrepo(IVariantLoader* loader) { kDebug() << "cloning prototype state" << ok; Q_ASSERT(ok); Q_ASSERT(state_component); - State* state = new State(requestInterface(state_component)); + State* state = new State(requestInterface< ::DefaultState>(state_component)); // set state factory repo->addComponent("state", state); diff --git a/src/variants/minishogi/state.cpp b/src/variants/minishogi/state.cpp index 2c4ffe7..3bafa43 100644 --- a/src/variants/minishogi/state.cpp +++ b/src/variants/minishogi/state.cpp @@ -7,7 +7,7 @@ namespace MiniShogi { State::State(IState* state) -: Delegators::State(state) { } +: Delegators::DefaultState(state) { } IState* State::clone() const { return new State(m_state->clone()); } diff --git a/src/variants/minishogi/state.h b/src/variants/minishogi/state.h index 65d2f3e..5128195 100644 --- a/src/variants/minishogi/state.h +++ b/src/variants/minishogi/state.h @@ -1,13 +1,13 @@ #ifndef MINISHOGI__STATE_H #define MINISHOGI__STATE_H -#include +#include #include #include namespace MiniShogi { -class State : public Component, public Delegators::State { +class State : public Component, public Delegators::DefaultState { Q_OBJECT public: State(IState* state); -- 2.11.4.GIT