Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 7179


Ignore:
Timestamp:
Aug 18, 2010, 3:39:01 PM (14 years ago)
Author:
landauf
Message:

merged consolecommands2 to consolecommands3

Location:
code/branches/consolecommands3
Files:
6 edited
1 copied

Legend:

Unmodified
Added
Removed
  • code/branches/consolecommands3

  • code/branches/consolecommands3/src/libraries/core/ConsoleCommand.cc

    r5781 r7179  
    2828
    2929#include "ConsoleCommand.h"
     30#include <cassert>
    3031
    3132namespace orxonox
     
    7172    }
    7273}
     74
     75#include "BaseObject.h" // remove this
     76
     77namespace orxonox
     78{
     79    _SetConsoleCommand("BaseObject", "setName", &BaseObject::setName, (BaseObject*)0);
     80    _ConsoleCommand::_ConsoleCommandManipulator test(_ModifyConsoleCommand("BaseObject", "setName").setFunction(&BaseObject::setActive));
     81
     82    _ConsoleCommand::_ConsoleCommand(const std::string& group, const std::string& name, Functor* functor, State::Enum state) : Executor(functor, name), functionHeader_(functor->getHeaderIdentifier())
     83    {
     84        this->state_ = state;
     85        _ConsoleCommand::registerCommand(group, name, this);
     86    }
     87
     88    _ConsoleCommand& _ConsoleCommand::addShortcut()
     89    {
     90        _ConsoleCommand::registerCommand("", this->getName(), this);
     91        return *this;
     92    }
     93
     94    _ConsoleCommand& _ConsoleCommand::addShortcut(const std::string&  name)
     95    {
     96        _ConsoleCommand::registerCommand("", name, this);
     97        return *this;
     98    }
     99
     100    _ConsoleCommand& _ConsoleCommand::addGroup(const std::string& group)
     101    {
     102        _ConsoleCommand::registerCommand(group, this->getName(), this);
     103        return *this;
     104    }
     105
     106    _ConsoleCommand& _ConsoleCommand::addGroup(const std::string& group, const std::string&  name)
     107    {
     108        _ConsoleCommand::registerCommand(group, name, this);
     109        return *this;
     110    }
     111
     112    void _ConsoleCommand::setActive(bool bActive)
     113    {
     114        if (bActive)
     115        {
     116            if (this->state_ == State::Inactive)
     117                this->state_ = State::Active;
     118            else if (this->state_ == State::UninitializedInactive)
     119                this->state_ = State::UninitializedActive;
     120        }
     121        else
     122        {
     123            if (this->state_ == State::Active)
     124                this->state_ = State::Inactive;
     125            else if (this->state_ == State::UninitializedActive)
     126                this->state_ = State::UninitializedInactive;
     127        }
     128    }
     129
     130    void _ConsoleCommand::setInitialized(bool bInitialized)
     131    {
     132        if (bInitialized)
     133        {
     134            if (this->state_ == State::UninitializedActive)
     135                this->state_ = State::Active;
     136            else if (this->state_ == State::UninitializedInactive)
     137                this->state_ = State::Inactive;
     138        }
     139        else
     140        {
     141            if (this->state_ == State::Active)
     142                this->state_ = State::UninitializedActive;
     143            else if (this->state_ == State::Inactive)
     144                this->state_ = State::UninitializedInactive;
     145        }
     146    }
     147
     148    void _ConsoleCommand::setFunctor(Functor* functor, _ConsoleCommand::ObjectPointer::Enum mode)
     149    {
     150        if (!functor)
     151        {
     152            this->setInitialized(false);
     153            return;
     154        }
     155
     156        if (!this->functionHeaderMatches(functor))
     157        {
     158            COUT(1) << "Error: Couldn't assign new function to console command with name \"" << this->getName() << "\", headers don't match." << std::endl;
     159            return;
     160        }
     161
     162        switch (mode)
     163        {
     164            default:
     165            case _ConsoleCommand::ObjectPointer::Null:
     166            {
     167                this->functor_ = functor;
     168            }
     169            break;
     170
     171            case _ConsoleCommand::ObjectPointer::RawCopy:
     172            {
     173                void* object = (this->functor_) ? this->functor_->getRawObjectPointer() : 0;
     174
     175                this->functor_ = functor;
     176
     177                if (!this->functor_->getBaseObject())
     178                    this->functor_->setRawObjectPointer(object);
     179            }
     180            break;
     181
     182            case _ConsoleCommand::ObjectPointer::CastViaBaseObject:
     183            {
     184                BaseObject* object = (this->functor_) ? this->functor_->getBaseObject() : 0;
     185
     186                this->functor_ = functor;
     187
     188                if (!this->functor_->getBaseObject())
     189                    this->functor_->setBaseObject(object);
     190            }
     191            break;
     192        }
     193    }
     194
     195    bool _ConsoleCommand::functionHeaderMatches(Functor* functor) const
     196    {
     197        if (!this->functor_)
     198        {
     199            assert(false);
     200            return false;
     201        }
     202        return (functor->getHeaderIdentifier() == this->functor_->getHeaderIdentifier());
     203    }
     204
     205    void _ConsoleCommand::setObject(void* object)
     206    {
     207        if (this->functor_)
     208            this->functor_->setRawObjectPointer(object);
     209    }
     210
     211    void _ConsoleCommand::setObject(BaseObject* object)
     212    {
     213        if (this->functor_)
     214            this->functor_->setBaseObject(object);
     215    }
     216
     217    /* static */ const _ConsoleCommand* _ConsoleCommand::getCommand(const std::string& group, const std::string& name, bool bPrintError)
     218    {
     219        std::map<std::string, std::map<std::string, _ConsoleCommand*> >::const_iterator it_group = _ConsoleCommand::getCommandMap().find(group);
     220        if (it_group != _ConsoleCommand::getCommandMap().end())
     221        {
     222            std::map<std::string, _ConsoleCommand*>::const_iterator it_name = it_group->second.find(name);
     223            if (it_name != it_group->second.end())
     224            {
     225                return it_name->second;
     226            }
     227        }
     228        if (bPrintError)
     229        {
     230            if (group == "")
     231                COUT(0) << "Error: Couldn't find console command with shortcut \"" << name << "\"" << std::endl;
     232            else
     233                COUT(0) << "Error: Couldn't find console command with group \"" << group << "\" and name \"" << name << "\"" << std::endl;
     234        }
     235        return 0;
     236    }
     237
     238    /* static */ std::map<std::string, std::map<std::string, _ConsoleCommand*> >& _ConsoleCommand::getCommandMap()
     239    {
     240        static std::map<std::string, std::map<std::string, _ConsoleCommand*> > commandMap;
     241        return commandMap;
     242    }
     243
     244    /* static */ void _ConsoleCommand::registerCommand(const std::string& group, const std::string& name, _ConsoleCommand* command)
     245    {
     246        if (name == "")
     247            return;
     248
     249        if (_ConsoleCommand::getCommand(group, name) != 0)
     250        {
     251            if (group == "")
     252                COUT(2) << "Warning: A console command with shortcut name \"" << name << "\" already exists." << std::endl;
     253            else
     254                COUT(2) << "Warning: A console command with group \"" << group << "\" and name \"" << name << "\" already exists." << std::endl;
     255        }
     256        else
     257        {
     258            _ConsoleCommand::getCommandMap()[group][name] = command;
     259        }
     260    }
     261}
  • code/branches/consolecommands3/src/libraries/core/ConsoleCommand.h

    r5781 r7179  
    3333
    3434#include <boost/preprocessor/cat.hpp>
    35 
     35#include <boost/preprocessor/facilities/expand.hpp>
     36
     37#include "util/VA_NARGS.h"
    3638#include "ArgumentCompletionFunctions.h"
    3739#include "CommandExecutor.h"
     
    155157}
    156158
     159
     160#define _SetConsoleCommand(...) \
     161    BOOST_PP_EXPAND(BOOST_PP_CAT(_SetConsoleCommand, ORXONOX_VA_NARGS(__VA_ARGS__))(__VA_ARGS__))
     162#define _SetConsoleCommand2(name, functionpointer) \
     163    _SetConsoleCommandGeneric("", name, orxonox::createFunctor(functionpointer))
     164#define _SetConsoleCommand3(group, name, functionpointer) \
     165    _SetConsoleCommandGeneric(group, name, orxonox::createFunctor(functionpointer))
     166#define _SetConsoleCommand4(group, name, functionpointer, object) \
     167    _SetConsoleCommandGeneric(group, name, orxonox::createFunctor(functionpointer, object))
     168
     169#define _SetConsoleCommandGeneric(group, name, functor) \
     170    orxonox::_ConsoleCommand& BOOST_PP_CAT(__consolecommand_, __LINE__) = (*orxonox::_createConsoleCommand(group, name, functor))
     171
     172
     173#define _DeclareConsoleCommand(...) \
     174    BOOST_PP_CAT(_DeclareConsoleCommand, ORXONOX_VA_NARGS(__VA_ARGS__))(__VA_ARGS__)
     175#define _DeclareConsoleCommand2(name, functionpointer) \
     176    _DeclareConsoleCommandGeneric("", name, functionpointer)
     177#define _DeclareConsoleCommand3(group, name, functionpointer) \
     178    _DeclareConsoleCommandGeneric(group, name, functionpointer)
     179
     180#define _DeclareConsoleCommandGeneric(group, name, functionpointer) \
     181    orxonox::_ConsoleCommand& BOOST_PP_CAT(__consolecommand_, __LINE__) = (*orxonox::_createConsoleCommand(group, name, orxonox::createFunctor(functionpointer), orxonox::_ConsoleCommand::State::UninitializedActive))
     182
     183
     184#define _ModifyConsoleCommand(...) \
     185    orxonox::_ConsoleCommand::getCommand(__VA_ARGS__, true)->getManipulator()
     186
     187
     188namespace orxonox
     189{
     190    class _CoreExport _ConsoleCommand : protected Executor
     191    {
     192        friend struct _ConsoleCommandManipulator;
     193
     194        public:
     195            struct State
     196            {
     197                enum Enum
     198                {
     199                    UninitializedActive,
     200                    UninitializedInactive,
     201                    Active,
     202                    Inactive
     203                };
     204            };
     205
     206            struct ObjectPointer
     207            {
     208                enum Enum
     209                {
     210                    Null,
     211                    RawCopy,
     212                    CastViaBaseObject
     213                };
     214            };
     215
     216            struct _ConsoleCommandManipulator
     217            {
     218                public:
     219                    _ConsoleCommandManipulator(const _ConsoleCommand* command) : command_(const_cast<_ConsoleCommand*>(command)) {}
     220
     221                    template <class F>
     222                    inline _ConsoleCommandManipulator& setFunction(F function, _ConsoleCommand::ObjectPointer::Enum mode = _ConsoleCommand::ObjectPointer::Null)
     223                        { if (this->command_) { this->command_->setFunctor(createFunctor(function), mode); } return *this; }
     224                    template <class F, class O>
     225                    inline _ConsoleCommandManipulator& setFunction(F function, O* object)
     226                        { if (this->command_) { this->command_->setFunctor(createFunctor(function, object)); } return *this; }
     227                    inline _ConsoleCommandManipulator& setFunction(Functor* functor)
     228                        { if (this->command_) { this->command_->setFunctor(functor); } return *this; }
     229                    inline _ConsoleCommandManipulator& setFunction(const _ConsoleCommand* command)
     230                        { if (this->command_) { this->command_->setFunctor(command->functor_); } return *this; }
     231                    inline _ConsoleCommandManipulator& setFunction(const _ConsoleCommandManipulator& manipulator)
     232                        { if (this->command_) { this->command_->setFunctor(manipulator.command_->functor_); } return *this; }
     233
     234                    template <class F>
     235                    inline _ConsoleCommandManipulator& pushFunction(F function, _ConsoleCommand::ObjectPointer::Enum mode = _ConsoleCommand::ObjectPointer::Null)
     236                        { if (this->command_) { this->command_->pushFunctor(createFunctor(function), mode); } return *this; }
     237                    template <class F, class O>
     238                    inline _ConsoleCommandManipulator& pushFunction(F function, O* object)
     239                        { if (this->command_) { this->command_->pushFunctor(createFunctor(function, object)); } return *this; }
     240                    inline _ConsoleCommandManipulator& pushFunction(Functor* functor)
     241                        { if (this->command_) { this->command_->pushFunctor(functor); } return *this; }
     242                    inline _ConsoleCommandManipulator& pushFunction(const _ConsoleCommand* command)
     243                        { if (this->command_) { this->command_->pushFunctor(command->functor_); } return *this; }
     244                    inline _ConsoleCommandManipulator& pushFunction(const _ConsoleCommandManipulator& manipulator)
     245                        { if (this->command_) { this->command_->pushFunctor(manipulator.command_->functor_); } return *this; }
     246
     247                    inline _ConsoleCommandManipulator& popFunction()
     248                        { if (this->command_) { this->command_->popFunctor(); } return *this; }
     249
     250                    inline _ConsoleCommandManipulator& setObject(void* object)
     251                        { if (this->command_) { this->command_->setObject(object); } return *this; }
     252                    inline _ConsoleCommandManipulator& setObject(BaseObject* object)
     253                        { if (this->command_) { this->command_->setObject(object); } return *this; }
     254
     255                    inline _ConsoleCommandManipulator& setActive(bool bActive)
     256                        { if (this->command_) { this->command_->setActive(bActive); } return *this; }
     257
     258                private:
     259                    _ConsoleCommand* command_;
     260            };
     261
     262        public:
     263            _ConsoleCommand(const std::string& group, const std::string& name, Functor* functor, State::Enum state = State::Active);
     264
     265            _ConsoleCommand& addShortcut();
     266            _ConsoleCommand& addShortcut(const std::string&  name);
     267            _ConsoleCommand& addGroup(const std::string& group);
     268            _ConsoleCommand& addGroup(const std::string& group, const std::string&  name);
     269
     270            void setActive(bool bActive);
     271            inline State::Enum getState() const
     272                { return this->state_; }
     273            inline bool isActive() const
     274                { return (this->state_ == State::Active); }
     275
     276            static inline const std::map<std::string, std::map<std::string, _ConsoleCommand*> >& getCommands()
     277                { return _ConsoleCommand::getCommandMap(); }
     278
     279            static inline const _ConsoleCommand* getCommand(const std::string& name, bool bPrintError = false)
     280                { return _ConsoleCommand::getCommand("", name, bPrintError); }
     281            static const _ConsoleCommand* getCommand(const std::string& group, const std::string& name, bool bPrintError = false);
     282
     283            inline _ConsoleCommandManipulator getManipulator() const
     284                { return this; }
     285
     286        private:
     287            static std::map<std::string, std::map<std::string, _ConsoleCommand*> >& getCommandMap();
     288            static void registerCommand(const std::string& group, const std::string& name, _ConsoleCommand* command);
     289
     290            void setInitialized(bool bInitialized);
     291
     292            void setFunctor(Functor* functor, _ConsoleCommand::ObjectPointer::Enum mode = _ConsoleCommand::ObjectPointer::Null);
     293            void pushFunctor(Functor* functor, _ConsoleCommand::ObjectPointer::Enum mode = _ConsoleCommand::ObjectPointer::Null);
     294            void popFunctor();
     295            bool functionHeaderMatches(Functor* functor) const;
     296
     297            void setObject(void* object);
     298            void setObject(BaseObject* object);
     299
     300            State::Enum state_;
     301            const std::type_info& functionHeader_;
     302    };
     303
     304    inline _ConsoleCommand* _createConsoleCommand(const std::string& name, Functor* functor, _ConsoleCommand::State::Enum state = _ConsoleCommand::State::Active)
     305    {
     306        return new _ConsoleCommand("", name, functor, state);
     307    }
     308
     309    inline _ConsoleCommand* _createConsoleCommand(const std::string& group, const std::string& name, Functor* functor, _ConsoleCommand::State::Enum state = _ConsoleCommand::State::Active)
     310    {
     311        return new _ConsoleCommand(group, name, functor, state);
     312    }
     313}
     314
    157315#endif /* _ConsoleCommand_H__ */
  • code/branches/consolecommands3/src/libraries/core/Functor.h

    r7177 r7179  
    3131#define _Functor_H__
    3232
     33#include <typeinfo>
     34
    3335#include "CorePrereqs.h"
    3436
     37#include "util/Convert.h"
    3538#include "util/Debug.h"
    3639#include "util/MultiType.h"
     40#include "BaseObject.h"
    3741
    3842namespace orxonox
     
    112116            virtual void evaluateParam(unsigned int index, MultiType& param) const = 0;
    113117
     118            virtual void setBaseObject(BaseObject* object) {}
     119            virtual void setBaseObject(const BaseObject* object) {}
     120            virtual BaseObject* getBaseObject() const { return 0; }
     121
     122            virtual void setRawObjectPointer(void* object) {}
     123            virtual void* getRawObjectPointer() const { return 0; }
     124
     125            virtual const std::type_info& getHeaderIdentifier() const = 0;
     126
    114127        protected:
    115128            unsigned int numParams_;
     
    170183            }
    171184
     185            void setBaseObject(BaseObject* object)
     186            {
     187                this->bConstObject_ = false;
     188                this->object_ = dynamic_cast<T*>(object);
     189            }
     190
     191            void setBaseObject(const BaseObject* object)
     192            {
     193                this->bConstObject_ = true;
     194                this->constObject_ = dynamic_cast<const T*>(object);
     195            }
     196
     197            BaseObject* getBaseObject() const
     198            {
     199                if (this->bConstObject_)
     200                    return const_cast<BaseObject*>(upcast<const BaseObject*>(this->constObject_));
     201                else
     202                    return upcast<BaseObject*>(this->object_);
     203            }
     204
     205            void setRawObjectPointer(void* object)
     206            {
     207                this->bConstObject_ = false;
     208                this->object_ = (T*)object;
     209            }
     210
     211            void* getRawObjectPointer() const
     212            {
     213                if (this->bConstObject_)
     214                    return (void*)this->constObject_;
     215                else
     216                    return (void*)this->object_;
     217            }
     218
    172219            typedef std::pair<T*, const T*> Objects;
    173220
     
    187234            const T* constObject_;
    188235    };
     236
     237
     238
     239    template <int r, class R, class P1, class P2, class P3, class P4, class P5>
     240    struct FunctorHeaderIdentifier {};
     241
     242
     243
     244    inline Functor* createFunctor(Functor* functor)
     245    {
     246        return functor;
     247    }
    189248
    190249
     
    294353
    295354
     355#define FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES(returnvalue, numparams) FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES##numparams(returnvalue)
     356#define FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES0(returnvalue) <returnvalue, FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES_RETURNVALUE(returnvalue), void, void, void, void, void>
     357#define FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES1(returnvalue) <returnvalue, FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES_RETURNVALUE(returnvalue), P1, void, void, void, void>
     358#define FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES2(returnvalue) <returnvalue, FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES_RETURNVALUE(returnvalue), P1, P2, void, void, void>
     359#define FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES3(returnvalue) <returnvalue, FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES_RETURNVALUE(returnvalue), P1, P2, P3, void, void>
     360#define FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES4(returnvalue) <returnvalue, FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES_RETURNVALUE(returnvalue), P1, P2, P3, P4, void>
     361#define FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES5(returnvalue) <returnvalue, FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES_RETURNVALUE(returnvalue), P1, P2, P3, P4, P5>
     362
     363#define FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES_RETURNVALUE(returnvalue) FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES_RETURNVALUE##returnvalue
     364#define FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES_RETURNVALUE0 void
     365#define FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES_RETURNVALUE1 R
     366
     367
     368
    296369#define FUNCTOR_EVALUATE_PARAM(numparams) FUNCTOR_EVALUATE_PARAM##numparams
    297370#define FUNCTOR_EVALUATE_PARAM0
     
    320393
    321394
    322 
    323395#define CREATE_STATIC_FUNCTOR(returnvalue, numparams) \
    324396    FUNCTOR_TEMPLATE(0, returnvalue, numparams, 0) \
     
    342414            } \
    343415    \
    344             virtual void evaluateParam(unsigned int index, MultiType& param) const \
     416            void evaluateParam(unsigned int index, MultiType& param) const \
    345417            { \
    346418                FUNCTOR_EVALUATE_PARAM(numparams); \
     419            } \
     420    \
     421            const std::type_info& getHeaderIdentifier() const \
     422            { \
     423                return typeid(FunctorHeaderIdentifier FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES(returnvalue, numparams)); \
    347424            } \
    348425    \
     
    386463            } \
    387464    \
    388             virtual void evaluateParam(unsigned int index, MultiType& param) const \
     465            void evaluateParam(unsigned int index, MultiType& param) const \
    389466            { \
    390467                FUNCTOR_EVALUATE_PARAM(numparams); \
     468            } \
     469    \
     470            const std::type_info& getHeaderIdentifier() const \
     471            { \
     472                return typeid(FunctorHeaderIdentifier FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES(returnvalue, numparams)); \
    391473            } \
    392474    \
     
    418500            } \
    419501    \
    420             virtual void evaluateParam(unsigned int index, MultiType& param) const \
     502            void evaluateParam(unsigned int index, MultiType& param) const \
    421503            { \
    422504                FUNCTOR_EVALUATE_PARAM(numparams); \
     505            } \
     506    \
     507            const std::type_info& getHeaderIdentifier() const \
     508            { \
     509                return typeid(FunctorHeaderIdentifier FUNCTOR_HEADER_IDENTIFIER_TEMPLATE_CLASSES(returnvalue, numparams)); \
    423510            } \
    424511    \
     
    457544        return functor; \
    458545    }
     546
    459547
    460548
  • code/branches/consolecommands3/src/libraries/core/LuaState.h

    r6763 r7179  
    5454            void operator()(const MultiType& param1 = MT_Type::Null, const MultiType& param2 = MT_Type::Null, const MultiType& param3 = MT_Type::Null, const MultiType& param4 = MT_Type::Null, const MultiType& param5 = MT_Type::Null);
    5555            void evaluateParam(unsigned int index, MultiType& param) const {}
     56            const std::type_info& getHeaderIdentifier() const { return typeid(this); }
    5657
    5758        private:
  • code/branches/consolecommands3/src/libraries/util/Convert.h

    r7163 r7179  
    116116        }
    117117    };
     118
     119    ////////////
     120    // upcast //
     121    ////////////
     122    namespace detail
     123    {
     124        // perform a static cast if ToType is a base of FromType
     125        template<class ToType, class FromType>
     126        FORCEINLINE ToType upcast(FromType input, detail::Int2Type<true>)
     127        {
     128            return static_cast<ToType>(input);
     129        }
     130
     131        // return zero if ToType is not a base of FromType
     132        template<class ToType, class FromType>
     133        FORCEINLINE ToType upcast(FromType input, detail::Int2Type<false>)
     134        {
     135            return 0;
     136        }
     137    }
     138
     139    // performs an upcast if ToType is a base of FromType, returns zero otherwise
     140    template <class ToType, class FromType>
     141    FORCEINLINE ToType upcast(FromType input)
     142    {
     143        enum { probe = ImplicitConversion<FromType, ToType>::exists };
     144        return detail::upcast<ToType, FromType>(input, detail::Int2Type<probe>());
     145    }
    118146}
    119147
Note: See TracChangeset for help on using the changeset viewer.