PIEvaluator simplify variables sort

This commit is contained in:
2021-04-02 11:42:01 +03:00
parent 58bdcd65a3
commit 8a05a25bca
3 changed files with 45 additions and 68 deletions

View File

@@ -189,9 +189,8 @@ void PIEvaluatorContent::addFunction(const PIString & name, int args) {
int PIEvaluatorContent::addVariable(const PIString & name, const complexd & val) {
int ind = variables.size_s();
variables << PIEvaluatorTypes::Variable(name, val, ind);
return ind;
variables << PIEvaluatorTypes::Variable(name, val);
return variables.size_s()-1;
}
@@ -216,7 +215,7 @@ int PIEvaluatorContent::findFunction(const PIString & name) const {
int PIEvaluatorContent::findVariable(const PIString & var_name) const {
for (uint i = 0; i < variables.size(); i++)
if (variables[i].name == var_name)
return variables[i].index;
return i;
return -1;
}
@@ -251,7 +250,7 @@ void PIEvaluatorContent::removeVariable(int index) {
void PIEvaluatorContent::clearCustomVariables() {
variables.clear();
addVariable(PIStringAscii("i" ), complexd_i);
addVariable(PIStringAscii("pi"), atan(1.) * 4.);
addVariable(PIStringAscii("pi"), 3.141592653589793238462643383280);
addVariable(PIStringAscii("e" ), exp(1.));
cv_count = variables.size_s();
}
@@ -308,8 +307,6 @@ BaseFunctions PIEvaluatorContent::getBaseFunction(const PIString & name) {
void PIEvaluatorContent::dump() {
for (int i = 0; i < variables.size_s(); ++i) {
Variable v(variables[i]);
PIString str;
//str << "(ind " << v.index << ", mapped " << var_index.value(v.index, -1) << ")";
piCout << i << v.name << "=" << v.value;
}
}
@@ -483,20 +480,19 @@ bool PIEvaluator::fillElements() {
}
}
cnum = 0;
PIMap<int, int> var_index;
PIVector<PIEvaluatorTypes::Variable> svariables = content.variables;
for (int i = 0; i < svariables.size_s(); ++i)
svariables[i].index = i;
svariables.sort();
for (int i = 0; i < svariables.size_s(); i++) {
curfind = svariables[i].name;
PIVector<PIPair<int, int> > var_index;
for (int i = 0; i < content.variables.size_s(); ++i)
var_index << PIPair<int, int>(i, content.variables[i].name.length());
var_index.sort([](const PIPair<int, int> * v1, const PIPair<int, int> * v2)->int {return v1->second > v2->second ? -1 : (v1->second == v2->second ? 0 : 1);});
for (int i = 0; i < var_index.size_s(); i++) {
curfind = content.variables[var_index[i].first].name;
flen = curfind.length();
fstart = 0;
while (fstart >= 0) {
fstart = tmps.find(curfind, fstart);
if (fstart < 0) break;
for (int j = fstart; j < fstart + flen; j++) {
elements[j].set(etVariable, cnum, svariables[i].index);
elements[j].set(etVariable, cnum, var_index[i].first);
tmps.replace(j, 1, fc);
}
cnum++;