aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Tuomi <jan-sebastian.tuomi@aalto.fi>2016-07-31 01:25:21 +0300
committerJan Tuomi <jan-sebastian.tuomi@aalto.fi>2016-07-31 01:25:21 +0300
commitae7275e7ab7ea2b4599b613454d4c1149855bced (patch)
tree0e14df22b639cae2c8afb636ff63cf1addd37b88
parentd7b9008b7b243046d5986696444072ef267cbf3c (diff)
Add 'eq' builtin and comparison functionality for datatypes
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/datatype/BooleanDatatype.java11
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/datatype/CallableDatatype.java9
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/datatype/Datatype.java1
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/datatype/DoubleDatatype.java15
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/datatype/IntegerDatatype.java15
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/datatype/ListDatatype.java18
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/datatype/NadaDatatype.java8
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/datatype/StringDatatype.java11
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/datatype/VoidDatatype.java5
-rw-r--r--src/main/com/jantuomi/tunkki/core/runtime/builtins/BuiltinManager.java1
-rw-r--r--src/main/com/jantuomi/tunkki/core/runtime/builtins/ContainsBuiltinFunction.java2
-rw-r--r--src/main/com/jantuomi/tunkki/core/runtime/builtins/EqualsBuiltinFunction.java33
12 files changed, 128 insertions, 1 deletions
diff --git a/src/main/com/jantuomi/tunkki/core/parser/datatype/BooleanDatatype.java b/src/main/com/jantuomi/tunkki/core/parser/datatype/BooleanDatatype.java
index 9d8fc69..9a42897 100644
--- a/src/main/com/jantuomi/tunkki/core/parser/datatype/BooleanDatatype.java
+++ b/src/main/com/jantuomi/tunkki/core/parser/datatype/BooleanDatatype.java
@@ -41,4 +41,15 @@ public class BooleanDatatype extends Datatype<Boolean> {
public Datatype<Boolean> divide(Datatype<Boolean> other) throws TunkkiError {
return null;
}
+
+ @Override
+ public BooleanDatatype equals(Datatype<Boolean> other) throws TunkkiError {
+ switch (other.getType()) {
+ case Boolean:
+ return new BooleanDatatype(getData().equals(other.getData()));
+ case Nada:
+ return new BooleanDatatype(false);
+ }
+ return null;
+ }
}
diff --git a/src/main/com/jantuomi/tunkki/core/parser/datatype/CallableDatatype.java b/src/main/com/jantuomi/tunkki/core/parser/datatype/CallableDatatype.java
index 3480b5d..d4b93d6 100644
--- a/src/main/com/jantuomi/tunkki/core/parser/datatype/CallableDatatype.java
+++ b/src/main/com/jantuomi/tunkki/core/parser/datatype/CallableDatatype.java
@@ -43,4 +43,13 @@ public class CallableDatatype extends Datatype<Function> {
public Datatype<Function> divide(Datatype<Function> other) throws TunkkiError {
return null;
}
+
+ @Override
+ public BooleanDatatype equals(Datatype<Function> other) throws TunkkiError {
+ switch (other.getType()) {
+ case Nada:
+ return new BooleanDatatype(false);
+ }
+ return null;
+ }
}
diff --git a/src/main/com/jantuomi/tunkki/core/parser/datatype/Datatype.java b/src/main/com/jantuomi/tunkki/core/parser/datatype/Datatype.java
index 887b2f4..dcbd66e 100644
--- a/src/main/com/jantuomi/tunkki/core/parser/datatype/Datatype.java
+++ b/src/main/com/jantuomi/tunkki/core/parser/datatype/Datatype.java
@@ -40,6 +40,7 @@ abstract public class Datatype<T> {
public abstract Datatype<T> subtract(Datatype<T> other) throws TunkkiError;
public abstract Datatype<T> multiply(Datatype<T> other) throws TunkkiError;
public abstract Datatype<T> divide(Datatype<T> other) throws TunkkiError;
+ public abstract BooleanDatatype equals(Datatype<T> other) throws TunkkiError;
public static String toString(List<Datatype> variables) {
String result = "[";
diff --git a/src/main/com/jantuomi/tunkki/core/parser/datatype/DoubleDatatype.java b/src/main/com/jantuomi/tunkki/core/parser/datatype/DoubleDatatype.java
index 38ec4ec..4483ff6 100644
--- a/src/main/com/jantuomi/tunkki/core/parser/datatype/DoubleDatatype.java
+++ b/src/main/com/jantuomi/tunkki/core/parser/datatype/DoubleDatatype.java
@@ -10,6 +10,8 @@ public class DoubleDatatype extends Datatype<Double> {
setData(value);
}
+ private final static double EPSILON = 0.00001;
+
@Override
public Type getType() {
return Type.Double;
@@ -21,6 +23,19 @@ public class DoubleDatatype extends Datatype<Double> {
}
@Override
+ public BooleanDatatype equals(Datatype<Double> other) throws TunkkiError {
+ switch (other.getType()) {
+ case Double:
+ return new BooleanDatatype(
+ Math.abs(getData() - other.getData()) < EPSILON
+ );
+ case Nada:
+ return new BooleanDatatype(false);
+ }
+ return null;
+ }
+
+ @Override
public Datatype add(Datatype other) throws TunkkiError {
switch (other.getType()) {
case Double:
diff --git a/src/main/com/jantuomi/tunkki/core/parser/datatype/IntegerDatatype.java b/src/main/com/jantuomi/tunkki/core/parser/datatype/IntegerDatatype.java
index 8d91e3a..1891326 100644
--- a/src/main/com/jantuomi/tunkki/core/parser/datatype/IntegerDatatype.java
+++ b/src/main/com/jantuomi/tunkki/core/parser/datatype/IntegerDatatype.java
@@ -22,6 +22,21 @@ public class IntegerDatatype extends Datatype<Integer> {
}
@Override
+ public BooleanDatatype equals(Datatype other) throws TunkkiError {
+ switch (other.getType()) {
+ case Integer:
+ return new BooleanDatatype(getData().equals(other.getData()));
+ case Double:
+ return new BooleanDatatype(
+ new DoubleDatatype(getData()).equals(
+ ((DoubleDatatype) other).getData()));
+ case Nada:
+ return new BooleanDatatype(false);
+ }
+ return null;
+ }
+
+ @Override
public Datatype add(Datatype other) {
switch (other.getType()) {
case Integer:
diff --git a/src/main/com/jantuomi/tunkki/core/parser/datatype/ListDatatype.java b/src/main/com/jantuomi/tunkki/core/parser/datatype/ListDatatype.java
index 2ff9b4a..8b4d44c 100644
--- a/src/main/com/jantuomi/tunkki/core/parser/datatype/ListDatatype.java
+++ b/src/main/com/jantuomi/tunkki/core/parser/datatype/ListDatatype.java
@@ -25,6 +25,24 @@ public class ListDatatype extends Datatype<List<Datatype>> {
}
@Override
+ public BooleanDatatype equals(Datatype<List<Datatype>> other) throws TunkkiError {
+ switch (other.getType()) {
+ case List:
+ boolean found = false;
+ for (int i = 0; i < getData().size(); i++) {
+ if (!getData().get(i).equals(other.getData().get(i)).getData()) {
+ found = true;
+ break;
+ }
+ return new BooleanDatatype(found);
+ }
+ case Nada:
+ return new BooleanDatatype(false);
+ }
+ return null;
+ }
+
+ @Override
public Datatype add(Datatype other) throws TunkkiError {
switch (other.getType()) {
case List:
diff --git a/src/main/com/jantuomi/tunkki/core/parser/datatype/NadaDatatype.java b/src/main/com/jantuomi/tunkki/core/parser/datatype/NadaDatatype.java
index e2827f8..56c91b6 100644
--- a/src/main/com/jantuomi/tunkki/core/parser/datatype/NadaDatatype.java
+++ b/src/main/com/jantuomi/tunkki/core/parser/datatype/NadaDatatype.java
@@ -40,6 +40,14 @@ public class NadaDatatype extends Datatype<Integer> {
return null;
}
+ @Override
+ public BooleanDatatype equals(Datatype<Integer> other) throws TunkkiError {
+ if (other.getType() == Type.Nada) {
+ return new BooleanDatatype(true);
+ }
+ return new BooleanDatatype(false);
+ }
+
private void doOperation() throws TunkkiError {
throw new TunkkiError(TunkkiError.ExceptionType.NadaError, -1);
}
diff --git a/src/main/com/jantuomi/tunkki/core/parser/datatype/StringDatatype.java b/src/main/com/jantuomi/tunkki/core/parser/datatype/StringDatatype.java
index 8a744a4..80dd527 100644
--- a/src/main/com/jantuomi/tunkki/core/parser/datatype/StringDatatype.java
+++ b/src/main/com/jantuomi/tunkki/core/parser/datatype/StringDatatype.java
@@ -43,4 +43,15 @@ public class StringDatatype extends Datatype<String> {
public Datatype<String> divide(Datatype<String> other) throws TunkkiError {
return null;
}
+
+ @Override
+ public BooleanDatatype equals(Datatype<String> other) throws TunkkiError {
+ switch (other.getType()) {
+ case String:
+ return new BooleanDatatype(getData().equals(other.getData()));
+ case Nada:
+ return new BooleanDatatype(false);
+ }
+ return null;
+ }
}
diff --git a/src/main/com/jantuomi/tunkki/core/parser/datatype/VoidDatatype.java b/src/main/com/jantuomi/tunkki/core/parser/datatype/VoidDatatype.java
index 4a25c64..a65f6aa 100644
--- a/src/main/com/jantuomi/tunkki/core/parser/datatype/VoidDatatype.java
+++ b/src/main/com/jantuomi/tunkki/core/parser/datatype/VoidDatatype.java
@@ -36,4 +36,9 @@ public class VoidDatatype extends Datatype<Integer> {
public Datatype<Integer> divide(Datatype<Integer> other) throws TunkkiError {
return null;
}
+
+ @Override
+ public BooleanDatatype equals(Datatype<Integer> other) throws TunkkiError {
+ return new BooleanDatatype(false);
+ }
}
diff --git a/src/main/com/jantuomi/tunkki/core/runtime/builtins/BuiltinManager.java b/src/main/com/jantuomi/tunkki/core/runtime/builtins/BuiltinManager.java
index 298fe55..c902f44 100644
--- a/src/main/com/jantuomi/tunkki/core/runtime/builtins/BuiltinManager.java
+++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/BuiltinManager.java
@@ -28,6 +28,7 @@ public class BuiltinManager {
new ListBuiltinFunction();
new ContainsBuiltinFunction();
new GetBuiltinFunction();
+ new EqualsBuiltinFunction();
}
public void addBuiltin(BuiltinFunction func) {
diff --git a/src/main/com/jantuomi/tunkki/core/runtime/builtins/ContainsBuiltinFunction.java b/src/main/com/jantuomi/tunkki/core/runtime/builtins/ContainsBuiltinFunction.java
index 2be4780..256340a 100644
--- a/src/main/com/jantuomi/tunkki/core/runtime/builtins/ContainsBuiltinFunction.java
+++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/ContainsBuiltinFunction.java
@@ -30,7 +30,7 @@ public class ContainsBuiltinFunction extends BuiltinFunction {
Datatype comp = params.get(1);
for (Datatype elem : list.getData()) {
- if (elem.equals(comp)) {
+ if (elem.equals(comp).getData()) {
return new BooleanDatatype(true);
}
}
diff --git a/src/main/com/jantuomi/tunkki/core/runtime/builtins/EqualsBuiltinFunction.java b/src/main/com/jantuomi/tunkki/core/runtime/builtins/EqualsBuiltinFunction.java
new file mode 100644
index 0000000..6b1ed1a
--- /dev/null
+++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/EqualsBuiltinFunction.java
@@ -0,0 +1,33 @@
+package com.jantuomi.tunkki.core.runtime.builtins;
+
+import com.jantuomi.tunkki.core.parser.datatype.BooleanDatatype;
+import com.jantuomi.tunkki.core.parser.datatype.Datatype;
+import com.jantuomi.tunkki.exception.TunkkiError;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Created by jan on 31.7.2016.
+ */
+public class EqualsBuiltinFunction extends BuiltinFunction {
+ public EqualsBuiltinFunction() {
+ super(Arrays.asList("lhs", "rhs"));
+ }
+
+ @Override
+ public Datatype evaluate(List<Datatype> params) throws TunkkiError {
+ if (params.size() != 2) {
+ throw new TunkkiError(TunkkiError.ExceptionType.FunctionArgumentError, -1, getName(), Datatype.toString(params));
+ }
+
+ return new BooleanDatatype(
+ params.get(0).equals(params.get(1)).getData()
+ );
+ }
+
+ @Override
+ public String getName() {
+ return "eq";
+ }
+}