From c5b7b4aae48d2b0f8b1a6ae02893152ff1a457fc Mon Sep 17 00:00:00 2001 From: dimxy Date: Thu, 2 May 2019 18:37:53 +0500 Subject: [PATCH] corr reduced calc for op=! --- src/cc/prices.cpp | 50 ++++++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/src/cc/prices.cpp b/src/cc/prices.cpp index fd1f5b4ef..123bd142d 100644 --- a/src/cc/prices.cpp +++ b/src/cc/prices.cpp @@ -632,37 +632,43 @@ static std::string prices_invertpair(const std::string &pair) } // invert pairs in operation accordingly to "/" operator -static void prices_invertoperation(const std::vector &vexpr, int p, std::vector &voperation) +static void prices_invert(const std::vector &vexpr, int p, std::vector &voperation) { - int32_t need; + int need; voperation.clear(); - if (prices_isopcode(vexpr[p], need) && need > 1) { - if (need == 2) { - voperation.push_back(vexpr[p - 2]); - if (vexpr[p] == "/") - voperation.push_back(prices_invertpair(vexpr[p - 1])); - else - voperation.push_back(vexpr[p - 1]); - voperation.push_back("*"); - } - - if (need == 3) { - int i; - std::string::const_iterator c; - for (c = vexpr[p].begin(), i = -3; c != vexpr[p].end(); c++, i++) { - if (*c == '/') - voperation.push_back(prices_invertpair(vexpr[p + i])); + if (prices_isopcode(vexpr[p], need)) { + if (need > 1) { + if (need == 2) { + voperation.push_back(vexpr[p - 2]); + if (vexpr[p] == "/") + voperation.push_back(prices_invertpair(vexpr[p - 1])); else - voperation.push_back(vexpr[p + i]); + voperation.push_back(vexpr[p - 1]); + voperation.push_back("*"); } - voperation.push_back("***"); + + if (need == 3) { + int i; + std::string::const_iterator c; + for (c = vexpr[p].begin(), i = -3; c != vexpr[p].end(); c++, i++) { + if (*c == '/') + voperation.push_back(prices_invertpair(vexpr[p + i])); + else + voperation.push_back(vexpr[p + i]); + } + voperation.push_back("***"); + } + } + else if (vexpr[p] == "!") { + voperation.push_back(prices_invertpair(vexpr[p - 1])); + // do not add operator } } //std::cerr << "prices_invert inverted="; - for (auto v : voperation) std::cerr << v << " "; - std::cerr << std::endl; + //for (auto v : voperation) std::cerr << v << " "; + //std::cerr << std::endl; } // reduce pair in operation, change or remove opcode if reduced