Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Apr 6, 2015, 3:47:42 PM (10 years ago)
Author:
landauf
Message:

moved console command macros to a new file (ConsoleCommandIncludes.h)

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  
    4444#include "CommandExecutor.h"
    4545#include "ConsoleCommand.h"
     46#include "ConsoleCommandManager.h"
    4647#include "TclThreadManager.h"
    4748
  • code/branches/core7/src/libraries/core/command/CommandEvaluation.cc

    r10346 r10347  
    3737#include "CommandExecutor.h"
    3838#include "ConsoleCommand.h"
     39#include "ConsoleCommandManager.h"
    3940
    4041namespace orxonox
  • code/branches/core7/src/libraries/core/command/CommandExecutor.cc

    r10346 r10347  
    3434#include "CommandExecutor.h"
    3535
    36 #include "ConsoleCommand.h"
     36#include "ConsoleCommandIncludes.h"
    3737#include "TclBind.h"
    3838#include "Shell.h"
  • code/branches/core7/src/libraries/core/command/ConsoleCommand.cc

    r10346 r10347  
    3939#include "core/input/KeyBinder.h"
    4040#include "core/input/KeyBinderManager.h"
     41#include "ConsoleCommandManager.h"
    4142
    4243namespace orxonox
  • code/branches/core7/src/libraries/core/command/ConsoleCommand.h

    r10346 r10347  
    2828
    2929/**
    30     @defgroup ConsoleCommand Console commands
    31     @ingroup Command
    32 */
    33 
    34 /**
    3530    @file
    3631    @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.
    21533*/
    21634
     
    22341#include <vector>
    22442
    225 #include "util/VA_NARGS.h"
    22643#include "ArgumentCompletionFunctions.h"
    22744#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 different
    235     overloaded implementation of the macro will be chosen.
    236 
    237     Console commands created with SetConsoleCommand() become active immediately and
    238     the given function-pointer (and optionally the object) will be used to execute
    239     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 command
    246     @param functionpointer The function-pointer of the corresponding command-function
    247 */
    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 command
    253     @param name The name (string) of the console command
    254     @param functionpointer The function-pointer of the corresponding command-function
    255 */
    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 command
    261     @param name The name (string) of the console command
    262     @param functionpointer The function-pointer of the corresponding command-function
    263     @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 macro
    269 #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 different
    277     overloaded implementation of the macro will be chosen.
    278 
    279     Console commands created with DeclareConsoleCommand() don't use the the given
    280     function-pointer to execute the command, it is only used to define the header
    281     of the future command-function. The command is inactive until you manually
    282     set a function with orxonox::ModifyConsoleCommand(). You can use a different
    283     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 command
    290     @param functionpointer The function-pointer of an arbitrary function that has the same header as the final function
    291 */
    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 command
    297     @param name The name (string) of the console command
    298     @param functionpointer The function-pointer of an arbitrary function that has the same header as the final function
    299 */
    300 #define DeclareConsoleCommand3(group, name, functionpointer) \
    301     DeclareConsoleCommandGeneric(group, name, orxonox::createFunctor(functionpointer))
    302 
    303 /// Internal macro
    304 #define DeclareConsoleCommandGeneric(group, name, functor) \
    305     static orxonox::ConsoleCommand& BOOST_PP_CAT(__consolecommand_, __UNIQUE_NUMBER__) = (*orxonox::createConsoleCommand(group, name, orxonox::createExecutor(functor), false))
    306 
    30745
    30846namespace orxonox
     
    657395            LanguageEntryLabel descriptionParam_[MAX_FUNCTOR_ARGUMENTS];    ///< A description for each argument
    658396    };
    659 
    660     /**
    661         @brief Creates a new ConsoleCommand.
    662         @param name The name of the command
    663         @param executor The executor of the command
    664         @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 command
    671         @param name The name of the command
    672         @param executor The executor of the command
    673         @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 ConsoleCommandManipulator
    684         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 ConsoleCommandManipulator
    693         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); }
    697397}
    698398
  • code/branches/core7/src/libraries/core/command/ConsoleCommandCompilation.cc

    r8858 r10347  
    4141#include "util/ExprParser.h"
    4242#include "util/StringUtils.h"
    43 #include "ConsoleCommand.h"
     43#include "ConsoleCommandIncludes.h"
    4444#include "CommandExecutor.h"
    4545
  • code/branches/core7/src/libraries/core/command/IRC.cc

    r8858 r10347  
    3939#include "util/Exception.h"
    4040#include "util/StringUtils.h"
    41 #include "ConsoleCommand.h"
     41#include "ConsoleCommandIncludes.h"
    4242#include "TclThreadManager.h"
    4343
  • code/branches/core7/src/libraries/core/command/TclBind.cc

    r9550 r10347  
    3939#include "core/PathConfig.h"
    4040#include "CommandExecutor.h"
    41 #include "ConsoleCommand.h"
     41#include "ConsoleCommandIncludes.h"
    4242#include "TclThreadManager.h"
    4343
  • code/branches/core7/src/libraries/core/command/TclThreadManager.cc

    r8858 r10347  
    4747#include "core/CoreIncludes.h"
    4848#include "CommandExecutor.h"
    49 #include "ConsoleCommand.h"
     49#include "ConsoleCommandIncludes.h"
    5050#include "TclBind.h"
    5151#include "TclThreadList.h"
Note: See TracChangeset for help on using the changeset viewer.