Initial revsion of new command manager (contributed by David Megginson)

Fix to configure.in.
This commit is contained in:
curt
2001-06-01 15:28:49 +00:00
parent f93fa4b613
commit 3980f08cc5
4 changed files with 350 additions and 0 deletions

View File

@@ -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

View File

@@ -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
View 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
View 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