Added infix and prefix and some tests
authorNilsForssen <forssennils@gmail.com>
Fri, 6 Oct 2023 14:28:34 +0000 (16:28 +0200)
committerNilsForssen <forssennils@gmail.com>
Fri, 6 Oct 2023 14:28:34 +0000 (16:28 +0200)
src/expression.h
src/operands.cc
src/operands.h
src/operators.cc
src/operators.h

index fab63e719e73a4c453d537c08cdd4e91430c2479..d1d1a999076e51ab0e316b369dafcfc553481486 100644 (file)
@@ -4,6 +4,9 @@
 #include <string>
 
 class Equation {
+public:
+protected:
+private:
 };
 
 class Node {
@@ -12,6 +15,8 @@ public:
 
     virtual double get_value() const = 0;
     virtual std::string get_postfix() const = 0;
+    virtual std::string get_infix() const = 0;
+    virtual std::string get_prefix() const = 0;
 
 private:
 protected:
index 4d2092d03f932ec477238a36c0a9da4115bef51a..6b8487fe4c15d17982986f4cd294231af67e7719 100644 (file)
@@ -44,4 +44,14 @@ double Variable::get_value() const
 std::string Variable::get_postfix() const
 {
     return name;
+}
+
+std::string Operand::get_infix() const
+{
+    return get_postfix();
+}
+
+std::string Operand::get_prefix() const
+{
+    return get_postfix();
 }
\ No newline at end of file
index f658aaf1e25c36082be86823455b60f093b84b9c..fd43bd07678e7dd4383c27a10330b7dc3712b377 100644 (file)
@@ -7,8 +7,17 @@
 
 #include "expression.h"
 
+class Operand : public Node
+{
+public:
+    virtual ~Operand() = default;
+    std::string get_infix() const override;
+    std::string get_prefix() const override;
+protected:
+private:
+};
 
-class Const_int : public Node
+class Const_int : public Operand
 {
 public:
     Const_int(int v);
@@ -16,13 +25,14 @@ public:
     double get_value() const override;
 
     std::string get_postfix() const override;
+
 protected:
 private:
     int value;
 };
 
 
-class Const_double : public Node
+class Const_double : public Operand
 {
 public:
     Const_double(double v);
@@ -36,13 +46,14 @@ private:
 };
 
 
-class Variable : public Node
+class Variable : public Operand
 {
 public:
     Variable(std::string & n, double v);
 
     double get_value() const override;
     std::string get_postfix() const override;
+
 protected:
 private:
     std::string name;
index b700daa6059f4183aa3c28bde89d4bd7d2e66f7b..f4e43a335cff4604b00796500e397f333b3aad04 100644 (file)
@@ -16,6 +16,20 @@ std::string Operator::get_postfix() const
     return concat.str();
 }
 
+std::string Operator::get_infix() const
+{
+    std::stringstream concat{};
+    concat << "(" << lhs->get_infix() << symbol << rhs->get_infix() << ")";
+    return concat.str();
+}
+
+std::string Operator::get_prefix() const
+{
+    std::stringstream concat{};
+    concat << symbol << " " << lhs->get_postfix() << " " << rhs->get_postfix();
+    return concat.str();
+}
+
 Addition::Addition(Node & l, Node & r)
 : Operator{&l, &r, "+"}
 {}
@@ -61,13 +75,13 @@ Exponent::Exponent(Node & l, Node & r)
 
 double Exponent::get_value() const
 {
-    if (lhs->get_value() < 0 && std::fmod(rhs->get_value(), 1) == 0.0)
+    if (lhs->get_value() < 0.0 && std::fmod(rhs->get_value(), 1) == 0.0)
     {
         throw std::logic_error("Cannot have negative base with decimal exponent");
     }
-    if (lhs->get_value() == 0 && rhs->get_value() < 0)
+    if (lhs->get_value() == 0.0 && rhs->get_value() < 0.0)
     {
-        std::logic_error("Cannot have base of 0 and negative exponent");
+        throw std::logic_error("Cannot have base of 0 and negative exponent");
     }
 
     return pow(lhs->get_value(), rhs->get_value());
index ddba79be88684bd2dde3121bb957889e40b020e1..2730c3f3dbaeac7f019912d90847f674436ecdd9 100644 (file)
@@ -20,6 +20,8 @@ public:
     
     std::string get_symbol() const;
     std::string get_postfix() const override;
+    std::string get_infix() const override;
+    std::string get_prefix() const override;
 
 protected:
     Node * rhs;