diff options
Diffstat (limited to 'vespajlib/src/main/java/com/yahoo/slime/Value.java')
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/slime/Value.java | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/slime/Value.java b/vespajlib/src/main/java/com/yahoo/slime/Value.java index 51a8262333b..183c659c35a 100644 --- a/vespajlib/src/main/java/com/yahoo/slime/Value.java +++ b/vespajlib/src/main/java/com/yahoo/slime/Value.java @@ -3,6 +3,7 @@ package com.yahoo.slime; import java.io.ByteArrayOutputStream; +import java.util.Arrays; /** * Common implementation for all value types. @@ -84,4 +85,82 @@ 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: + 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; + } } |