X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fmisc%2Fcommands.hxx;h=288f82553e7443b34170d474b075c52ab19887ca;hb=5bab565cfe4c30d6cf08ecaba50af74d5e4f0c98;hp=6cfc53810e1d82840878141ef7cb303bbec64e5e;hpb=3980f08cc556865eadc94f854b08753aacb8f15d;p=simgear.git diff --git a/simgear/misc/commands.hxx b/simgear/misc/commands.hxx index 6cfc5381..288f8255 100644 --- a/simgear/misc/commands.hxx +++ b/simgear/misc/commands.hxx @@ -11,26 +11,68 @@ #define __COMMANDS_HXX -#include +#include + +#include STL_STRING #include #include #include "props.hxx" -using std::string; -using std::map; -using std::vector; +SG_USING_STD(string); +SG_USING_STD(map); +SG_USING_STD(vector); + + +/** + * Stored state for a command. + * + *

This class allows a command to cache parts of its state between + * invocations with the same parameters. Nearly every command that + * actually uses this will subclass it in some way. The command + * allocates the structure, but it is up to the caller to delete it + * when it is no longer necessary, unless the command deletes it + * and replaces the value with 0 or another command-state object + * first.

+ * + *

Note that this class is for caching only; all of the information + * in it must be recoverable by other means, since the state could + * arbitrarily disappear between invocations if the caller decides to + * delete it.

+ * + *

By default, the command state includes a place to keep a copy of + * the parameters.

+ * + * @author David Megginson, david@megginson.com + */ +class SGCommandState +{ +public: + SGCommandState (); + SGCommandState (const SGPropertyNode * args); + virtual ~SGCommandState (); + virtual void setArgs (const SGPropertyNode * args); + virtual const SGPropertyNode * getArgs () const { return _args; } +private: + SGPropertyNode * _args; +}; /** * Manage commands. * *

This class allows the application to register and unregister - * commands, and provides shortcuts for executing them. Commands - * are simple functions that take a const pointer to an SGPropertyNode - * as an argument and return a bool value indicating success or failure. - * The property node may be ignored, or it may contain values that - * the command uses as parameters.

+ * commands, and provides shortcuts for executing them. Commands are + * simple functions that take a const pointer to an SGPropertyNode and + * a pointer to a pointer variable (which should be 0 initially) where + * the function can store compiled copies of its arguments, etc. to + * avoid expensive recalculations. If the command deletes the + * SGCommandState, it must replace it with a new pointer or 0; + * otherwise, the caller is free to delete and zero the pointer at any + * time and the command will start fresh with the next invocation. + * The command must return a bool value indicating success or failure. + * The property node may be ignored, or it may contain values that the + * command uses as parameters.

* *

There are convenience methods for invoking a command function * with no arguments or with a single, primitive argument.

@@ -44,7 +86,8 @@ public: /** * Type for a command function. */ - typedef bool (*command_t) (const SGPropertyNode * arg); + typedef bool (*command_t) (const SGPropertyNode * arg, + SGCommandState ** state); /** @@ -103,104 +146,106 @@ public: * @return true if the command is present and executes successfully, * false otherwise. */ - virtual bool execute (const string &name, const SGPropertyNode * arg) const; - - - /** - * Execute a command with no argument. - * - * The command function will receive a pointer to a property node - * with no value and no children. - * - * @param name The name of the command. - * @return true if the command is present and executes successfully, - * false otherwise. - */ - virtual bool execute (const string &name) const; - - - /** - * Execute a command with a single bool argument. - * - * The command function will receive a pointer to a property node - * with a bool value and no children. - * - * @param name The name of the command. - * @param arg The bool argument to the command. - * @return true if the command is present and executes successfully, - * false otherwise. - */ - virtual bool execute (const string &name, bool arg) const; - - - /** - * Execute a command with a single int argument. - * - * The command function will receive a pointer to a property node - * with a int value and no children. - * - * @param name The name of the command. - * @param arg The int argument to the command. - * @return true if the command is present and executes successfully, - * false otherwise. - */ - virtual bool execute (const string &name, int arg) const; - - - /** - * Execute a command with a single long argument. - * - * The command function will receive a pointer to a property node - * with a long value and no children. - * - * @param name The name of the command. - * @param arg The long argument to the command. - * @return true if the command is present and executes successfully, - * false otherwise. - */ - virtual bool execute (const string &name, long arg) const; - - - /** - * Execute a command with a single float argument. - * - * The command function will receive a pointer to a property node - * with a float value and no children. - * - * @param name The name of the command. - * @param arg The float argument to the command. - * @return true if the command is present and executes successfully, - * false otherwise. - */ - virtual bool execute (const string &name, float arg) const; - - - /** - * Execute a command with a single double argument. - * - * The command function will receive a pointer to a property node - * with a double value and no children. - * - * @param name The name of the command. - * @param arg The double argument to the command. - * @return true if the command is present and executes successfully, - * false otherwise. - */ - virtual bool execute (const string &name, double arg) const; - - - /** - * Execute a command with a single string argument. - * - * The command function will receive a pointer to a property node - * with a string value and no children. - * - * @param name The name of the command. - * @param arg The string argument to the command. - * @return true if the command is present and executes successfully, - * false otherwise. - */ - virtual bool execute (const string &name, string arg) const; + virtual bool execute (const string &name, + const SGPropertyNode * arg, + SGCommandState ** state) const; + + +// /** +// * Execute a command with no argument. +// * +// * The command function will receive a pointer to a property node +// * with no value and no children. +// * +// * @param name The name of the command. +// * @return true if the command is present and executes successfully, +// * false otherwise. +// */ +// virtual bool execute (const string &name) const; + + +// /** +// * Execute a command with a single bool argument. +// * +// * The command function will receive a pointer to a property node +// * with a bool value and no children. +// * +// * @param name The name of the command. +// * @param arg The bool argument to the command. +// * @return true if the command is present and executes successfully, +// * false otherwise. +// */ +// virtual bool execute (const string &name, bool arg) const; + + +// /** +// * Execute a command with a single int argument. +// * +// * The command function will receive a pointer to a property node +// * with a int value and no children. +// * +// * @param name The name of the command. +// * @param arg The int argument to the command. +// * @return true if the command is present and executes successfully, +// * false otherwise. +// */ +// virtual bool execute (const string &name, int arg) const; + + +// /** +// * Execute a command with a single long argument. +// * +// * The command function will receive a pointer to a property node +// * with a long value and no children. +// * +// * @param name The name of the command. +// * @param arg The long argument to the command. +// * @return true if the command is present and executes successfully, +// * false otherwise. +// */ +// virtual bool execute (const string &name, long arg) const; + + +// /** +// * Execute a command with a single float argument. +// * +// * The command function will receive a pointer to a property node +// * with a float value and no children. +// * +// * @param name The name of the command. +// * @param arg The float argument to the command. +// * @return true if the command is present and executes successfully, +// * false otherwise. +// */ +// virtual bool execute (const string &name, float arg) const; + + +// /** +// * Execute a command with a single double argument. +// * +// * The command function will receive a pointer to a property node +// * with a double value and no children. +// * +// * @param name The name of the command. +// * @param arg The double argument to the command. +// * @return true if the command is present and executes successfully, +// * false otherwise. +// */ +// virtual bool execute (const string &name, double arg) const; + + +// /** +// * Execute a command with a single string argument. +// * +// * The command function will receive a pointer to a property node +// * with a string value and no children. +// * +// * @param name The name of the command. +// * @param arg The string argument to the command. +// * @return true if the command is present and executes successfully, +// * false otherwise. +// */ +// virtual bool execute (const string &name, string arg) const; private: @@ -210,6 +255,6 @@ private: }; -#endif __COMMANDS_HXX +#endif // __COMMANDS_HXX // end of commands.hxx