summaryrefslogtreecommitdiffstats
path: root/vespajlib
diff options
context:
space:
mode:
Diffstat (limited to 'vespajlib')
-rw-r--r--vespajlib/src/main/java/com/yahoo/collections/AbstractFilteringList.java6
-rw-r--r--vespajlib/src/main/java/com/yahoo/collections/CopyOnWriteHashMap.java2
-rw-r--r--vespajlib/src/main/java/com/yahoo/slime/ArrayValue.java20
-rw-r--r--vespajlib/src/main/java/com/yahoo/slime/BufferedOutput.java5
-rw-r--r--vespajlib/src/main/java/com/yahoo/slime/JsonDecoder.java47
5 files changed, 45 insertions, 35 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/collections/AbstractFilteringList.java b/vespajlib/src/main/java/com/yahoo/collections/AbstractFilteringList.java
index 2b7f4027fbc..11489288eae 100644
--- a/vespajlib/src/main/java/com/yahoo/collections/AbstractFilteringList.java
+++ b/vespajlib/src/main/java/com/yahoo/collections/AbstractFilteringList.java
@@ -13,6 +13,7 @@ import java.util.Map;
import java.util.Optional;
import java.util.Random;
import java.util.Set;
+import java.util.Spliterator;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Predicate;
@@ -112,6 +113,11 @@ public abstract class AbstractFilteringList<Type, ListType extends AbstractFilte
return items.iterator();
}
+ @Override
+ public Spliterator<Type> spliterator() {
+ return items.spliterator();
+ }
+
/** Returns the items in this shuffled using random as source of randomness */
public final ListType shuffle(Random random) {
ArrayList<Type> shuffled = new ArrayList<>(items);
diff --git a/vespajlib/src/main/java/com/yahoo/collections/CopyOnWriteHashMap.java b/vespajlib/src/main/java/com/yahoo/collections/CopyOnWriteHashMap.java
index 857b7cc6acd..98370a8735a 100644
--- a/vespajlib/src/main/java/com/yahoo/collections/CopyOnWriteHashMap.java
+++ b/vespajlib/src/main/java/com/yahoo/collections/CopyOnWriteHashMap.java
@@ -9,7 +9,7 @@ import java.util.Map;
import java.util.Set;
/**
- * A hashmap wrapper which defers cloning of the enclosed map until it is written.
+ * A hashmap wrapper which defers cloning of the enclosed map until it is written to.
* Use this to make clones cheap in maps which are often not further modified.
* <p>
* As with regular maps, this can only be used safely if the content of the map is immutable.
diff --git a/vespajlib/src/main/java/com/yahoo/slime/ArrayValue.java b/vespajlib/src/main/java/com/yahoo/slime/ArrayValue.java
index c8a7f2253bb..ac1a33eea0d 100644
--- a/vespajlib/src/main/java/com/yahoo/slime/ArrayValue.java
+++ b/vespajlib/src/main/java/com/yahoo/slime/ArrayValue.java
@@ -1,7 +1,6 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.slime;
-
final class ArrayValue extends Value {
private int capacity = 16;
@@ -10,16 +9,16 @@ final class ArrayValue extends Value {
private final SymbolTable names;
public ArrayValue(SymbolTable names) { this.names = names; }
- public final Type type() { return Type.ARRAY; }
- public final int children() { return used; }
- public final int entries() { return used; }
- public final Value entry(int index) {
+ public Type type() { return Type.ARRAY; }
+ public int children() { return used; }
+ public int entries() { return used; }
+ public Value entry(int index) {
return (index < used) ? values[index] : NixValue.invalid();
}
- public final void accept(Visitor v) { v.visitArray(this); }
+ public void accept(Visitor v) { v.visitArray(this); }
- public final void traverse(ArrayTraverser at) {
+ public void traverse(ArrayTraverser at) {
for (int i = 0; i < used; i++) {
at.entry(i, values[i]);
}
@@ -32,7 +31,7 @@ final class ArrayValue extends Value {
System.arraycopy(v, 0, values, 0, used);
}
- protected final Value addLeaf(Value value) {
+ protected Value addLeaf(Value value) {
if (used == capacity) {
grow();
}
@@ -40,6 +39,7 @@ final class ArrayValue extends Value {
return value;
}
- public final Value addArray() { return addLeaf(new ArrayValue(names)); }
- public final Value addObject() { return addLeaf(new ObjectValue(names)); }
+ public Value addArray() { return addLeaf(new ArrayValue(names)); }
+ public Value addObject() { return addLeaf(new ObjectValue(names)); }
+
}
diff --git a/vespajlib/src/main/java/com/yahoo/slime/BufferedOutput.java b/vespajlib/src/main/java/com/yahoo/slime/BufferedOutput.java
index 0fabea77df0..4c76abd4707 100644
--- a/vespajlib/src/main/java/com/yahoo/slime/BufferedOutput.java
+++ b/vespajlib/src/main/java/com/yahoo/slime/BufferedOutput.java
@@ -3,6 +3,8 @@ package com.yahoo.slime;
import com.yahoo.compress.Compressor;
+import java.nio.charset.Charset;
+
final class BufferedOutput {
private byte[] buf;
@@ -56,6 +58,9 @@ final class BufferedOutput {
System.arraycopy(buf, 0, ret, 0, pos);
return ret;
}
+ public String toString(Charset charset) {
+ return new String(buf, 0, pos, charset);
+ }
Compressor.Compression compress(Compressor compressor) {
return compressor.compress(buf, pos);
}
diff --git a/vespajlib/src/main/java/com/yahoo/slime/JsonDecoder.java b/vespajlib/src/main/java/com/yahoo/slime/JsonDecoder.java
index b7f11f53cd5..682eccdab42 100644
--- a/vespajlib/src/main/java/com/yahoo/slime/JsonDecoder.java
+++ b/vespajlib/src/main/java/com/yahoo/slime/JsonDecoder.java
@@ -2,10 +2,9 @@
package com.yahoo.slime;
import com.yahoo.text.Text;
-import com.yahoo.text.Utf8;
-import java.io.ByteArrayOutputStream;
import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
/**
* A port of the C++ json decoder intended to be fast.
@@ -20,7 +19,7 @@ public class JsonDecoder {
private final SlimeInserter slimeInserter = new SlimeInserter(null);
private final ArrayInserter arrayInserter = new ArrayInserter(null);
private final ObjectInserter objectInserter = new ObjectInserter(null, null);
- private final ByteArrayOutputStream buf = new ByteArrayOutputStream();
+ private final BufferedOutput buf = new BufferedOutput();
private static final byte[] TRUE = {'t', 'r', 'u', 'e'};
private static final byte[] FALSE = {'f', 'a', 'l', 's', 'e'};
@@ -86,15 +85,15 @@ public class JsonDecoder {
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
case '+': case '-':
- buf.write(c);
+ buf.put(c);
next();
break;
default:
if (likelyFloatingPoint) {
- double num = Double.parseDouble(Utf8.toString(buf.toByteArray()));
+ double num = Double.parseDouble(buf.toString(StandardCharsets.UTF_8));
inserter.insertDOUBLE(num);
} else {
- long num = Long.parseLong(Utf8.toString(buf.toByteArray()));
+ long num = Long.parseLong(buf.toString(StandardCharsets.UTF_8));
inserter.insertLONG(num);
}
return;
@@ -103,8 +102,8 @@ public class JsonDecoder {
}
private void expect(byte[] expected) {
- for (int i = 0; i < expected.length; i++) {
- if ( ! skip(expected[i])) {
+ for (byte b : expected) {
+ if ( ! skip(b)) {
in.fail("Unexpected " + characterToReadableString(c));
return;
}
@@ -150,9 +149,9 @@ public class JsonDecoder {
default:
for (;;) {
switch (c) {
- case ':': case ' ': case '\t': case '\n': case '\r': case '\0': return Utf8.toString(buf.toByteArray());
+ case ':': case ' ': case '\t': case '\n': case '\r': case '\0': return buf.toString(StandardCharsets.UTF_8);
default:
- buf.write(c);
+ buf.put(c);
next();
break;
}
@@ -176,13 +175,13 @@ public class JsonDecoder {
next();
switch (c) {
case '"': case '\\': case '/': case '\'':
- buf.write(c);
+ buf.put(c);
break;
- case 'b': buf.write((byte) '\b'); break;
- case 'f': buf.write((byte) '\f'); break;
- case 'n': buf.write((byte) '\n'); break;
- case 'r': buf.write((byte) '\r'); break;
- case 't': buf.write((byte) '\t'); break;
+ case 'b': buf.put((byte) '\b'); break;
+ case 'f': buf.put((byte) '\f'); break;
+ case 'n': buf.put((byte) '\n'); break;
+ case 'r': buf.put((byte) '\r'); break;
+ case 't': buf.put((byte) '\t'); break;
case 'u': writeUtf8(dequoteUtf16(), buf, 0xffffff80); continue;
default:
in.fail("Invalid quoted char(" + c + ")");
@@ -193,34 +192,34 @@ public class JsonDecoder {
case '"': case '\'':
if (c == quote) {
next();
- return Utf8.toString(buf.toByteArray());
+ return buf.toString(StandardCharsets.UTF_8);
} else {
- buf.write(c);
+ buf.put(c);
next();
}
break;
case '\0':
in.fail("Unterminated string");
- return Utf8.toString(buf.toByteArray());
+ return buf.toString(StandardCharsets.UTF_8);
default:
- buf.write(c);
+ buf.put(c);
next();
break;
}
}
}
- private static void writeUtf8(long codepoint, ByteArrayOutputStream buf, long mask) {
+ private static void writeUtf8(long codepoint, BufferedOutput buf, long mask) {
if ((codepoint & mask) == 0) {
- buf.write((byte) ((mask << 1) | codepoint));
+ buf.put((byte) ((mask << 1) | codepoint));
} else {
writeUtf8(codepoint >> 6, buf, mask >> (2 - ((mask >> 6) & 0x1)));
- buf.write((byte) (0x80 | (codepoint & 0x3f)));
+ buf.put((byte) (0x80 | (codepoint & 0x3f)));
}
}
- private static byte[] unicodeStart = {'\\', 'u'};
+ private final static byte[] unicodeStart = {'\\', 'u'};
private long dequoteUtf16() {
next();
long codepoint = readHexValue(4);