diff --git a/libs/main/math/pievaluator.cpp b/libs/main/math/pievaluator.cpp index 496d1f53..92445c6c 100644 --- a/libs/main/math/pievaluator.cpp +++ b/libs/main/math/pievaluator.cpp @@ -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 var_index; - PIVector 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 > var_index; + for (int i = 0; i < content.variables.size_s(); ++i) + var_index << PIPair(i, content.variables[i].name.length()); + var_index.sort([](const PIPair * v1, const PIPair * 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++; diff --git a/libs/main/math/pievaluator.h b/libs/main/math/pievaluator.h index a6ea009d..596fc507 100644 --- a/libs/main/math/pievaluator.h +++ b/libs/main/math/pievaluator.h @@ -76,13 +76,12 @@ namespace PIEvaluatorTypes { short arguments; }; struct PIP_EXPORT Variable { - Variable() {value = 0.; index = -1;} - Variable(const PIString & var_name, complexd val, int ind = -1) {name = var_name; value = val; index = ind;} - int index; + Variable() {value = 0.;} + Variable(const PIString & var_name, complexd val) {name = var_name; value = val;} PIString name; complexd value; }; -}; +} /* ≠ : ≥ } @@ -231,8 +230,6 @@ private: inline bool operator ==(PIEvaluatorTypes::Element e1, PIEvaluatorTypes::Element e2) {return (e1.type == e2.type && e1.num == e2.num);} inline bool operator !=(PIEvaluatorTypes::Element e1, PIEvaluatorTypes::Element e2) {return (e1.type != e2.type || e1.num != e2.num);} -inline bool operator < (PIEvaluatorTypes::Variable e1, PIEvaluatorTypes::Variable e2) {return e1.name > e2.name;} -inline bool operator ==(PIEvaluatorTypes::Variable e1, PIEvaluatorTypes::Variable e2) {return e1.name == e2.name;} inline PIByteArray & operator <<(PIByteArray & s, const PIEvaluatorTypes::Instruction & v) { s << PIByteArray::RawData(&v, sizeof(v) - sizeof(v.operators)) << v.operators; diff --git a/main.cpp b/main.cpp index 0f49cc37..4485f0aa 100644 --- a/main.cpp +++ b/main.cpp @@ -1,53 +1,37 @@ #include "pip.h" -#include "pivariantsimple.h" - -#pragma pack(push, 1) -struct MM { - int x; - int x2; - double y; - char c[16]; - int e2; - int e; - //PIPointd h; -}; -#pragma pack(pop) - -int Acnt = 0; - -class A { -public: - A() {moved = false; i = "constructor"; piCout << "A()"; ++Acnt;} - A(const PIString & s): i(s) {moved = false; piCout << "A(String)"; ++Acnt;} - A(const A & a): i(a.i) {moved = false; piCout << "copy A(&)"; ++Acnt;} - A(A && a): i(std::move(a.i)) {moved = false; a.moved = true; piCout << "copy A(&&)"; ++Acnt;} - ~A() {piCout << "~A()" << moved; --Acnt;} - void swap(A & a) {piCout << "swap A()"; piSwap(i, a.i);} - A & operator =(const A & a) {i = a.i; piCout << "= A&"; return *this;} - A & operator =(A && a) {piSwap(i, a.i); a.moved = true; piCout << "= A&&)"; return *this;} - bool operator ==(const A & a) {return true;} - PIString i; - bool moved; - MM m; - static void F(int) {} -}; - -inline PIByteArray & operator <<(PIByteArray & ba, const A & v) {ba << v.i << v.m; return ba;} -inline PIByteArray & operator >>(PIByteArray & ba, A & v) {ba >> v.i >> v.m; return ba;} - -inline PIByteArray & operator <<(PIByteArray & ba, const MM & v) {piCout << "<<"; ba << v.x << v.y << v.c; return ba;} -inline PIByteArray & operator >>(PIByteArray & ba, MM & v) {piCout << ">>"; ba >> v.x >> v.y >> v.c; return ba;} int main() { - PIMathVectorT3d v3({1,2,3}); - PIMathVectord v(v3); - PIMathVectord v2({3,2,1}); - piCout << v; - piCout << v2; - PIMathMatrixT22d m = PIMathMatrixT22d::identity(); - piCout << m; - m.rotate(toRad(90.)); - piCout << m; + PIVector indexes; + PIEvaluator eval; + int dims = 3; + indexes << eval.setVariable("l", complexd(1.)); + indexes << eval.setVariable("mc", complexd(1.)); + for (int i = 0; i < dims; ++i) { + indexes << eval.setVariable("t" + PIString::fromNumber(i), complexd(1.)); + indexes << eval.setVariable("tv" + PIString::fromNumber(i), complexd(1.)); + } + for (int i = 0; i < dims; ++i) { + indexes << eval.setVariable("m" + PIString::fromNumber(i), complexd(1.)); + indexes << eval.setVariable("mv" + PIString::fromNumber(i), complexd(1.)); + } + piCout << indexes; + + indexes.clear(); + indexes << eval.setVariable("l", complexd(1.)); + indexes << eval.setVariable("mc", complexd(1.)); + for (int i = 0; i < dims; ++i) { + indexes << eval.setVariable("t" + PIString::fromNumber(i), complexd(1.)); + indexes << eval.setVariable("tv" + PIString::fromNumber(i), complexd(1.)); + } + for (int i = 0; i < dims; ++i) { + indexes << eval.setVariable("m" + PIString::fromNumber(i), complexd(1.)); + indexes << eval.setVariable("mv" + PIString::fromNumber(i), complexd(1.)); + } + piCout << indexes; + + PIEvaluator * eval_x = new PIEvaluator(); + piCout << eval_x->setVariable("t"); + piCout << eval_x->setVariable("t"); return 0; }