multi-segment readers
This commit is contained in:
parent
1689a743d2
commit
fdfcbd0427
7 changed files with 63 additions and 8 deletions
|
@ -12,6 +12,7 @@ class EncodingSuite extends FunSuite {
|
||||||
val allTypes = message.initRoot(TestAllTypes.Builder.factory);
|
val allTypes = message.initRoot(TestAllTypes.Builder.factory);
|
||||||
TestUtil.initTestMessage(allTypes);
|
TestUtil.initTestMessage(allTypes);
|
||||||
TestUtil.checkTestMessage(allTypes);
|
TestUtil.checkTestMessage(allTypes);
|
||||||
|
//TestUtil.checkTestMessage(allTypes.asReader());
|
||||||
}
|
}
|
||||||
|
|
||||||
test("AllTypesMultiSegment") {
|
test("AllTypesMultiSegment") {
|
||||||
|
|
|
@ -89,4 +89,44 @@ object TestUtil {
|
||||||
assert(builder.getVoidList().size() == 6);
|
assert(builder.getVoidList().size() == 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def checkTestMessage(reader : TestAllTypes.Reader) {
|
||||||
|
reader.getVoidField();
|
||||||
|
assert(reader.getBoolField() == true);
|
||||||
|
assert(reader.getInt8Field() == -123);
|
||||||
|
assert(reader.getInt16Field() == -12345);
|
||||||
|
assert(reader.getInt32Field() == -12345678);
|
||||||
|
assert(reader.getInt64Field() == -123456789012345L);
|
||||||
|
assert(reader.getUInt8Field() == 0xef.toByte);
|
||||||
|
assert(reader.getUInt16Field() == 0x4567);
|
||||||
|
assert(reader.getUInt32Field() == 0x34567890);
|
||||||
|
assert(reader.getUInt64Field() == 0x1234567890123456L);
|
||||||
|
assert(reader.getFloat32Field() == 1234.5f);
|
||||||
|
assert(reader.getFloat64Field() == -123e45);
|
||||||
|
assert(reader.getTextField().toString() == "foo");
|
||||||
|
|
||||||
|
{
|
||||||
|
val subReader = reader.getStructField();
|
||||||
|
subReader.getVoidField();
|
||||||
|
assert(subReader.getBoolField() == true);
|
||||||
|
assert(subReader.getInt8Field() == -12);
|
||||||
|
assert(subReader.getInt16Field() == 3456);
|
||||||
|
assert(subReader.getInt32Field() == -78901234);
|
||||||
|
assert(subReader.getInt64Field() == 56789012345678L);
|
||||||
|
assert(subReader.getUInt8Field() == 90);
|
||||||
|
assert(subReader.getUInt16Field() == 1234);
|
||||||
|
assert(subReader.getUInt32Field() == 56789012);
|
||||||
|
assert(subReader.getUInt64Field() == 345678901234567890L);
|
||||||
|
assert(subReader.getFloat32Field() == -1.25e-10f);
|
||||||
|
assert(subReader.getFloat64Field() == 345);
|
||||||
|
|
||||||
|
{
|
||||||
|
val subSubReader = subReader.getStructField();
|
||||||
|
assert(subSubReader.getTextField().toString() == "nested")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(reader.getVoidList().size() == 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ public final class BuilderArena implements Arena {
|
||||||
}
|
}
|
||||||
|
|
||||||
public SegmentReader tryGetSegment(int id) {
|
public SegmentReader tryGetSegment(int id) {
|
||||||
throw new Error("unimplemented");
|
return this.segments.get(id);
|
||||||
}
|
}
|
||||||
public SegmentBuilder getSegment(int id) {
|
public SegmentBuilder getSegment(int id) {
|
||||||
return this.segments.get(id);
|
return this.segments.get(id);
|
||||||
|
|
|
@ -4,7 +4,7 @@ import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.nio.ByteOrder;
|
import java.nio.ByteOrder;
|
||||||
import java.util.Vector;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public final class InputStreamMessageReader {
|
public final class InputStreamMessageReader {
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ public final class InputStreamMessageReader {
|
||||||
}
|
}
|
||||||
|
|
||||||
// in words
|
// in words
|
||||||
Vector<Integer> moreSizes = new Vector<Integer>();
|
ArrayList<Integer> moreSizes = new ArrayList<Integer>();
|
||||||
|
|
||||||
if (segmentCount > 1) {
|
if (segmentCount > 1) {
|
||||||
ByteBuffer moreSizesRaw = makeByteBuffer(readExact(is, 4 * (segmentCount & ~1)));
|
ByteBuffer moreSizesRaw = makeByteBuffer(readExact(is, 4 * (segmentCount & ~1)));
|
||||||
|
|
|
@ -3,14 +3,14 @@ package org.capnproto;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
public final class MessageReader {
|
public final class MessageReader {
|
||||||
final ByteBuffer[] segmentSlices;
|
final ReaderArena arena;
|
||||||
|
|
||||||
public MessageReader(ByteBuffer[] segmentSlices) {
|
public MessageReader(ByteBuffer[] segmentSlices) {
|
||||||
this.segmentSlices = segmentSlices;
|
this.arena = new ReaderArena(segmentSlices);
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T> T getRoot(FromStructReader<T> factory) {
|
public <T> T getRoot(FromStructReader<T> factory) {
|
||||||
SegmentReader segment = new SegmentReader(this.segmentSlices[0], new ReaderArena());
|
SegmentReader segment = this.arena.tryGetSegment(0);
|
||||||
PointerReader pointerReader = PointerReader.getRoot(segment, 0,
|
PointerReader pointerReader = PointerReader.getRoot(segment, 0,
|
||||||
0x7fffffff /* XXX */);
|
0x7fffffff /* XXX */);
|
||||||
AnyPointer.Reader any = new AnyPointer.Reader(pointerReader);
|
AnyPointer.Reader any = new AnyPointer.Reader(pointerReader);
|
||||||
|
|
|
@ -1,7 +1,20 @@
|
||||||
package org.capnproto;
|
package org.capnproto;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
public final class ReaderArena implements Arena {
|
public final class ReaderArena implements Arena {
|
||||||
|
|
||||||
|
public final ArrayList<SegmentReader> segments;
|
||||||
|
|
||||||
|
public ReaderArena(ByteBuffer[] segmentSlices) {
|
||||||
|
this.segments = new ArrayList<SegmentReader>();
|
||||||
|
for(int ii = 0; ii < segmentSlices.length; ++ii) {
|
||||||
|
this.segments.add(new SegmentReader(segmentSlices[ii], this));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public SegmentReader tryGetSegment(int id) {
|
public SegmentReader tryGetSegment(int id) {
|
||||||
throw new Error("unimplemented");
|
return segments.get(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,8 @@ class LayoutSuite extends FunSuite {
|
||||||
val buffer = java.nio.ByteBuffer.wrap(data);
|
val buffer = java.nio.ByteBuffer.wrap(data);
|
||||||
buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN);
|
buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN);
|
||||||
|
|
||||||
val pointerReader = new PointerReader(new SegmentReader(buffer, new ReaderArena()), 0, 0x7fffffff);
|
val arena = new ReaderArena(Array(buffer));
|
||||||
|
val pointerReader = new PointerReader(arena.tryGetSegment(0), 0, 0x7fffffff);
|
||||||
val reader = pointerReader.getStruct();
|
val reader = pointerReader.getStruct();
|
||||||
|
|
||||||
assert(reader.getLongField(0) === 0xefcdab8967452301L);
|
assert(reader.getLongField(0) === 0xefcdab8967452301L);
|
||||||
|
|
Loading…
Reference in a new issue