Changeset 10347 for code/branches/core7/src/libraries/core/command
- Timestamp:
- Apr 6, 2015, 3:47:42 PM (10 years ago)
- Location:
- code/branches/core7/src/libraries/core/command
- Files:
-
- 1 added
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/core7/src/libraries/core/command/ArgumentCompletionFunctions.cc
r10346 r10347 44 44 #include "CommandExecutor.h" 45 45 #include "ConsoleCommand.h" 46 #include "ConsoleCommandManager.h" 46 47 #include "TclThreadManager.h" 47 48 -
code/branches/core7/src/libraries/core/command/CommandEvaluation.cc
r10346 r10347 37 37 #include "CommandExecutor.h" 38 38 #include "ConsoleCommand.h" 39 #include "ConsoleCommandManager.h" 39 40 40 41 namespace orxonox -
code/branches/core7/src/libraries/core/command/CommandExecutor.cc
r10346 r10347 34 34 #include "CommandExecutor.h" 35 35 36 #include "ConsoleCommand .h"36 #include "ConsoleCommandIncludes.h" 37 37 #include "TclBind.h" 38 38 #include "Shell.h" -
code/branches/core7/src/libraries/core/command/ConsoleCommand.cc
r10346 r10347 39 39 #include "core/input/KeyBinder.h" 40 40 #include "core/input/KeyBinderManager.h" 41 #include "ConsoleCommandManager.h" 41 42 42 43 namespace orxonox -
code/branches/core7/src/libraries/core/command/ConsoleCommand.h
r10346 r10347 28 28 29 29 /** 30 @defgroup ConsoleCommand Console commands31 @ingroup Command32 */33 34 /**35 30 @file 36 31 @ingroup Command ConsoleCommand 37 @brief Declaration of the orxonox::ConsoleCommand class and the SetConsoleCommand() macro. 38 39 @anchor ConsoleCommandExample 40 41 Console commands can be used to write scripts, use key-bindings or simply to be 42 entered into the shell by the user. Instances of orxonox::ConsoleCommand define 43 the function of a command, and also more information like, for example, if it is 44 active, default values, and possible arguments. 45 46 Commands need to be registered to the system statically on startup by using the 47 SetConsoleCommand() or DeclareConsoleCommand() macros outside of a function. 48 This ensures that commands are known to the system at any time, so they can be 49 evaluated (see orxonox::CommandExecutor::evaluate()), for example for key-bindings. 50 51 Example: 52 @code 53 void myCoutFunction(const std::string& text) // Define a static function 54 { 55 orxout() << "Text: " << text << endl; // Print the text to the console 56 } 57 58 SetConsoleCommand("cout", &myCoutFunction); // Register the function as command with name "cout" 59 @endcode 60 61 Now you can open the shell and execute the command: 62 @code 63 $ cout Hello World 64 @endcode 65 66 Internally this command is now passed to orxonox::CommandExecutor::execute(): 67 @code 68 CommandExecutor::execute("cout HelloWorld"); 69 @endcode 70 71 CommandExecutor searches for a command with name "cout" and passes the arguments 72 "Hello World" to it. Because we registered myCoutFunction() with this command, 73 as a result the following text will be printed to the console: 74 @code 75 Text: Hello World 76 @endcode 77 78 You can add more attributes to the ConsoleCommand, by using the command-chain feature 79 of SetConsoleCommand(). For example like this: 80 @code 81 SetConsoleCommand("cout", &myCoutFunction) 82 .addGroup("output", "text") 83 .accessLevel(AccessLevel::Offline) 84 .defaultValues("no text"); 85 @endcode 86 87 Open the shell again and try it: 88 @code 89 $ cout Hello World 90 Text: Hello World 91 $ output text Hello World 92 Text: Hello World 93 $ cout 94 Text: no text 95 @endcode 96 97 If you execute it online (note: the access level is "Offline"), you will see the 98 following (or something similar): 99 @code 100 $ cout Hello World 101 Error: Can't execute command "cout", access denied. 102 @endcode 103 104 If a command is executed, the arguments are passed to an underlying function, 105 whitch is wrapped by an orxonox::Functor which again is wrapped by an orxonox::Executor. 106 The Functor contains the function-pointer, as well as the object-pointer in 107 case of a non-static member-function. The executor stores possible default-values 108 for each argument of the function. 109 110 The function of a command can be changed at any time. It's possible to just exchange 111 the function-pointer of the underlying Functor if the headers of the functions are 112 exactly the same. But you can also exchange the Functor itself or even completely 113 replace the Executor. Also the other attributes of a ConsoleCommand can be modified 114 during the game, for example it can be activated or deactivated. 115 116 To do so, the function ModifyConsoleCommand() has to be used. It returns an instance 117 of orxonox::ConsoleCommand::ConsoleCommandManipulator which has an interface similar to 118 orxonox::ConsoleCommand, but with slight differences. You can use it the same way like 119 SetConsoleCommand(), meaning you can use command-chains to change different attributes at 120 the same time. ModifyConsoleCommand() must not be executed statically, but rather in a 121 function at some point of the execution of the program. 122 123 Example: 124 @code 125 void myOtherCoutFunction(const std::string& text) // Define a new static function 126 { 127 orxout() << "Uppercase: " << getUppercase(text) << endl; // Print the text in uppercase to the console 128 } 129 130 { 131 // ... // somewhere in the code 132 133 ModifyConsoleCommand("cout").setFunction(&myOtherCoutFunction); // Modify the underlying function of the command 134 135 // ... 136 } 137 @endcode 138 139 If you now enter the command into the shell, you'll see a different behavior: 140 @code 141 $ cout Hello World 142 Uppercase: HELLO WORLD 143 $ cout 144 Uppercase: NO TEXT 145 @endcode 146 147 A few important notes about changing functions: 148 149 Instead of changing the function with setFunction(), you can also create a command-stack 150 by using pushFunction() and popFunction(). It's important to note a few things about that, 151 because the underlying structure of Executor and Functor has a few pitfalls: 152 - If you push a new function-pointer, the same executor as before will be used (and, if 153 the headers match, even the same functor can be used, which is very fast) 154 - If you push a new Functor, the same executor as before will be used 155 - If you push a new Executor, everything is changed 156 157 Note that the executor contains the @b default @b values, so if you just exchange the 158 Functor, the default values remain the same. However if you decide to change the default 159 values at any point of the stack, <b>this will also change the default values on all 160 other stack-levels</b> that share the same executor. If you don't like this behavior, 161 you have to explicitly push a new executor before changing the default values, either by 162 calling pushFunction(executor) or by calling pushFunction(void) which pushes a copy of 163 the current executor to the stack. 164 165 Another important point are object pointers in case of non-static member-functions. 166 Whenever you set or push a new function, <b>you must add the object pointer again</b> 167 because objects are stored in the Functor which is usually exchanged if you change 168 the function. 169 170 You can also use a stack for objects, but note that this <b>object-stack is different for each 171 function</b> - so if you set a new function, the object-stack will be cleared. If you push 172 a new function, the old object-stack is stored in the stack, so it can be restored if 173 you pop the function. 174 175 %DeclareConsoleCommand(): 176 177 Appart from SetConsoleCommand() you can also call DeclareConsoleCommand(). In contrast 178 to SetConsoleCommand(), this doesn't assign a function to the command. Indeed you have 179 to pass a function-pointer to DeclareConsoleCommand(), but it is only used to determine 180 the header of the future command-function. This allows to declare a command statically, 181 thus it's possible to evaluate key-bindings of this command, but the actual function 182 can be assigned at a later point. 183 184 Example: 185 @code 186 DeclareConsoleCommand("cout", &prototype::void__string); 187 @endcode 188 189 If you try to execute the command now, you see the following (or something similar): 190 @code 191 $ cout Hello World 192 Error: Can't execute command "cout", command is not active. 193 @endcode 194 195 You first have to assign a function to use the command: 196 @code 197 { 198 // ... 199 200 ModifyConsoleCommand("cout").setFunction(&myCoutFunction); 201 202 // ... 203 } 204 @endcode 205 206 Now you can use it: 207 @code 208 $ cout Hello World 209 Text: Hello World 210 @endcode 211 212 Note that the initial function prototype::void__string is defined in the namespace 213 orxonox::prototype. If there's no function with the desired header, you can extend 214 the collection of functions or simply use another function that has the same header. 32 @brief Declaration of the orxonox::ConsoleCommand class. 215 33 */ 216 34 … … 223 41 #include <vector> 224 42 225 #include "util/VA_NARGS.h"226 43 #include "ArgumentCompletionFunctions.h" 227 44 #include "Executor.h" 228 #include "ConsoleCommandManager.h"229 230 231 /**232 @brief Defines a console command. The macro is overloaded for 2-4 parameters.233 234 This is an overloaded macro. Depending on the number of arguments a different235 overloaded implementation of the macro will be chosen.236 237 Console commands created with SetConsoleCommand() become active immediately and238 the given function-pointer (and optionally the object) will be used to execute239 the command.240 */241 #define SetConsoleCommand(...) \242 BOOST_PP_EXPAND(BOOST_PP_CAT(SetConsoleCommand, ORXONOX_VA_NARGS(__VA_ARGS__))(__VA_ARGS__))243 /**244 @brief This macro is executed if you call SetConsoleCommand() with 2 arguments.245 @param name The name (string) of the console command246 @param functionpointer The function-pointer of the corresponding command-function247 */248 #define SetConsoleCommand2(name, functionpointer) \249 SetConsoleCommandGeneric("", name, orxonox::createFunctor(functionpointer))250 /**251 @brief This macro is executed if you call SetConsoleCommand() with 3 arguments.252 @param group The group (string) of the console command253 @param name The name (string) of the console command254 @param functionpointer The function-pointer of the corresponding command-function255 */256 #define SetConsoleCommand3(group, name, functionpointer) \257 SetConsoleCommandGeneric(group, name, orxonox::createFunctor(functionpointer))258 /**259 @brief This macro is executed if you call SetConsoleCommand() with 4 arguments.260 @param group The group (string) of the console command261 @param name The name (string) of the console command262 @param functionpointer The function-pointer of the corresponding command-function263 @param object The object that will be assigned to the command. Used for member-functions.264 */265 #define SetConsoleCommand4(group, name, functionpointer, object) \266 SetConsoleCommandGeneric(group, name, orxonox::createFunctor(functionpointer, object))267 268 /// Internal macro269 #define SetConsoleCommandGeneric(group, name, functor) \270 static orxonox::ConsoleCommand& BOOST_PP_CAT(__consolecommand_, __UNIQUE_NUMBER__) = (*orxonox::createConsoleCommand(group, name, orxonox::createExecutor(functor)))271 272 273 /**274 @brief Declares a console command. The macro is overloaded for 2-3 parameters.275 276 This is an overloaded macro. Depending on the number of arguments a different277 overloaded implementation of the macro will be chosen.278 279 Console commands created with DeclareConsoleCommand() don't use the the given280 function-pointer to execute the command, it is only used to define the header281 of the future command-function. The command is inactive until you manually282 set a function with orxonox::ModifyConsoleCommand(). You can use a different283 function-pointer than in the final command, as long as it has the same header.284 */285 #define DeclareConsoleCommand(...) \286 BOOST_PP_EXPAND(BOOST_PP_CAT(DeclareConsoleCommand, ORXONOX_VA_NARGS(__VA_ARGS__))(__VA_ARGS__))287 /**288 @brief This macro is executed if you call DeclareConsoleCommand() with 2 arguments.289 @param name The name (string) of the console command290 @param functionpointer The function-pointer of an arbitrary function that has the same header as the final function291 */292 #define DeclareConsoleCommand2(name, functionpointer) \293 DeclareConsoleCommandGeneric("", name, orxonox::createFunctor(functionpointer))294 /**295 @brief This macro is executed if you call DeclareConsoleCommand() with 3 arguments.296 @param group The group (string) of the console command297 @param name The name (string) of the console command298 @param functionpointer The function-pointer of an arbitrary function that has the same header as the final function299 */300 #define DeclareConsoleCommand3(group, name, functionpointer) \301 DeclareConsoleCommandGeneric(group, name, orxonox::createFunctor(functionpointer))302 303 /// Internal macro304 #define DeclareConsoleCommandGeneric(group, name, functor) \305 static orxonox::ConsoleCommand& BOOST_PP_CAT(__consolecommand_, __UNIQUE_NUMBER__) = (*orxonox::createConsoleCommand(group, name, orxonox::createExecutor(functor), false))306 307 45 308 46 namespace orxonox … … 657 395 LanguageEntryLabel descriptionParam_[MAX_FUNCTOR_ARGUMENTS]; ///< A description for each argument 658 396 }; 659 660 /**661 @brief Creates a new ConsoleCommand.662 @param name The name of the command663 @param executor The executor of the command664 @param bInitialized If true, the command is ready to be executed, otherwise it has to be activated first.665 */666 inline ConsoleCommand* createConsoleCommand(const std::string& name, const ExecutorPtr& executor, bool bInitialized = true)667 { return new ConsoleCommand("", name, executor, bInitialized); }668 /**669 @brief Creates a new ConsoleCommand.670 @param group The group of the command671 @param name The name of the command672 @param executor The executor of the command673 @param bInitialized If true, the command is ready to be executed, otherwise it has to be activated first.674 */675 inline ConsoleCommand* createConsoleCommand(const std::string& group, const std::string& name, const ExecutorPtr& executor, bool bInitialized = true)676 { return new ConsoleCommand(group, name, executor, bInitialized); }677 678 679 /**680 @brief Returns a manipulator for a command with the given name.681 682 @note If the command doesn't exist, the manipulator contains a NULL pointer to the command,683 but it can still be used without checks, because all functions of ConsoleCommandManipulator684 check internally if the command exists.685 */686 inline ConsoleCommand::ConsoleCommandManipulator ModifyConsoleCommand(const std::string& name)687 { return ConsoleCommandManager::getCommand(name, true); }688 /**689 @brief Returns a manipulator for a command with the given group and name.690 691 @note If the command doesn't exist, the manipulator contains a NULL pointer to the command,692 but it can still be used without checks, because all functions of ConsoleCommandManipulator693 check internally if the command exists.694 */695 inline ConsoleCommand::ConsoleCommandManipulator ModifyConsoleCommand(const std::string& group, const std::string& name)696 { return ConsoleCommandManager::getCommand(group, name, true); }697 397 } 698 398 -
code/branches/core7/src/libraries/core/command/ConsoleCommandCompilation.cc
r8858 r10347 41 41 #include "util/ExprParser.h" 42 42 #include "util/StringUtils.h" 43 #include "ConsoleCommand .h"43 #include "ConsoleCommandIncludes.h" 44 44 #include "CommandExecutor.h" 45 45 -
code/branches/core7/src/libraries/core/command/IRC.cc
r8858 r10347 39 39 #include "util/Exception.h" 40 40 #include "util/StringUtils.h" 41 #include "ConsoleCommand .h"41 #include "ConsoleCommandIncludes.h" 42 42 #include "TclThreadManager.h" 43 43 -
code/branches/core7/src/libraries/core/command/TclBind.cc
r9550 r10347 39 39 #include "core/PathConfig.h" 40 40 #include "CommandExecutor.h" 41 #include "ConsoleCommand .h"41 #include "ConsoleCommandIncludes.h" 42 42 #include "TclThreadManager.h" 43 43 -
code/branches/core7/src/libraries/core/command/TclThreadManager.cc
r8858 r10347 47 47 #include "core/CoreIncludes.h" 48 48 #include "CommandExecutor.h" 49 #include "ConsoleCommand .h"49 #include "ConsoleCommandIncludes.h" 50 50 #include "TclBind.h" 51 51 #include "TclThreadList.h"
Note: See TracChangeset
for help on using the changeset viewer.