[Orxonox-commit 2525] r7230 - in code/branches/consolecommands3/src/libraries: core/command core/input util
landauf at orxonox.net
landauf at orxonox.net
Fri Aug 27 19:29:49 CEST 2010
Author: landauf
Date: 2010-08-27 19:29:49 +0200 (Fri, 27 Aug 2010)
New Revision: 7230
Modified:
code/branches/consolecommands3/src/libraries/core/command/CommandEvaluation.cc
code/branches/consolecommands3/src/libraries/core/command/CommandEvaluation.h
code/branches/consolecommands3/src/libraries/core/command/CommandExecutor.cc
code/branches/consolecommands3/src/libraries/core/command/Executor.cc
code/branches/consolecommands3/src/libraries/core/command/Executor.h
code/branches/consolecommands3/src/libraries/core/input/Button.cc
code/branches/consolecommands3/src/libraries/core/input/InputCommands.cc
code/branches/consolecommands3/src/libraries/util/SubString.cc
Log:
re-implemented parameter evaluation in CommandEvaluation and simplified parse() and evaluateParams() in Executor.
Modified: code/branches/consolecommands3/src/libraries/core/command/CommandEvaluation.cc
===================================================================
--- code/branches/consolecommands3/src/libraries/core/command/CommandEvaluation.cc 2010-08-27 12:53:06 UTC (rev 7229)
+++ code/branches/consolecommands3/src/libraries/core/command/CommandEvaluation.cc 2010-08-27 17:29:49 UTC (rev 7230)
@@ -48,8 +48,11 @@
this->hintArgumentsOffset_ = 0;
this->bPossibleArgumentsRetrieved_ = false;
this->possibleArguments_.clear();
+ this->bEvaluatedParams_ = false;
+ this->bTriedToEvaluatedParams_ = false;
+ this->numberOfEvaluatedParams_ = 0;
- this->tokens_.split(command, " ", SubString::WhiteSpaces, false, '\\', false, '"', false, '(', ')', false, '\0');
+ this->tokens_.split(command, " ", SubString::WhiteSpaces, false, '\\', true, '"', true, '(', ')', true, '\0');
}
unsigned int CommandEvaluation::getNumberOfArguments() const
@@ -77,14 +80,14 @@
return BLANKSTRING;
}
- int CommandEvaluation::execute() const
+ int CommandEvaluation::execute()
{
int error;
this->query(&error);
return error;
}
- MultiType CommandEvaluation::query(int* error) const
+ MultiType CommandEvaluation::query(int* error)
{
if (error)
{
@@ -102,13 +105,74 @@
}
if (this->execCommand_ && this->execCommand_->isActive() && this->execCommand_->hasAccess())
- return this->execCommand_->getExecutor()->parse(this->tokens_.subSet(this->execArgumentsOffset_).join(), error, " ", false);
+ {
+ if (!this->bTriedToEvaluatedParams_)
+ this->evaluateParams(false);
+
+ if (this->bEvaluatedParams_)
+ {
+ COUT(0) << "call evaluated" << std::endl;
+ COUT(6) << "CE_execute (evaluation): " << this->execCommand_->getName() << " with " << this->numberOfEvaluatedParams_ << " params: " << this->param_[0] << ' ' << this->param_[1] << ' ' << this->param_[2] << ' ' << this->param_[3] << ' ' << this->param_[4] << std::endl;
+ switch (this->numberOfEvaluatedParams_)
+ {
+ case 0: return (*this->execCommand_->getExecutor())();
+ case 1: return (*this->execCommand_->getExecutor())(this->param_[0]);
+ case 2: return (*this->execCommand_->getExecutor())(this->param_[0], this->param_[1]);
+ case 3: return (*this->execCommand_->getExecutor())(this->param_[0], this->param_[1], this->param_[2]);
+ case 4: return (*this->execCommand_->getExecutor())(this->param_[0], this->param_[1], this->param_[2], this->param_[3]);
+ case 5:
+ default: return (*this->execCommand_->getExecutor())(this->param_[0], this->param_[1], this->param_[2], this->param_[3], this->param_[4]);
+ }
+ }
+ else
+ {
+ COUT(0) << "call parsed" << std::endl;
+ COUT(5) << "CE_execute: " << this->string_ << "\n";
+ return this->execCommand_->getExecutor()->parse(this->tokens_.subSet(this->execArgumentsOffset_), error, " ");
+ }
+ }
else
return MT_Type::Null;
}
- std::string CommandEvaluation::complete() const
+ int CommandEvaluation::evaluateParams(bool bPrintError)
{
+COUT(0) << "evaluate params" << std::endl;
+ this->bTriedToEvaluatedParams_ = true;
+
+ if (!this->execCommand_)
+ {
+ if (bPrintError)
+ COUT(1) << "Error: Can't evaluate params, no console command assigned." << std::endl;
+ return CommandExecutor::Error;
+ }
+
+ int error;
+ this->numberOfEvaluatedParams_ = this->execCommand_->getExecutor()->evaluateParams(this->tokens_.subSet(this->execArgumentsOffset_), this->param_, &error, " ");
+ if (!error)
+ this->bEvaluatedParams_ = true;
+ else if (bPrintError)
+ COUT(1) << "Error: Can't evaluate params, not enough arguments given." << std::endl;
+
+ return error;
+ }
+
+ void CommandEvaluation::setEvaluatedParameter(unsigned int index, const MultiType& param)
+ {
+ if (index < MAX_FUNCTOR_ARGUMENTS)
+ this->param_[index] = param;
+ }
+
+ MultiType CommandEvaluation::getEvaluatedParameter(unsigned int index) const
+ {
+ if (index < MAX_FUNCTOR_ARGUMENTS)
+ return this->param_[index];
+
+ return MT_Type::Null;
+ }
+
+ std::string CommandEvaluation::complete()
+ {
if (!this->hintCommand_ || !this->hintCommand_->isActive())
return this->string_;
@@ -121,16 +185,16 @@
}
else
{
- std::string output;
- for (unsigned int i = 0; i < this->getNumberOfArguments() - 1; ++i)
- output += this->getToken(i) + ' ';
+ std::string output = this->string_.substr(0, this->string_.find_last_of(' ') + 1);
+// for (unsigned int i = 0; i < this->getNumberOfArguments() - 1; ++i)
+// output += this->getToken(i) + ' ';
output += CommandEvaluation::getCommonBegin(this->possibleArguments_);
return output;
}
}
- std::string CommandEvaluation::hint() const
+ std::string CommandEvaluation::hint()
{
if (!this->hintCommand_ || !this->hintCommand_->isActive())
return "";
@@ -164,7 +228,7 @@
}
}
- void CommandEvaluation::retrievePossibleArguments() const
+ void CommandEvaluation::retrievePossibleArguments()
{
this->bPossibleArgumentsRetrieved_ = true;
unsigned int argumentID = std::min(this->getNumberOfArguments() - this->hintArgumentsOffset_, this->hintCommand_->getExecutor()->getParamCount());
Modified: code/branches/consolecommands3/src/libraries/core/command/CommandEvaluation.h
===================================================================
--- code/branches/consolecommands3/src/libraries/core/command/CommandEvaluation.h 2010-08-27 12:53:06 UTC (rev 7229)
+++ code/branches/consolecommands3/src/libraries/core/command/CommandEvaluation.h 2010-08-27 17:29:49 UTC (rev 7230)
@@ -33,9 +33,10 @@
#include <string>
-#include "ArgumentCompletionListElement.h"
#include "util/SubString.h"
#include "util/MultiType.h"
+#include "ArgumentCompletionListElement.h"
+#include "Functor.h"
namespace orxonox
{
@@ -46,20 +47,22 @@
public:
CommandEvaluation();
- int execute() const;
- MultiType query(int* error = 0) const;
+ int execute();
+ MultiType query(int* error = 0);
- std::string complete() const;
- std::string hint() const;
+ std::string complete();
+ std::string hint();
+ int evaluateParams(bool bPrintError = false);
+
inline bool isValid() const
{ return (this->execCommand_ != 0); }
inline _ConsoleCommand* getConsoleCommand() const
{ return this->execCommand_; }
-// void setEvaluatedParameter(unsigned int index, MultiType param);
-// MultiType getEvaluatedParameter(unsigned int index) const;
+ void setEvaluatedParameter(unsigned int index, const MultiType& param);
+ MultiType getEvaluatedParameter(unsigned int index) const;
private:
void initialize(const std::string& command);
@@ -68,7 +71,7 @@
const std::string& getLastArgument() const;
const std::string& getToken(unsigned int i) const;
- void retrievePossibleArguments() const;
+ void retrievePossibleArguments();
static void strip(ArgumentCompletionList& list, const std::string& fragment);
@@ -83,8 +86,13 @@
std::string string_;
unsigned int execArgumentsOffset_;
unsigned int hintArgumentsOffset_;
- mutable bool bPossibleArgumentsRetrieved_;
- mutable ArgumentCompletionList possibleArguments_;
+ bool bPossibleArgumentsRetrieved_;
+ ArgumentCompletionList possibleArguments_;
+
+ bool bEvaluatedParams_;
+ bool bTriedToEvaluatedParams_;
+ unsigned int numberOfEvaluatedParams_;
+ MultiType param_[MAX_FUNCTOR_ARGUMENTS];
};
}
Modified: code/branches/consolecommands3/src/libraries/core/command/CommandExecutor.cc
===================================================================
--- code/branches/consolecommands3/src/libraries/core/command/CommandExecutor.cc 2010-08-27 12:53:06 UTC (rev 7229)
+++ code/branches/consolecommands3/src/libraries/core/command/CommandExecutor.cc 2010-08-27 17:29:49 UTC (rev 7230)
@@ -66,6 +66,7 @@
{
COUT(0) << "evaluate" << std::endl;
evaluation = CommandExecutor::evaluate(command);
+ evaluation.evaluateParams();
CommandExecutor::getInstance().cache(command, evaluation);
}
else
Modified: code/branches/consolecommands3/src/libraries/core/command/Executor.cc
===================================================================
--- code/branches/consolecommands3/src/libraries/core/command/Executor.cc 2010-08-27 12:53:06 UTC (rev 7229)
+++ code/branches/consolecommands3/src/libraries/core/command/Executor.cc 2010-08-27 17:29:49 UTC (rev 7230)
@@ -49,143 +49,70 @@
{
}
- MultiType Executor::parse(const std::string& params, int* error, const std::string& delimiter, bool bPrintError) const
+ MultiType Executor::parse(const std::string& arguments, int* error, const std::string& delimiter, bool bPrintError) const
{
- if (error)
- *error = CommandExecutor::Success;
+ return this->parse(SubString(arguments, delimiter, SubString::WhiteSpaces, false, '\\', true, '"', true, '(', ')', true, '\0'), error, delimiter, bPrintError);
+ }
- unsigned int paramCount = this->functor_->getParamCount();
+ MultiType Executor::parse(const SubString& arguments, int* error, const std::string& delimiter, bool bPrintError) const
+ {
+ MultiType param[MAX_FUNCTOR_ARGUMENTS];
+ unsigned int paramCount = this->evaluateParams(arguments, param, error, delimiter);
- if (paramCount == 0)
+ if (error && *error)
{
- COUT(5) << "Calling Executor " << this->name_ << " through parser without parameters." << std::endl;
- return (*this->functor_)();
+ if (bPrintError)
+ COUT(2) << "Warning: Can't call executor " << this->name_ << " through parser: Not enough parameters or default values given (input: " << arguments.join() << ")." << std::endl;
+ return MT_Type::Null;
}
- else if (paramCount == 1)
+
+ switch (paramCount)
{
- const std::string& temp = getStripped(params);
- if (!temp.empty())
- {
- COUT(5) << "Calling Executor " << this->name_ << " through parser with one parameter, using whole string: " << params << std::endl;
- return (*this->functor_)(params);
- }
- else if (!this->defaultValue_[0].null())
- {
- COUT(5) << "Calling Executor " << this->name_ << " through parser with one parameter, using default value: " << this->defaultValue_[0] << std::endl;
- return (*this->functor_)(this->defaultValue_[0]);
- }
- else
- {
- if (bPrintError)
- COUT(2) << "Warning: Can't call executor " << this->name_ << " through parser: Not enough parameters or default values given (input: " << temp << ")." << std::endl;
- if (error)
- *error = CommandExecutor::Incomplete;
- return MT_Type::Null;
- }
+ case 0: return (*this->functor_)();
+ case 1: return (*this->functor_)(param[0]);
+ case 2: return (*this->functor_)(param[0], param[1]);
+ case 3: return (*this->functor_)(param[0], param[1], param[2]);
+ case 4: return (*this->functor_)(param[0], param[1], param[2], param[3]);
+ case 5:
+ default: return (*this->functor_)(param[0], param[1], param[2], param[3], param[4]);
}
- else
- {
- SubString tokens(params, delimiter, SubString::WhiteSpaces, false, '\\', true, '"', true, '(', ')', true, '\0');
-
- for (unsigned int i = tokens.size(); i < this->functor_->getParamCount(); i++)
- {
- if (this->defaultValue_[i].null())
- {
- if (bPrintError)
- COUT(2) << "Warning: Can't call executor " << this->name_ << " through parser: Not enough parameters or default values given (input: " << params << ")." << std::endl;
- if (error)
- *error = CommandExecutor::Incomplete;
- return MT_Type::Null;
- }
- }
-
- MultiType param[MAX_FUNCTOR_ARGUMENTS];
- COUT(5) << "Calling Executor " << this->name_ << " through parser with " << paramCount << " parameters, using " << tokens.size() << " tokens (";
- for (unsigned int i = 0; i < tokens.size() && i < MAX_FUNCTOR_ARGUMENTS; i++)
- {
- param[i] = tokens[i];
- if (i != 0)
- {
- COUT(5) << ", ";
- }
- COUT(5) << tokens[i];
- }
- COUT(5) << ") and " << std::max((int)paramCount - (int)tokens.size(), 0) << " default values (";
- for (unsigned int i = tokens.size(); i < paramCount; i++)
- {
- param[i] = this->defaultValue_[i];
- if (i != 0)
- {
- COUT(5) << ", ";
- }
- COUT(5) << this->defaultValue_[i];
- }
- COUT(5) << ")." << std::endl;
-
- if ((tokens.size() > paramCount) && (this->functor_->getTypenameParam(paramCount - 1) == "string"))
- param[paramCount - 1] = tokens.subSet(paramCount - 1).join();
-
- switch(paramCount)
- {
- case 2:
- return (*this->functor_)(param[0], param[1]);
- case 3:
- return (*this->functor_)(param[0], param[1], param[2]);
- case 4:
- return (*this->functor_)(param[0], param[1], param[2], param[3]);
- case 5:
- return (*this->functor_)(param[0], param[1], param[2], param[3], param[4]);
- }
- }
-
- return MT_Type::Null;
}
- bool Executor::evaluate(const std::string& params, MultiType param[5], const std::string& delimiter) const
+ int Executor::evaluateParams(const SubString& arguments, MultiType param[MAX_FUNCTOR_ARGUMENTS], int* error, const std::string& delimiter) const
{
unsigned int paramCount = this->functor_->getParamCount();
+ unsigned int argumentCount = arguments.size();
- if (paramCount == 1)
+ // if there are not enough params given, check if there are default values
+ for (unsigned int i = argumentCount; i < paramCount; i++)
{
- // only one param: check if there are params given, otherwise try to use default values
- if (!getStripped(params).empty())
+ if (this->defaultValue_[i].null())
{
- param[0] = params;
- this->functor_->evaluateParam(0, param[0]);
- return true;
+ if (error)
+ *error = CommandExecutor::Incomplete;
+ return 0;
}
- else if (!this->defaultValue_[0].null())
- {
- param[0] = this->defaultValue_[0];
- this->functor_->evaluateParam(0, param[0]);
- return true;
- }
- return false;
}
- else
- {
- // more than one param
- SubString tokens(params, delimiter, SubString::WhiteSpaces, false, '\\', true, '"', true, '(', ')', true, '\0');
- // if there are not enough params given, check if there are default values
- for (unsigned int i = tokens.size(); i < this->functor_->getParamCount(); i++)
- if (this->defaultValue_[i].null())
- return false;
+ // assign all given arguments to the multitypes
+ for (unsigned int i = 0; i < std::min(argumentCount, MAX_FUNCTOR_ARGUMENTS); i++)
+ param[i] = arguments[i];
- // assign all given arguments to the multitypes
- for (unsigned int i = 0; i < std::min(tokens.size(), MAX_FUNCTOR_ARGUMENTS); i++)
- param[i] = tokens[i];
+ // fill the remaining multitypes with default values
+ for (unsigned int i = argumentCount; i < std::min(paramCount, MAX_FUNCTOR_ARGUMENTS); i++)
+ param[i] = this->defaultValue_[i];
- // fill the remaining multitypes with default values
- for (unsigned int i = tokens.size(); i < std::min(paramCount, MAX_FUNCTOR_ARGUMENTS); i++)
- param[i] = this->defaultValue_[i];
+ // assign the remaining arguments all to the last parameter if it is a string
+ if ((paramCount <= MAX_FUNCTOR_ARGUMENTS) &&(argumentCount > paramCount) && (paramCount == 1 || this->functor_->getTypenameParam(paramCount - 1) == "string"))
+ param[paramCount - 1] = arguments.subSet(paramCount - 1).join(delimiter);
- // evaluate the param types through the functor
- for (unsigned int i = 0; i < std::min(paramCount, MAX_FUNCTOR_ARGUMENTS); i++)
- this->functor_->evaluateParam(i, param[i]);
+ // evaluate the param types through the functor
+ for (unsigned int i = 0; i < std::min(paramCount, MAX_FUNCTOR_ARGUMENTS); i++)
+ this->functor_->evaluateParam(i, param[i]);
- return true;
- }
+ if (error)
+ *error = CommandExecutor::Success;
+ return paramCount;
}
void Executor::setDefaultValues(const MultiType& param1)
Modified: code/branches/consolecommands3/src/libraries/core/command/Executor.h
===================================================================
--- code/branches/consolecommands3/src/libraries/core/command/Executor.h 2010-08-27 12:53:06 UTC (rev 7229)
+++ code/branches/consolecommands3/src/libraries/core/command/Executor.h 2010-08-27 17:29:49 UTC (rev 7230)
@@ -58,9 +58,10 @@
inline MultiType operator()(const MultiType& param1, const MultiType& param2, const MultiType& param3, const MultiType& param4, const MultiType& param5) const
{ return (*this->functor_)(param1, param2, param3, param4, param5); }
- MultiType parse(const std::string& params, int* error = 0, const std::string& delimiter = " ", bool bPrintError = false) const;
+ MultiType parse(const std::string& arguments, int* error = 0, const std::string& delimiter = " ", bool bPrintError = false) const;
+ MultiType parse(const SubString& arguments, int* error = 0, const std::string& delimiter = " ", bool bPrintError = false) const;
- bool evaluate(const std::string& params, MultiType param[5], const std::string& delimiter = " ") const;
+ int evaluateParams(const SubString& arguments, MultiType param[MAX_FUNCTOR_ARGUMENTS], int* error = 0, const std::string& delimiter = " ") const;
inline void setFunctor(const FunctorPtr& functor)
{ this->functor_ = functor; }
Modified: code/branches/consolecommands3/src/libraries/core/input/Button.cc
===================================================================
--- code/branches/consolecommands3/src/libraries/core/input/Button.cc 2010-08-27 12:53:06 UTC (rev 7229)
+++ code/branches/consolecommands3/src/libraries/core/input/Button.cc 2010-08-27 17:29:49 UTC (rev 7230)
@@ -174,8 +174,8 @@
}
// evaluate the command
- const CommandEvaluation& eval = CommandExecutor::evaluate(commandStr);
- if (!eval.isValid())
+ CommandEvaluation eval = CommandExecutor::evaluate(commandStr);
+ if (!eval.isValid() || eval.evaluateParams(true))
{
parseError("Command evaluation of \"" + commandStr + "\"failed.", true);
continue;
Modified: code/branches/consolecommands3/src/libraries/core/input/InputCommands.cc
===================================================================
--- code/branches/consolecommands3/src/libraries/core/input/InputCommands.cc 2010-08-27 12:53:06 UTC (rev 7229)
+++ code/branches/consolecommands3/src/libraries/core/input/InputCommands.cc 2010-08-27 17:29:49 UTC (rev 7230)
@@ -52,7 +52,7 @@
{
if (this->abs_ != 0.0f || this->rel_ != 0.0f)
{
-// evaluation_.setEvaluatedParameter(paramIndex_, Vector2(abs_, rel_));
+ evaluation_.setEvaluatedParameter(paramIndex_, Vector2(abs_, rel_));
// reset
rel_ = 0.0;
abs_ = 0.0;
Modified: code/branches/consolecommands3/src/libraries/util/SubString.cc
===================================================================
--- code/branches/consolecommands3/src/libraries/util/SubString.cc 2010-08-27 12:53:06 UTC (rev 7229)
+++ code/branches/consolecommands3/src/libraries/util/SubString.cc 2010-08-27 17:29:49 UTC (rev 7230)
@@ -308,7 +308,7 @@
* to the beginning of the current token is stored
* @param line the inputLine to split
* @param delimiters a String of Delimiters (here the input will be splitted)
- * @param delimiterNeighbours Naighbours to the Delimitter, that will be removed if they are to the left or the right of a Delimiter.
+ * @param delimiterNeighbours Neighbours to the Delimiter, that will be removed if they are to the left or the right of a Delimiter.
* @param emptyEntries: if empty Strings are added to the List of Strings.
* @param escape_char: Escape carater (escapes splitters)
* @param safemode_char: the beginning of the safemode is marked with this
More information about the Orxonox-commit
mailing list