diff --git a/compiler/src/test/scala/org/capnproto/EncodingSuite.scala b/compiler/src/test/scala/org/capnproto/EncodingSuite.scala index 264ac5a..1c05e17 100644 --- a/compiler/src/test/scala/org/capnproto/EncodingSuite.scala +++ b/compiler/src/test/scala/org/capnproto/EncodingSuite.scala @@ -563,6 +563,32 @@ class EncodingSuite extends FunSuite { } } + test("StructSetters") { + val builder = new MessageBuilder() + val root = builder.initRoot(TestAllTypes.factory) + TestUtil.initTestMessage(root) + + { + val builder2 = new MessageBuilder() + builder2.setRoot(TestAllTypes.factory, root.asReader()) + TestUtil.checkTestMessage(builder2.getRoot(TestAllTypes.factory)) + } + + { + val builder2 = new MessageBuilder() + val root2 = builder2.getRoot(TestAllTypes.factory) + root2.setStructField(root.asReader()) + TestUtil.checkTestMessage(root2.getStructField()) + } + + { + val builder2 = new MessageBuilder() + val root2 = builder2.getRoot(TestAnyPointer.factory) + root2.getAnyPointerField().setAs(TestAllTypes.factory, root.asReader()) + TestUtil.checkTestMessage(root2.getAnyPointerField.getAs(TestAllTypes.factory)) + } + } + // to debug, do this: //Serialize.write((new java.io.FileOutputStream("/Users/dwrensha/Desktop/test.dat")).getChannel(), diff --git a/runtime/src/main/java/org/capnproto/MessageBuilder.java b/runtime/src/main/java/org/capnproto/MessageBuilder.java index d8ec266..e384734 100644 --- a/runtime/src/main/java/org/capnproto/MessageBuilder.java +++ b/runtime/src/main/java/org/capnproto/MessageBuilder.java @@ -40,11 +40,7 @@ public final class MessageBuilder { allocationStrategy); } - public T getRoot(StructBuilder.Factory factory) { - throw new Error("unimplemented"); - } - - public T initRoot(FromPointerBuilder factory) { + private AnyPointer.Builder getRootInternal() { SegmentBuilder rootSegment = this.arena.segments.get(0); if (rootSegment.currentSize() == 0) { int location = rootSegment.allocate(1); @@ -54,12 +50,24 @@ public final class MessageBuilder { if (location != 0) { throw new Error("First allocated word of new segment was not at offset 0"); } - return factory.initFromPointerBuilder(rootSegment, location, 0); + return new AnyPointer.Builder(rootSegment, location); } else { - return factory.initFromPointerBuilder(rootSegment, 0, 0); + return new AnyPointer.Builder(rootSegment, 0); } } + public T getRoot(FromPointerBuilder factory) { + return this.getRootInternal().getAs(factory); + } + + public void setRoot(SetPointerBuilder factory, U reader) { + this.getRootInternal().setAs(factory, reader); + } + + public T initRoot(FromPointerBuilder factory) { + return this.getRootInternal().initAs(factory); + } + public final java.nio.ByteBuffer[] getSegmentsForOutput() { return this.arena.getSegmentsForOutput(); }