Skip to content

Commit 364839e

Browse files
committed
Support for scanning things like Ln now added
-Now uses switch statement for adding operators from buffer -Failing to condense inner formulas that have more than one operation right now with cannot dereference value-initialized deque iterator exception
1 parent 87df2cf commit 364839e

4 files changed

Lines changed: 92 additions & 51 deletions

File tree

ExprFormulaTester/ExprFormulaTester.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,4 +258,25 @@ int main()
258258
std::cout << " = " << AltFormTest.ToString() << std::endl;
259259
AltFormTest.EvaluateOperations();
260260
std::cout << " = " << AltFormTest.ToString() << std::endl;
261+
262+
AltFormTest = "9.0 thBaseLog 4";
263+
std::cout << "(MediumDecFormula) " << AltFormTest.ToString() << std::endl;
264+
AltFormTest.ReplaceVariablesWithValues(ValueDefinitions);
265+
std::cout << " = " << AltFormTest.ToString() << std::endl;
266+
AltFormTest.EvaluateOperations();
267+
std::cout << " = " << AltFormTest.ToString() << std::endl;
268+
269+
AltFormTest = "(x+1)^(5+4/0.5-2)";
270+
std::cout << "(MediumDecFormula) " << AltFormTest.ToString() << std::endl;
271+
AltFormTest.ReplaceVariablesWithValues(ValueDefinitions);
272+
std::cout << " = " << AltFormTest.ToString() << std::endl;
273+
AltFormTest.EvaluateOperations();
274+
std::cout << " = " << AltFormTest.ToString() << std::endl;
275+
276+
AltFormTest = "(x+1)^(5+4*0.5-2)";
277+
std::cout << "(MediumDecFormula) " << AltFormTest.ToString() << std::endl;
278+
AltFormTest.ReplaceVariablesWithValues(ValueDefinitions);
279+
std::cout << " = " << AltFormTest.ToString() << std::endl;
280+
AltFormTest.EvaluateOperations();
281+
std::cout << " = " << AltFormTest.ToString() << std::endl;
261282
}

GlobalCode/Databases/ElementType.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ namespace BlazesRusCode
5656
OR,
5757
LN,
5858
LOGTEN,
59-
BaseNLog
59+
BaseNLog,
60+
BuildInVariable
6061
};
6162
}

GlobalCode/Databases/MediumDecFormula.hpp

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,16 @@
2020
$ = XOR (bitwise XOR operation)(Not fully supported by MediumDec yet)
2121
++Prefix; --Prefix;
2222
(Bitwise operators--Not fully supported by MediumDec yet)&, |
23-
SqrtOf = Square Root of (applied to right value) (Not scanned yet but application code inside)
24-
thRootOf = Nth Root of (left value is equal to N; applied to right value) (Not scanned yet but application code inside)
25-
23+
SqrtOf = Square Root of (applied to right value)
24+
thRootOf = Nth Root of (left value is equal to N; applied to right value)
25+
PowerOf = Power of
26+
Ln = Natural log function
27+
thBaseLog = Base N Log function of right value
28+
LogTen = Log base 10 function of right value
2629
*/
2730
//Unsupported Operators/Functions(for later)
2831
/*
2932
++Postfix; --Postfix (Need to update to code changes)
30-
PowerOf = (for scanning PowerOf instead of ^)
3133
? = TernaryOperator(Not stored/evaluated yet)
3234
Assignment operators not supported
3335
*/
@@ -363,10 +365,10 @@ namespace BlazesRusCode
363365
targetResult = KeyedElemVal.value();
364366
FormDRef.NumMap.insert_or_assign(CurrentVal->first, targetResult);//ElementValues.at(CurString));
365367
}
366-
else
367-
{
368-
std::cout << "Failed to replace variable named " << CurString << " with value data" << std::endl;
369-
}
368+
//else
369+
//{
370+
// std::cout << "Failed to replace variable named " << CurString << " with value data" << std::endl;
371+
//}
370372
}
371373
}
372374
}
@@ -400,18 +402,6 @@ namespace BlazesRusCode
400402
if (CurrentVal->second.ElementCat == FormulaElementType::Formula)//FormulaDetected
401403
{
402404
ReplaceVariablesWithValues(ElementValues, CurrentVal->second.Index);
403-
//if (Data.at(CurrentVal->second.Index).size() == 1)
404-
//{
405-
// FormData& ContainedFormulaElement = Data.at(CurrentVal->first);
406-
// auto FirstElement = ContainedFormulaElement.front();
407-
// /*
408-
// if(ContainedFormulaElement.ElementCat == FormulaElementType::Num)
409-
// {
410-
// }
411-
// */
412-
// //targetResult = ContainedFormulaElement.;
413-
// //FormDRef.ReplaceFormVal(CurrentVal->first, targetResult);
414-
//}
415405
}
416406
else if (CurrentVal->second.ElementCat == FormulaElementType::Variable)//Swap Variable with values
417407
{
@@ -423,10 +413,10 @@ namespace BlazesRusCode
423413
targetResult = KeyedElemVal.value();
424414
FormDRef.NumMap.insert_or_assign(CurrentVal->first, targetResult);//ElementValues.at(CurString));
425415
}
426-
else
427-
{
428-
std::cout << "Failed to replace variable named " << CurString << " with value data" << std::endl;
429-
}
416+
//else
417+
//{
418+
// std::cout << "Failed to replace variable named " << CurString << " with value data" << std::endl;
419+
//}
430420
}
431421
}
432422
}
@@ -522,11 +512,20 @@ namespace BlazesRusCode
522512
strBuffer += "^";
523513
break;
524514
case FormulaElementType::Sqrt:
525-
strBuffer += " SqrtOf";
515+
strBuffer += "SqrtOf";
526516
break;
527517
case FormulaElementType::NthRoot:
528518
strBuffer += "thRootOf";
529519
break;
520+
case FormulaElementType::LOGTEN:
521+
strBuffer += "LogTen";
522+
break;
523+
case FormulaElementType::LN:
524+
strBuffer += "Ln";
525+
break;
526+
case FormulaElementType::BaseNLog:
527+
strBuffer += "thBaseLog";
528+
break;
530529
case FormulaElementType::Rem:
531530
strBuffer += "%";
532531
break;
@@ -575,7 +574,7 @@ namespace BlazesRusCode
575574
case FormulaElementType::Formula:
576575
strBuffer += "(";
577576
indexBuffer = CurrentVal->second.Index;
578-
RecursivelyAddToString(strBuffer, indexBuffer);//CurrentVal->second.Index);
577+
RecursivelyAddToString(strBuffer, indexBuffer);
579578
strBuffer += ")";
580579
break;
581580
case FormulaElementType::Num:
@@ -636,11 +635,20 @@ namespace BlazesRusCode
636635
strBuffer += "^";
637636
break;
638637
case FormulaElementType::Sqrt:
639-
strBuffer += " SqrtOf";
638+
strBuffer += "SqrtOf";
640639
break;
641640
case FormulaElementType::NthRoot:
642641
strBuffer += "thRootOf";
643642
break;
643+
case FormulaElementType::LOGTEN :
644+
strBuffer += "LogTen";
645+
break;
646+
case FormulaElementType::LN:
647+
strBuffer += "Ln";
648+
break;
649+
case FormulaElementType::BaseNLog :
650+
strBuffer += "thBaseLog";
651+
break;
644652
case FormulaElementType::Rem:
645653
strBuffer += "%";
646654
break;

GlobalCode/Databases/VariableFormula.hpp

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,6 @@ namespace BlazesRusCode
9494
public:
9595
class DLL_API FormElement
9696
{
97-
protected:
98-
9997
public:
10098
//0 = Num; 1 = Variable; 2 = Formula; 3 = true; 4 = false ; 5 >= Op;
10199
FormulaElementType ElementCat;
@@ -512,6 +510,15 @@ namespace BlazesRusCode
512510
case FormulaElementType::NthRoot:
513511
strBuffer += "thRootOf";
514512
break;
513+
case FormulaElementType::LOGTEN:
514+
strBuffer += "LogTen";
515+
break;
516+
case FormulaElementType::LN:
517+
strBuffer += "Ln";
518+
break;
519+
case FormulaElementType::BaseNLog:
520+
strBuffer += "thBaseLog";
521+
break;
515522
case FormulaElementType::Rem:
516523
strBuffer += "%";
517524
break;
@@ -586,34 +593,38 @@ namespace BlazesRusCode
586593
}
587594
else if (ScanType == 3)
588595
{
589-
this->AddVariable(strBuffer, targetFormSegment);
596+
if (strBuffer == "Ln") { targetFormSegment.AddOp(FormulaElementType::LN); }
597+
else if (strBuffer == "LogTen") { targetFormSegment.AddOp(FormulaElementType::LOGTEN); }
598+
else if (strBuffer == "thBaseLog") { targetFormSegment.AddOp(FormulaElementType::BaseNLog); }
599+
else if (strBuffer == "SqrtOf") { targetFormSegment.AddOp(FormulaElementType::Sqrt); }
600+
else if (strBuffer == "thRootOf") { targetFormSegment.AddOp(FormulaElementType::NthRoot); }
601+
else if (strBuffer == "PowerOf") { targetFormSegment.AddOp(FormulaElementType::Pow); }
602+
//BuildInVariable detection here as well(for derived formula class)
603+
else
604+
this->AddVariable(strBuffer, targetFormSegment);
590605
}
591606
else if (ScanType == 4)
592607
{
593608
targetFormSegment.AddNum(strBuffer);
594609
}
595610
else if (ScanType == 1)
596611
{
597-
if (strBuffer == "+") { targetFormSegment.AddOp(FormulaElementType::Add); }
598-
else if (strBuffer == "-") { targetFormSegment.AddOp(FormulaElementType::Sub); }
599-
else if (strBuffer == "*") { targetFormSegment.AddOp(FormulaElementType::Mult); }
600-
else if (strBuffer == "/") { targetFormSegment.AddOp(FormulaElementType::Div); }
601-
else if (strBuffer == "%") { targetFormSegment.AddOp(FormulaElementType::Rem); }
602-
else if (strBuffer == "^") { targetFormSegment.AddOp(FormulaElementType::Pow); }
603-
else if (strBuffer == "SqrtOf") { targetFormSegment.AddOp(FormulaElementType::Sqrt); }
604-
else if (strBuffer == "==") { targetFormSegment.AddOp(FormulaElementType::Equal); }
605-
else if (strBuffer == "!=") { targetFormSegment.AddOp(FormulaElementType::NotEqual); }
606-
else if (strBuffer == "<") { targetFormSegment.AddOp(FormulaElementType::LessThan); }
607-
else if (strBuffer == "<=") { targetFormSegment.AddOp(FormulaElementType::LessOrEqual); }
608-
else if (strBuffer == ">") { targetFormSegment.AddOp(FormulaElementType::GreaterThan); }
609-
else if (strBuffer == ">=") { targetFormSegment.AddOp(FormulaElementType::GreaterOrEqual); }
610-
else if (strBuffer == "&&") { targetFormSegment.AddOp(FormulaElementType::AND); }
611-
else if (strBuffer == "||") { targetFormSegment.AddOp(FormulaElementType::OR); }
612-
else if (strBuffer == "thRootOf") { targetFormSegment.AddOp(FormulaElementType::NthRoot); }
613-
else if (strBuffer == "PowerOf") { targetFormSegment.AddOp(FormulaElementType::Pow); }
614-
else if (strBuffer == "&") { targetFormSegment.AddOp(FormulaElementType::BitwiseAND); }
615-
else if (strBuffer == "|") { targetFormSegment.AddOp(FormulaElementType::BitwiseOr); }
616-
else if (strBuffer == "$") { targetFormSegment.AddOp(FormulaElementType::XOR); }
612+
switch (strBuffer.front())
613+
{
614+
case '+': targetFormSegment.AddOp(FormulaElementType::Add); break;
615+
case '-': targetFormSegment.AddOp(FormulaElementType::Sub); break;
616+
case '*': targetFormSegment.AddOp(FormulaElementType::Mult); break;
617+
case '/': targetFormSegment.AddOp(FormulaElementType::Div); break;
618+
case '%': targetFormSegment.AddOp(FormulaElementType::Rem); break;
619+
case '^': targetFormSegment.AddOp(FormulaElementType::Pow); break;
620+
case '<': targetFormSegment.AddOp(strBuffer.size() == 2 ? FormulaElementType::LessOrEqual : FormulaElementType::LessThan); break;
621+
case '>': targetFormSegment.AddOp(strBuffer.size() == 2 ? FormulaElementType::GreaterOrEqual : FormulaElementType::GreaterThan); break;
622+
case '=': targetFormSegment.AddOp(FormulaElementType::Equal); break;//== detected
623+
case '&': targetFormSegment.AddOp(strBuffer.size() == 2 ? FormulaElementType::AND : FormulaElementType::BitwiseAND); break;
624+
case '|': targetFormSegment.AddOp(strBuffer.size() == 2 ? FormulaElementType::OR : FormulaElementType::BitwiseOr); break;
625+
case '!': targetFormSegment.AddOp(strBuffer.size() == 2 ? FormulaElementType::NotEqual : FormulaElementType::Negative); break;
626+
case '$': targetFormSegment.AddOp(FormulaElementType::XOR); break;//XOR
627+
}
617628
}
618629
else if (ScanType == 11)//Prefix ++ or --
619630
{

0 commit comments

Comments
 (0)