diff options
Diffstat (limited to 'vespajlib')
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); |