changes based on reviewer comments to improve/clean code

This commit is contained in:
Jostein Alvestad 2021-01-12 14:30:25 +01:00
parent 4825f291e7
commit 8e4557646d
2 changed files with 51 additions and 56 deletions

View File

@ -368,22 +368,20 @@ const std::map<cmp_enum, int> cmpToIndex = {
12 for YEAR
*/
std::size_t ind = 0;
std::size_t ind_paren = 15;
std::size_t ind_bool_link = 17;
int noEPZacn = 26;
bool insideParen = false;
bool parenFirstCond = false;
bool allPrevLogicOp_AND = false;
// write out the schedule Actionx conditions
const auto& actx_cond = actx.conditions();
for (auto cond_it = actx_cond.begin(); cond_it < actx_cond.end(); cond_it++) {
auto z_data = *cond_it;
for (const auto& cond : actx_cond) {
// left hand quantity
std::string lhsQtype = z_data.lhs.quantity.substr(0,1);
std::string lhsQtype = cond.lhs.quantity.substr(0,1);
const auto it_lhsq = lhsQuantityToIndex.find(lhsQtype);
if (it_lhsq != lhsQuantityToIndex.end()) {
iAcn[ind + 10] = it_lhsq->second;
}
else {
std::cout << "Unknown condition type: " << z_data.lhs.quantity << std::endl;
std::cout << "Unknown condition type: " << cond.lhs.quantity << std::endl;
throw std::invalid_argument("Actionx: " + actx.name());
}
@ -394,7 +392,7 @@ const std::map<cmp_enum, int> cmpToIndex = {
8 - for constant values
*/
iAcn[ind + 11] = 8;
std::string rhsQtype = z_data.rhs.quantity.substr(0,1);
std::string rhsQtype = cond.rhs.quantity.substr(0,1);
const auto it_rhsq = rhsQuantityToIndex.find(rhsQtype);
if (it_rhsq != rhsQuantityToIndex.end()) {
iAcn[ind + 11] = it_rhsq->second;
@ -404,7 +402,7 @@ const std::map<cmp_enum, int> cmpToIndex = {
0 - for LHS quantity greater RHS quantity
1 - for LHS quantity less than or equal to RHS quantity
*/
const auto it_lhs_it = cmpToIacn_12.find(z_data.cmp);
const auto it_lhs_it = cmpToIacn_12.find(cond.cmp);
if (it_lhs_it != cmpToIacn_12.end()) {
iAcn[ind + 12] = it_lhs_it->second;
}
@ -413,12 +411,12 @@ const std::map<cmp_enum, int> cmpToIndex = {
OR is 2
AND is 1
*/
const auto it_logic_13 = logicalToIndex_13.find(z_data.logic);
const auto it_logic_13 = logicalToIndex_13.find(cond.logic);
if (it_logic_13 != logicalToIndex_13.end()) {
iAcn[ind + 13] = it_logic_13->second;
}
else {
std::cout << "Unknown Boolean operator type for condition: " << z_data.lhs.quantity << std::endl;
std::cout << "Unknown Boolean operator type for condition: " << cond.lhs.quantity << std::endl;
throw std::invalid_argument("Actionx: " + actx.name());
}
@ -428,10 +426,10 @@ const std::map<cmp_enum, int> cmpToIndex = {
* = 2 : right_paren at end of condition
*/
if ((cond_it->left_paren) && (!cond_it->right_paren)) {
iAcn[ind + 15] = 1;
} else if ((!cond_it->left_paren) && (cond_it->right_paren)) {
iAcn[ind + 15] = 2;
if (cond.open_paren()) {
iAcn[ind + ind_paren] = 1;
} else if (cond.close_paren()) {
iAcn[ind + ind_paren] = 2;
}
/*item [16] - related to the operator used in ACTIONX for defined quantities
@ -441,38 +439,46 @@ const std::map<cmp_enum, int> cmpToIndex = {
<= is 4
= is 5
*/
const auto it_cmp = cmpToIndex.find(z_data.cmp);
const auto it_cmp = cmpToIndex.find(cond.cmp);
if (it_cmp != cmpToIndex.end()) {
iAcn[ind + 16] = it_cmp->second;
}
else {
std::cout << "Unknown operator type for condition: " << z_data.lhs.quantity << std::endl;
std::cout << "Unknown operator type for condition: " << cond.lhs.quantity << std::endl;
throw std::invalid_argument("Actionx: " + actx.name());
}
/*item [17] - is an item that is non-zero for actions with several conditions combined using logical operators (AND / OR)
* First condition => [17] = 0
* Second+ conditions
*Case - no parentheses
*If all conditions before current condition has AND => [17] = 1
*If one condition before current condition has OR => [17] = 0
*Case - parenthesis before first condition
*If inside first parenthesis
*If all conditions before current condition has AND [17] => 1
*If one condition before current condition has OR [17] => 0
*If after first parenthesis end and outside parenthesis
*If all conditions outside parentheses and before current condition has AND => [17] = 1
*If one condition outside parentheses and before current condition has OR [17] => 0
*If after first parenthesis end and inside a susequent parenthesis
* [17] = 0
*Case - parenthesis after first condition
*If inside parentesis => [17] = 0
*If outside parenthesis:
*If all conditions outside parentheses and before current condition has AND => [17] = 1
*If one condition outside parentheses and before current condition has OR [17] => 0
*/
//increment index according to no of items pr condition
ind += static_cast<std::size_t>(noEPZacn);
}
/*item [17] - is an item that is non-zero for actions with several conditions combined using logical operators (AND / OR)
* First condition => [17] = 0
* Second+ conditions
*Case - no parentheses
*If all conditions before current condition has AND => [17] = 1
*If one condition before current condition has OR => [17] = 0
*Case - parenthesis before first condition
*If inside first parenthesis
*If all conditions before current condition has AND [17] => 1
*If one condition before current condition has OR [17] => 0
*If after first parenthesis end and outside parenthesis
*If all conditions outside parentheses and before current condition has AND => [17] = 1
*If one condition outside parentheses and before current condition has OR [17] => 0
*If after first parenthesis end and inside a susequent parenthesis
* [17] = 0
*Case - parenthesis after first condition
*If inside parentesis => [17] = 0
*If outside parenthesis:
*If all conditions outside parentheses and before current condition has AND => [17] = 1
*If one condition outside parentheses and before current condition has OR [17] => 0
*/
ind = 0;
bool insideParen = false;
bool parenFirstCond = false;
bool allPrevLogicOp_AND = false;
for (auto cond_it = actx_cond.begin(); cond_it < actx_cond.end(); cond_it++) {
//auto z_data = *cond_it;
if (cond_it == actx_cond.begin()) {
if ((cond_it->left_paren) && (!cond_it->right_paren)) {
if (cond_it->open_paren()) {
parenFirstCond = true;
insideParen = true;
}
@ -481,22 +487,22 @@ const std::map<cmp_enum, int> cmpToIndex = {
}
} else {
// update inside parenthesis or not plus whether in first parenthesis or not
if ((cond_it->left_paren) && (!cond_it->right_paren)) {
if (cond_it->open_paren()) {
insideParen = true;
parenFirstCond = false;
} else if ((!cond_it->left_paren) && (cond_it->right_paren)) {
} else if (cond_it->close_paren()) {
insideParen = false;
parenFirstCond = false;
}
// Assign [17] based on logic (see above)
if (parenFirstCond && allPrevLogicOp_AND) {
iAcn[ind + 17] = 1;
iAcn[ind + ind_bool_link] = 1;
}
else if (!parenFirstCond && !insideParen && allPrevLogicOp_AND) {
iAcn[ind + 17] = 1;
iAcn[ind + ind_bool_link] = 1;
} else {
iAcn[ind + 17] = 0;
iAcn[ind + ind_bool_link] = 0;
}
// update the previous logic-sequence

View File

@ -466,17 +466,6 @@ WELOPEN
/
ENDACTIO
-- ACTIONX - test data
-- (AOAA)
--ACTIONX
--ACT04 10 /
--WUPR3 'OP*' = 1 AND /
-- ( FOPR >= 2000 OR /
-- FMWPR >= 3 ) AND /
-- FWPR >= 2000 AND /
-- FGOR >= 400 /
--/
--start files/actionxprod.tmpl
ACTIONX
ACT04 10 /