Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/consolecommands3/src/libraries/core/command/Executor.h @ 7214

Last change on this file since 7214 was 7214, checked in by landauf, 14 years ago

progress on the new console command interface.
enhanced possibilities to compare Functors and to manipulate Executors

  • Property svn:eol-style set to native
File size: 10.6 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      ...
26 *
27 *   Inspiration: Executor by Benjamin Grauer
28 */
29
30#ifndef _Executor_H__
31#define _Executor_H__
32
33#include "core/CorePrereqs.h"
34
35#include <string>
36#include "util/MultiType.h"
37#include "Functor.h"
38#include "ExecutorPtr.h"
39
40namespace orxonox
41{
42    class _CoreExport Executor
43    {
44        public:
45            Executor(const FunctorPtr& functor, const std::string& name = "");
46            virtual ~Executor();
47
48            inline MultiType operator()() const
49                { return (*this->functor_)(this->defaultValue_[0], this->defaultValue_[1], this->defaultValue_[2], this->defaultValue_[3], this->defaultValue_[4]); }
50            inline MultiType operator()(const MultiType& param1) const
51                { return (*this->functor_)(param1, this->defaultValue_[1], this->defaultValue_[2], this->defaultValue_[3], this->defaultValue_[4]); }
52            inline MultiType operator()(const MultiType& param1, const MultiType& param2) const
53                { return (*this->functor_)(param1, param2, this->defaultValue_[2], this->defaultValue_[3], this->defaultValue_[4]); }
54            inline MultiType operator()(const MultiType& param1, const MultiType& param2, const MultiType& param3) const
55                { return (*this->functor_)(param1, param2, param3, this->defaultValue_[3], this->defaultValue_[4]); }
56            inline MultiType operator()(const MultiType& param1, const MultiType& param2, const MultiType& param3, const MultiType& param4) const
57                { return (*this->functor_)(param1, param2, param3, param4, this->defaultValue_[4]); }
58            inline MultiType operator()(const MultiType& param1, const MultiType& param2, const MultiType& param3, const MultiType& param4, const MultiType& param5) const
59                { return (*this->functor_)(param1, param2, param3, param4, param5); }
60
61            MultiType parse(const std::string& params, bool* success = 0, const std::string& delimiter = " ") const;
62
63            bool evaluate(const std::string& params, MultiType param[5], const std::string& delimiter = " ") const;
64
65            inline void setFunctor(const FunctorPtr& functor)
66                { this->functor_ = functor; }
67            inline const FunctorPtr& getFunctor() const
68                { return this->functor_; }
69
70            inline void setName(const std::string& name)
71                { this->name_ = name; }
72            inline const std::string& getName() const
73                { return this->name_; }
74
75            inline unsigned int getParamCount() const
76                { return this->functor_->getParamCount(); }
77            inline bool hasReturnvalue() const
78                { return this->functor_->hasReturnvalue(); }
79            inline Functor::Type::Enum getType() const
80                { return this->functor_->getType(); }
81            inline std::string getTypenameParam(unsigned int param) const
82                { return this->functor_->getTypenameParam(param); }
83            inline std::string getTypenameReturnvalue() const
84                { return this->functor_->getTypenameReturnvalue(); }
85
86            void setDefaultValues(const MultiType& param1);
87            void setDefaultValues(const MultiType& param1, const MultiType& param2);
88            void setDefaultValues(const MultiType& param1, const MultiType& param2, const MultiType& param3);
89            void setDefaultValues(const MultiType& param1, const MultiType& param2, const MultiType& param3, const MultiType& param4);
90            void setDefaultValues(const MultiType& param1, const MultiType& param2, const MultiType& param3, const MultiType& param4, const MultiType& param5);
91            void setDefaultValue(unsigned int index, const MultiType& param);
92
93            inline MultiType getDefaultValue(unsigned int index) const
94            {
95                if (index < MAX_FUNCTOR_ARGUMENTS)
96                    return this->defaultValue_[index];
97
98                return MT_Type::Null;
99            }
100
101            bool allDefaultValuesSet() const;
102            inline bool defaultValueSet(unsigned int index) const
103            {
104                if (index < MAX_FUNCTOR_ARGUMENTS)
105                    return !this->defaultValue_[index].null();
106
107                return false;
108            }
109
110        protected:
111            FunctorPtr functor_;
112            std::string name_;
113            MultiType defaultValue_[MAX_FUNCTOR_ARGUMENTS];
114    };
115
116    class _CoreExport ExecutorStatic : public Executor
117    {
118        public:
119            ExecutorStatic(const FunctorStaticPtr& functor, const std::string& name = "") : Executor(functor, name) {}
120            virtual ~ExecutorStatic() {}
121    };
122
123    template <class T>
124    class ExecutorMember : public Executor
125    {
126        public:
127            ExecutorMember(const FunctorMemberPtr<T>& functor, const std::string& name = "") : Executor(functor, name), functorMember_(functor) {}
128            virtual ~ExecutorMember() {}
129
130            using Executor::operator();
131
132            inline MultiType operator()(T* object) const
133                { return (*this->functorMember_)(object, this->defaultValue_[0], this->defaultValue_[1], this->defaultValue_[2], this->defaultValue_[3], this->defaultValue_[4]); }
134            inline MultiType operator()(T* object, const MultiType& param1) const
135                { return (*this->functorMember_)(object, param1, this->defaultValue_[1], this->defaultValue_[2], this->defaultValue_[3], this->defaultValue_[4]); }
136            inline MultiType operator()(T* object, const MultiType& param1, const MultiType& param2) const
137                { return (*this->functorMember_)(object, param1, param2, this->defaultValue_[2], this->defaultValue_[3], this->defaultValue_[4]); }
138            inline MultiType operator()(T* object, const MultiType& param1, const MultiType& param2, const MultiType& param3) const
139                { return (*this->functorMember_)(object, param1, param2, param3, this->defaultValue_[3], this->defaultValue_[4]); }
140            inline MultiType operator()(T* object, const MultiType& param1, const MultiType& param2, const MultiType& param3, const MultiType& param4) const
141                { return (*this->functorMember_)(object, param1, param2, param3, param4, this->defaultValue_[4]); }
142            inline MultiType operator()(T* object, const MultiType& param1, const MultiType& param2, const MultiType& param3, const MultiType& param4, const MultiType& param5) const
143                { return (*this->functorMember_)(object, param1, param2, param3, param4, param5); }
144
145
146            inline MultiType operator()(const T* object) const
147                { return (*this->functorMember_)(object, this->defaultValue_[0], this->defaultValue_[1], this->defaultValue_[2], this->defaultValue_[3], this->defaultValue_[4]); }
148            inline MultiType operator()(const T* object, const MultiType& param1) const
149                { return (*this->functorMember_)(object, param1, this->defaultValue_[1], this->defaultValue_[2], this->defaultValue_[3], this->defaultValue_[4]); }
150            inline MultiType operator()(const T* object, const MultiType& param1, const MultiType& param2) const
151                { return (*this->functorMember_)(object, param1, param2, this->defaultValue_[2], this->defaultValue_[3], this->defaultValue_[4]); }
152            inline MultiType operator()(const T* object, const MultiType& param1, const MultiType& param2, const MultiType& param3) const
153                { return (*this->functorMember_)(object, param1, param2, param3, this->defaultValue_[3], this->defaultValue_[4]); }
154            inline MultiType operator()(const T* object, const MultiType& param1, const MultiType& param2, const MultiType& param3, const MultiType& param4) const
155                { return (*this->functorMember_)(object, param1, param2, param3, param4, this->defaultValue_[4]); }
156            inline MultiType operator()(const T* object, const MultiType& param1, const MultiType& param2, const MultiType& param3, const MultiType& param4, const MultiType& param5) const
157                { return (*this->functorMember_)(object, param1, param2, param3, param4, param5); }
158
159            inline void setObject(T* object) const
160                { this->functorMember_->setObject(object); }
161            inline void setObject(const T* object) const
162                { this->functorMember_->setObject(object); }
163
164            using Executor::parse;
165
166            MultiType parse(T* object, const std::string& params, bool* success = 0, const std::string& delimiter = " ") const
167            {
168                T* oldobject = this->functorMember_->getObject();
169
170                this->functorMember_->setObject(object);
171                const MultiType& result = this->Executor::parse(params, success, delimiter);
172                this->functorMember_->setObject(oldobject);
173
174                return result;
175            }
176
177            MultiType parse(const T* object, const std::string& params, bool* success = 0, const std::string& delimiter = " ") const
178            {
179                T* oldobject = this->functorMember_->getObject();
180
181                this->functorMember_->setObject(object);
182                const MultiType& result = this->Executor::parse(params, success, delimiter);
183                this->functorMember_->setObjects(oldobject);
184
185                return result;
186            }
187
188        protected:
189            FunctorMemberPtr<T> functorMember_;
190    };
191
192    inline ExecutorPtr createExecutor(const FunctorPtr& functor, const std::string& name = "")
193    {
194        return new Executor(functor, name);
195    }
196
197    template <class T>
198    inline ExecutorMemberPtr<T> createExecutor(const FunctorMemberPtr<T>& functor, const std::string& name = "")
199    {
200        return new ExecutorMember<T>(functor, name);
201    }
202
203    inline ExecutorStaticPtr createExecutor(const FunctorStaticPtr& functor, const std::string& name = "")
204    {
205        return new ExecutorStatic(functor, name);
206    }
207}
208
209#endif /* _Executor_H__ */
Note: See TracBrowser for help on using the repository browser.