summaryrefslogtreecommitdiff
path: root/expressions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'expressions.cpp')
-rw-r--r--expressions.cpp39
1 files changed, 38 insertions, 1 deletions
diff --git a/expressions.cpp b/expressions.cpp
index c7d80e3..72e1e04 100644
--- a/expressions.cpp
+++ b/expressions.cpp
@@ -3,6 +3,7 @@
#include <cmath>
#include "include/lexer.hpp"
#include "include/expressions.hpp"
+#include "include/differentiator.hpp"
using std::string, std::to_string;
@@ -25,6 +26,10 @@ float Literal::eval(int arg) {
return getValue();
}
+Expression *Literal::diff(const Differentiator *d) {
+ return d->visit(this);
+}
+
Expression *Literal::copy() {
return new Literal(value);
}
@@ -39,7 +44,7 @@ Function::~Function() {
delTree();
}
-const Expression *Function::getArg() const {
+Expression *Function::getArg() {
return arg;
}
@@ -47,6 +52,10 @@ trig_functions Function::getFunctionName() const {
return function_name;
}
+Expression *Function::diff(const Differentiator *d) {
+ return d->visit(this);
+}
+
void Function::delTree() {
delete arg;
}
@@ -123,6 +132,10 @@ float Variable::eval(int arg) {
return arg;
}
+Expression *Variable::diff(const Differentiator *d) {
+ return d->visit(this);
+}
+
Expression *Variable::copy() {
return new Variable(name);
}
@@ -142,6 +155,10 @@ float AddExpression::eval(int arg) {
return right_val + left_val;
}
+Expression *AddExpression::diff(const Differentiator *d) {
+ return d->visit(this);
+}
+
Expression *AddExpression::copy() {
return new AddExpression(left->copy(), right->copy());
}
@@ -161,6 +178,10 @@ float SubExpression::eval(int arg) {
return right_val - left_val;
}
+Expression *SubExpression::diff(const Differentiator *d) {
+ return d->visit(this);
+}
+
Expression *SubExpression::copy() {
return new SubExpression(left->copy(), right->copy());
}
@@ -184,6 +205,10 @@ float NegationExpression::eval(int arg) {
return -1 * expr_value;
}
+Expression *NegationExpression::diff(const Differentiator *d) {
+ return d->visit(this);
+}
+
Expression *NegationExpression::copy() {
return new NegationExpression(right->copy());
}
@@ -203,6 +228,10 @@ float DivisionExpression::eval(int arg) {
return left_val / right_val;
}
+Expression *DivisionExpression::diff(const Differentiator *d) {
+ return d->visit(this);
+}
+
Expression *DivisionExpression::copy() {
return new DivisionExpression(left->copy(), right->copy());
}
@@ -223,6 +252,10 @@ float MultiplicationExpression::eval(int arg) {
return left_val * right_val;
}
+Expression *MultiplicationExpression::diff(const Differentiator *d) {
+ return d->visit(this);
+}
+
Expression *MultiplicationExpression::copy() {
return new MultiplicationExpression(left->copy(), right->copy());
}
@@ -242,6 +275,10 @@ float PowerExpression::eval(int arg) {
return std::pow(left_val, right_val);
}
+Expression *PowerExpression::diff(const Differentiator *d) {
+ return d->visit(this);
+}
+
Expression *PowerExpression::copy() {
return new PowerExpression(left->copy(), right->copy());
}