diff options
author | Håvard Pettersen <havardpe@yahooinc.com> | 2023-03-22 15:46:11 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@yahooinc.com> | 2023-03-22 15:46:11 +0000 |
commit | fc57b86eb4c5f7d2b40c4da892cf799686598dc2 (patch) | |
tree | 0606fcf4655095df91f7141ec453fd5fb8fec45c /vespajlib/src/main | |
parent | 5a78d21b77d9dc70896182a83d29e855214514b3 (diff) |
move Inspector equalTo implementation and test
Diffstat (limited to 'vespajlib/src/main')
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/slime/Inspector.java | 2 | ||||
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/slime/SlimeUtils.java | 78 | ||||
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/slime/Value.java | 80 |
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; - } } |