multi-segment readers

This commit is contained in:
David Renshaw 2014-06-17 21:06:50 -04:00
parent 1689a743d2
commit fdfcbd0427
7 changed files with 63 additions and 8 deletions

View file

@ -12,6 +12,7 @@ class EncodingSuite extends FunSuite {
val allTypes = message.initRoot(TestAllTypes.Builder.factory);
TestUtil.initTestMessage(allTypes);
TestUtil.checkTestMessage(allTypes);
//TestUtil.checkTestMessage(allTypes.asReader());
}
test("AllTypesMultiSegment") {

View file

@ -89,4 +89,44 @@ object TestUtil {
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);
}
}

View file

@ -33,7 +33,7 @@ public final class BuilderArena implements Arena {
}
public SegmentReader tryGetSegment(int id) {
throw new Error("unimplemented");
return this.segments.get(id);
}
public SegmentBuilder getSegment(int id) {
return this.segments.get(id);

View file

@ -4,7 +4,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Vector;
import java.util.ArrayList;
public final class InputStreamMessageReader {
@ -47,7 +47,7 @@ public final class InputStreamMessageReader {
}
// in words
Vector<Integer> moreSizes = new Vector<Integer>();
ArrayList<Integer> moreSizes = new ArrayList<Integer>();
if (segmentCount > 1) {
ByteBuffer moreSizesRaw = makeByteBuffer(readExact(is, 4 * (segmentCount & ~1)));

View file

@ -3,14 +3,14 @@ package org.capnproto;
import java.nio.ByteBuffer;
public final class MessageReader {
final ByteBuffer[] segmentSlices;
final ReaderArena arena;
public MessageReader(ByteBuffer[] segmentSlices) {
this.segmentSlices = segmentSlices;
this.arena = new ReaderArena(segmentSlices);
}
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,
0x7fffffff /* XXX */);
AnyPointer.Reader any = new AnyPointer.Reader(pointerReader);

View file

@ -1,7 +1,20 @@
package org.capnproto;
import java.util.ArrayList;
import java.nio.ByteBuffer;
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) {
throw new Error("unimplemented");
return segments.get(id);
}
}

View file

@ -13,7 +13,8 @@ class LayoutSuite extends FunSuite {
val buffer = java.nio.ByteBuffer.wrap(data);
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();
assert(reader.getLongField(0) === 0xefcdab8967452301L);