aboutsummaryrefslogtreecommitdiffstats
path: root/vespajlib/src/main
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@yahooinc.com>2023-03-22 15:46:11 +0000
committerHåvard Pettersen <havardpe@yahooinc.com>2023-03-22 15:46:11 +0000
commitfc57b86eb4c5f7d2b40c4da892cf799686598dc2 (patch)
tree0606fcf4655095df91f7141ec453fd5fb8fec45c /vespajlib/src/main
parent5a78d21b77d9dc70896182a83d29e855214514b3 (diff)
move Inspector equalTo implementation and test
Diffstat (limited to 'vespajlib/src/main')
-rw-r--r--vespajlib/src/main/java/com/yahoo/slime/Inspector.java2
-rw-r--r--vespajlib/src/main/java/com/yahoo/slime/SlimeUtils.java78
-rw-r--r--vespajlib/src/main/java/com/yahoo/slime/Value.java80
3 files changed, 79 insertions, 81 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/slime/Inspector.java b/vespajlib/src/main/java/com/yahoo/slime/Inspector.java
index 948a810a39e..b52d0f0272c 100644
--- a/vespajlib/src/main/java/com/yahoo/slime/Inspector.java
+++ b/vespajlib/src/main/java/com/yahoo/slime/Inspector.java
@@ -144,5 +144,5 @@ public interface Inspector {
* @param that inspector.
* @return true if they are equal.
*/
- boolean equalTo(Inspector that);
+ default boolean equalTo(Inspector that) { return SlimeUtils.equalTo(this, that); }
}
diff --git a/vespajlib/src/main/java/com/yahoo/slime/SlimeUtils.java b/vespajlib/src/main/java/com/yahoo/slime/SlimeUtils.java
index 970c71abb8a..f9230ab6df6 100644
--- a/vespajlib/src/main/java/com/yahoo/slime/SlimeUtils.java
+++ b/vespajlib/src/main/java/com/yahoo/slime/SlimeUtils.java
@@ -6,6 +6,7 @@ import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.time.Instant;
+import java.util.Arrays;
import java.util.Iterator;
import java.util.Optional;
import java.util.OptionalDouble;
@@ -165,4 +166,81 @@ public class SlimeUtils {
false);
}
+ private static class Equal {
+ protected final Inspector rhsInspector;
+
+ protected boolean equal = true;
+
+ public Equal(Inspector rhsInspector) { this.rhsInspector = rhsInspector; }
+
+ public boolean isEqual() { return equal; }
+ }
+
+ private static class EqualArray extends Equal implements ArrayTraverser {
+ public EqualArray(Inspector rhsInspector) { super(rhsInspector); }
+
+ @Override
+ public void entry(int idx, Inspector inspector) {
+ if (equal) {
+ equal = inspector.equalTo(rhsInspector.entry(idx));
+ }
+ }
+ }
+
+ private static class EqualObject extends Equal implements ObjectTraverser {
+ public EqualObject(Inspector rhsInspector) { super(rhsInspector); }
+
+ @Override
+ public void field(String name, Inspector inspector) {
+ if (equal) {
+ equal = inspector.equalTo(rhsInspector.field(name));
+ }
+ }
+ }
+
+ public static boolean equalTo(Inspector a, Inspector b) {
+ boolean equal = a.type() == b.type();
+
+ if (equal) {
+ switch (a.type()) {
+ case NIX:
+ equal = a.valid() == b.valid();
+ break;
+ case BOOL:
+ equal = a.asBool() == b.asBool();
+ break;
+ case LONG:
+ equal = a.asLong() == b.asLong();
+ break;
+ case DOUBLE:
+ equal = Double.compare(a.asDouble(), b.asDouble()) == 0;
+ break;
+ case STRING:
+ equal = a.asString().equals(b.asString());
+ break;
+ case DATA:
+ equal = Arrays.equals(a.asData(), b.asData());
+ break;
+ case ARRAY:
+ {
+ var traverser = new EqualArray(b);
+ a.traverse(traverser);
+ equal = traverser.isEqual() && (a.entries() == b.entries());
+ }
+ break;
+ case OBJECT:
+ {
+ var traverser = new EqualObject(b);
+ a.traverse(traverser);
+ equal = traverser.isEqual() && (a.fields() == b.fields());
+ }
+ break;
+ default:
+ assert(false);
+ break;
+ }
+ }
+
+ return equal;
+ }
}
diff --git a/vespajlib/src/main/java/com/yahoo/slime/Value.java b/vespajlib/src/main/java/com/yahoo/slime/Value.java
index 985fed6c6bb..1943e77663f 100644
--- a/vespajlib/src/main/java/com/yahoo/slime/Value.java
+++ b/vespajlib/src/main/java/com/yahoo/slime/Value.java
@@ -2,7 +2,6 @@
package com.yahoo.slime;
import java.io.ByteArrayOutputStream;
-import java.util.Arrays;
import java.util.function.Consumer;
/**
@@ -91,83 +90,4 @@ abstract class Value implements Cursor {
return "null";
}
}
-
- private static class Equal {
- protected final Inspector rhsInspector;
-
- protected boolean equal = true;
-
- public Equal(Inspector rhsInspector) { this.rhsInspector = rhsInspector; }
-
- public boolean isEqual() { return equal; }
- }
-
- private static class EqualArray extends Equal implements ArrayTraverser {
- public EqualArray(Inspector rhsInspector) { super(rhsInspector); }
-
- @Override
- public void entry(int idx, Inspector inspector) {
- if (equal) {
- equal = inspector.equalTo(rhsInspector.entry(idx));
- }
- }
- }
-
- private static class EqualObject extends Equal implements ObjectTraverser {
- public EqualObject(Inspector rhsInspector) { super(rhsInspector); }
-
- @Override
- public void field(String name, Inspector inspector) {
- if (equal) {
- equal = inspector.equalTo(rhsInspector.field(name));
- }
- }
- }
-
- @Override
- public boolean equalTo(Inspector that) {
- boolean equal = type() == that.type();
-
- if (equal) {
- switch (type()) {
- case NIX:
- equal = valid() == that.valid();
- break;
- case BOOL:
- equal = asBool() == that.asBool();
- break;
- case LONG:
- equal = asLong() == that.asLong();
- break;
- case DOUBLE:
- equal = Double.compare(asDouble(), that.asDouble()) == 0;
- break;
- case STRING:
- equal = asString().equals(that.asString());
- break;
- case DATA:
- equal = Arrays.equals(asData(), that.asData());
- break;
- case ARRAY:
- {
- var traverser = new EqualArray(that);
- traverse(traverser);
- equal = traverser.isEqual() && (entries() == that.entries());
- }
- break;
- case OBJECT:
- {
- var traverser = new EqualObject(that);
- traverse(traverser);
- equal = traverser.isEqual() && (fields() == that.fields());
- }
- break;
- default:
- assert(false);
- break;
- }
- }
-
- return equal;
- }
}