diff --git a/runtime/src/main/java/org/capnproto/StructBuilder.java b/runtime/src/main/java/org/capnproto/StructBuilder.java index c8d6cc9..214a257 100644 --- a/runtime/src/main/java/org/capnproto/StructBuilder.java +++ b/runtime/src/main/java/org/capnproto/StructBuilder.java @@ -2,7 +2,7 @@ package org.capnproto; public final class StructBuilder { public final SegmentBuilder segment; - public final int data; //byte offset to data section + public final int data; // byte offset to data section public final int pointers; // word offset of pointer section public final int dataSize; // in bits public final short pointerCount; @@ -19,7 +19,31 @@ public final class StructBuilder { this.bit0Offset = bit0Offset; } - public final int getShortField(int offset) { + public final boolean getBoolField(int offset) { + int bitOffset = (offset == 0 ? this.bit0Offset : offset); + int position = this.data + (bitOffset / 8); + return (this.segment.buffer.get(position) & (1 << (bitOffset % 8))) != 0; + } + + public final void setBoolField(int offset, boolean value) { + int bitOffset = offset; + if (offset == 0) { bitOffset = this.bit0Offset; } + byte bitnum = (byte)(bitOffset % 8); + int position = this.data + (bitOffset / 8); + byte oldValue = this.segment.buffer.get(position); + this.segment.buffer.put(position, + (byte)((oldValue & (~(1 << bitnum))) | (( value ? 1 : 0) << bitnum))); + } + + public final byte getByteField(int offset) { + return this.segment.buffer.get(this.data + offset); + } + + public final void setByteField(int offset, byte value) { + this.segment.buffer.put(this.data + offset, value); + } + + public final short getShortField(int offset) { return this.segment.buffer.getShort(this.data + offset * 2); } @@ -35,6 +59,14 @@ public final class StructBuilder { this.segment.buffer.putInt(this.data + offset * 4, value); } + public final long getLongField(int offset) { + return this.segment.buffer.getLong(this.data + offset * 8); + } + + public final void setLongField(int offset, long value) { + this.segment.buffer.putLong(this.data + offset * 8, value); + } + public final PointerBuilder getPointerField(int index) { return new PointerBuilder(this.segment, this.pointers + index); } diff --git a/runtime/src/test/scala/org/capnproto/LayoutTest.scala b/runtime/src/test/scala/org/capnproto/LayoutTest.scala index de65ae0..896afbb 100644 --- a/runtime/src/test/scala/org/capnproto/LayoutTest.scala +++ b/runtime/src/test/scala/org/capnproto/LayoutTest.scala @@ -56,9 +56,46 @@ class ExampleSuite extends FunSuite { } + def setupStruct(builder : StructBuilder) = { + builder.setLongField(0, 0x1011121314151617L); + builder.setIntField(2, 0x20212223); + builder.setShortField(6, 0x3031.toShort); + builder.setByteField(14, 0x40); + builder.setBoolField(120, false); + builder.setBoolField(121, false); + builder.setBoolField(122, true); + builder.setBoolField(123, false); + builder.setBoolField(124, true); + builder.setBoolField(125, true); + builder.setBoolField(126, true); + builder.setBoolField(127, false); + } + + def checkStruct(builder : StructBuilder) { + assert(0x1011121314151617L === builder.getLongField(0)); + assert(0x20212223 == builder.getIntField(2)); + assert(0x3031 === builder.getShortField(6)); + assert(0x40 === builder.getByteField(14)); + assert(false === builder.getBoolField(120)); + assert(false === builder.getBoolField(121)); + assert(true === builder.getBoolField(122)); + assert(false === builder.getBoolField(123)); + assert(true === builder.getBoolField(124)); + assert(true === builder.getBoolField(125)); + assert(true === builder.getBoolField(126)); + assert(false === builder.getBoolField(127)); + } + test("StructRoundTrip_OneSegment") { - val message = new MessageBuilder(); - // ... + val buffer = java.nio.ByteBuffer.allocate(1024 * 8); + buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN); + buffer.mark(); + + val pointerBuilder = PointerBuilder.getRoot(new SegmentBuilder(buffer), 0); + val builder = pointerBuilder.initStruct(new StructSize(2, 4, FieldSize.INLINE_COMPOSITE)); + setupStruct(builder); + + checkStruct(builder); } }