Initial revsion of new command manager (contributed by David Megginson)
Fix to configure.in.
This commit is contained in:
@@ -34,6 +34,7 @@ AC_PROG_RANLIB
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_LN_S
|
||||
|
||||
AR="ar"
|
||||
OS=`uname -s`
|
||||
if test "$OS" = "IRIX" -o "$OS" = "IRIX64"; then
|
||||
if test "$CXX" = "CC"; then
|
||||
|
||||
@@ -9,6 +9,7 @@ endif
|
||||
lib_LIBRARIES = libsgmisc.a
|
||||
|
||||
include_HEADERS = \
|
||||
commands.hxx \
|
||||
props.hxx \
|
||||
sg_path.hxx \
|
||||
sgstream.hxx \
|
||||
@@ -18,6 +19,7 @@ include_HEADERS = \
|
||||
zfstream.hxx
|
||||
|
||||
libsgmisc_a_SOURCES = \
|
||||
commands.cxx \
|
||||
props.cxx \
|
||||
props_io.cxx \
|
||||
sg_path.cxx \
|
||||
|
||||
132
simgear/misc/commands.cxx
Normal file
132
simgear/misc/commands.cxx
Normal file
@@ -0,0 +1,132 @@
|
||||
// commands.cxx - encapsulated commands.
|
||||
// Started Spring 2001 by David Megginson, david@megginson.com
|
||||
// This code is released into the Public Domain.
|
||||
//
|
||||
// $Id$
|
||||
|
||||
#include "commands.hxx"
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// Implementation of SGCommandMgr class.
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
SGCommandMgr::SGCommandMgr ()
|
||||
{
|
||||
// no-op
|
||||
}
|
||||
|
||||
SGCommandMgr::~SGCommandMgr ()
|
||||
{
|
||||
// no-op
|
||||
}
|
||||
|
||||
void
|
||||
SGCommandMgr::addCommand (const string &name, command_t command)
|
||||
{
|
||||
_commands[name] = command;
|
||||
}
|
||||
|
||||
SGCommandMgr::command_t
|
||||
SGCommandMgr::getCommand (const string &name) const
|
||||
{
|
||||
const command_map::const_iterator it = _commands.find(name);
|
||||
return (it != _commands.end() ? it->second : 0);
|
||||
}
|
||||
|
||||
vector<string>
|
||||
SGCommandMgr::getCommandNames () const
|
||||
{
|
||||
vector<string> names;
|
||||
command_map::const_iterator it = _commands.begin();
|
||||
command_map::const_iterator last = _commands.end();
|
||||
while (it != last) {
|
||||
names.push_back(it->first);
|
||||
it++;
|
||||
}
|
||||
return names;
|
||||
}
|
||||
|
||||
bool
|
||||
SGCommandMgr::execute (const string &name, const SGPropertyNode * arg) const
|
||||
{
|
||||
command_t command = getCommand(name);
|
||||
if (command == 0)
|
||||
return false;
|
||||
else
|
||||
return (*command)(arg);
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
SGCommandMgr::execute (const string &name) const
|
||||
{
|
||||
// FIXME
|
||||
SGPropertyNode node;
|
||||
execute(name, &node);
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
SGCommandMgr::execute (const string &name, bool value) const
|
||||
{
|
||||
// FIXME
|
||||
SGPropertyNode node;
|
||||
node.setBoolValue(value);
|
||||
execute(name, &node);
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
SGCommandMgr::execute (const string &name, int value) const
|
||||
{
|
||||
// FIXME
|
||||
SGPropertyNode node;
|
||||
node.setIntValue(value);
|
||||
execute(name, &node);
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
SGCommandMgr::execute (const string &name, long value) const
|
||||
{
|
||||
// FIXME
|
||||
SGPropertyNode node;
|
||||
node.setLongValue(value);
|
||||
execute(name, &node);
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
SGCommandMgr::execute (const string &name, float value) const
|
||||
{
|
||||
// FIXME
|
||||
SGPropertyNode node;
|
||||
node.setFloatValue(value);
|
||||
execute(name, &node);
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
SGCommandMgr::execute (const string &name, double value) const
|
||||
{
|
||||
// FIXME
|
||||
SGPropertyNode node;
|
||||
node.setDoubleValue(value);
|
||||
execute(name, &node);
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
SGCommandMgr::execute (const string &name, string value) const
|
||||
{
|
||||
// FIXME
|
||||
SGPropertyNode node;
|
||||
node.setStringValue(value);
|
||||
execute(name, &node);
|
||||
}
|
||||
|
||||
|
||||
// end of commands.cxx
|
||||
215
simgear/misc/commands.hxx
Normal file
215
simgear/misc/commands.hxx
Normal file
@@ -0,0 +1,215 @@
|
||||
/**
|
||||
* \file commands.hxx
|
||||
* Interface definition for encapsulated commands.
|
||||
* Started Spring 2001 by David Megginson, david@megginson.com
|
||||
* This code is released into the Public Domain.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifndef __COMMANDS_HXX
|
||||
#define __COMMANDS_HXX
|
||||
|
||||
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
#include "props.hxx"
|
||||
|
||||
using std::string;
|
||||
using std::map;
|
||||
using std::vector;
|
||||
|
||||
|
||||
/**
|
||||
* Manage commands.
|
||||
*
|
||||
* <p>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.</p>
|
||||
*
|
||||
* <p>There are convenience methods for invoking a command function
|
||||
* with no arguments or with a single, primitive argument.</p>
|
||||
*
|
||||
* @author David Megginson, david@megginson.com
|
||||
*/
|
||||
class SGCommandMgr
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* Type for a command function.
|
||||
*/
|
||||
typedef bool (*command_t) (const SGPropertyNode * arg);
|
||||
|
||||
|
||||
/**
|
||||
* Default constructor.
|
||||
*/
|
||||
SGCommandMgr ();
|
||||
|
||||
|
||||
/**
|
||||
* Destructor.
|
||||
*/
|
||||
virtual ~SGCommandMgr ();
|
||||
|
||||
|
||||
/**
|
||||
* Register a new command with the manager.
|
||||
*
|
||||
* @param name The command name. Any existing command with
|
||||
* the same name will silently be overwritten.
|
||||
* @param command A pointer to a one-arg function returning
|
||||
* a bool result. The argument is always a const pointer to
|
||||
* an SGPropertyNode (which may contain multiple values).
|
||||
*/
|
||||
virtual void addCommand (const string &name, command_t command);
|
||||
|
||||
|
||||
/**
|
||||
* Look up an existing command.
|
||||
*
|
||||
* @param name The command name.
|
||||
* @return A pointer to the command, or 0 if there is no registered
|
||||
* command with the name specified.
|
||||
*/
|
||||
virtual command_t getCommand (const string &name) const;
|
||||
|
||||
|
||||
/**
|
||||
* Get a list of all existing command names.
|
||||
*
|
||||
* @return A (possibly empty) vector of the names of all registered
|
||||
* commands.
|
||||
*/
|
||||
virtual vector<string> getCommandNames () const;
|
||||
|
||||
|
||||
/**
|
||||
* Execute a command.
|
||||
*
|
||||
* This is the primary method for invoking a command; the others
|
||||
* are convenience methods that invoke this one indirectly.
|
||||
*
|
||||
* @param name The name of the command.
|
||||
* @param arg A const pointer to an SGPropertyNode. The node
|
||||
* may have a value and/or children, etc., so that it is possible
|
||||
* to pass an arbitrarily complex data structure to a command.
|
||||
* @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;
|
||||
|
||||
|
||||
private:
|
||||
|
||||
typedef map<string,command_t> command_map;
|
||||
command_map _commands;
|
||||
|
||||
};
|
||||
|
||||
#endif __COMMANDS_HXX
|
||||
|
||||
// end of commands.hxx
|
||||
Reference in New Issue
Block a user