bool CompAB(const TVar& a, const TVar& b, TVarFuncCmp fcmp) { bool r = true; __int64 bi; double bd; switch (a.vType) { case vtUnknown: case vtInteger: switch (b.vType) { case vtUnknown: case vtInteger: r = fcmp(vtInteger,&a.inum,&b.inum); break; case vtDouble: r = fcmp(vtDouble,&a.inum,&b.dnum); break; case vtString: { switch (checkTypeString(b.asString())) { case tsStr: r = fcmp(vtString,a.asString().data(),b.str.data()); break; case tsInt: bi=b.asInteger(); r = fcmp(vtInteger,&a.inum,&bi); break; case tsFloat: bd=b.asDouble(); r = fcmp(vtDouble,&a.inum,&bd); break; } break; } } break; case vtDouble: switch (b.vType) { case vtUnknown: case vtInteger: r = fcmp(vtInteger,&a.dnum,&b.inum); break; case vtDouble: r = fcmp(vtDouble,&a.dnum,&b.dnum); break; case vtString: { switch (checkTypeString(b.str)) { case tsStr: r = fcmp(vtString,a.asString().data(),b.str.data()); break; case tsInt: case tsFloat: bd=b.asDouble(); r = fcmp(vtDouble,&a.inum,&bd); break; } break; } } break; case vtString: { r = fcmp(vtString,a.asString().data(),b.asString().data()); break; } } return r; };
TVar operator+(const TVar& a, const TVar& b) { TVar r; switch (a.vType) { case vtUnknown: case vtInteger: { switch (b.vType) { case vtUnknown: case vtInteger: r = a.inum + b.inum; break; case vtDouble: r = (double)a.inum + b.dnum; break; case vtString: { switch (checkTypeString(b.str)) { case tsStr: r = addStr(::toString(a.inum), b.asString()); break; case tsInt: r = a.inum + b.asInteger(); break; case tsFloat: r = (double)a.inum + b.asDouble(); break; } break; } } break; } case vtDouble: { switch (b.vType) { case vtUnknown: case vtInteger: r = (double)a.inum + b.dnum; break; case vtDouble: r = a.dnum + b.dnum; break; case vtString: { switch (checkTypeString(b.str)) { case tsStr: r = addStr(::toString(a.dnum), b.asString()); break; case tsInt: case tsFloat: r = a.dnum * b.asDouble(); break; } break; } } break; } case vtString: { TypeString tsA=checkTypeString(a.str),tsB; if (b.vType == vtInteger || b.vType == vtUnknown) tsB=tsInt; else if (b.vType == vtDouble) tsB=tsFloat; else tsA=tsB=tsStr; if ((tsA == tsStr && tsB == tsStr) || (tsA != tsStr && tsB == tsStr) || (tsA == tsStr && tsB != tsStr)) r = addStr(a.asString(), b.asString()); else if (tsA == tsInt && tsB == tsInt) r = a.asInteger() + b.asInteger(); else r = a.asDouble() + b.asDouble(); break; } } return r; };