From 1cef64e2dac0172161b4f1d89b3cf3d130c12b7d Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Wed, 8 Oct 2014 11:00:22 -0400 Subject: [PATCH] Text.factory, Data.factory --- compiler/src/main/cpp/capnpc-java.c++ | 19 +++++----- .../main/java/org/capnproto/AnyPointer.java | 4 +-- runtime/src/main/java/org/capnproto/Data.java | 21 +++++++++++ .../src/main/java/org/capnproto/DataList.java | 8 ++--- .../FromPointerBuilderBlobDefault.java | 6 ++++ .../FromPointerReaderBlobDefault.java | 6 ++++ .../org/capnproto/InitFromPointerBuilder.java | 2 +- .../InitSizedFromPointerBuilder.java | 2 +- .../main/java/org/capnproto/ListBuilder.java | 22 ++++++++++++ .../main/java/org/capnproto/ListFactory.java | 4 +-- .../src/main/java/org/capnproto/ListList.java | 2 +- .../main/java/org/capnproto/ListReader.java | 11 ++++++ .../java/org/capnproto/PointerBuilder.java | 36 ------------------- .../java/org/capnproto/PointerReader.java | 16 --------- .../java/org/capnproto/StructBuilder.java | 13 +++++++ .../java/org/capnproto/StructFactory.java | 4 +-- .../main/java/org/capnproto/StructList.java | 6 ++-- .../main/java/org/capnproto/StructReader.java | 18 ++++++++++ runtime/src/main/java/org/capnproto/Text.java | 22 ++++++++++++ .../src/main/java/org/capnproto/TextList.java | 8 ++--- 20 files changed, 149 insertions(+), 81 deletions(-) create mode 100644 runtime/src/main/java/org/capnproto/FromPointerBuilderBlobDefault.java create mode 100644 runtime/src/main/java/org/capnproto/FromPointerReaderBlobDefault.java diff --git a/compiler/src/main/cpp/capnpc-java.c++ b/compiler/src/main/cpp/capnpc-java.c++ index 4501dde..86b9b1b 100644 --- a/compiler/src/main/cpp/capnpc-java.c++ +++ b/compiler/src/main/cpp/capnpc-java.c++ @@ -998,19 +998,20 @@ private: spaces(indent), " }\n", spaces(indent), " public final ", type, ".Builder init", titleCase, "() {\n", unionDiscrim.set, - spaces(indent), " return ", type, ".factory.initFromPointerBuilder(", - "_getPointerField(", offset, "));\n", + spaces(indent), " return ", + "_initPointerField(", type, ".factory,", offset, ");\n", spaces(indent), " }\n"), }; } else if (kind == FieldKind::BLOB) { uint64_t typeId = field.getContainingStruct().getProto().getId(); - kj::String defaultParams = defaultOffset == 0 ? kj::str() : kj::str( + kj::String defaultParams = defaultOffset == 0 ? kj::str("null, 0, 0") : kj::str( "Schemas.b_", kj::hex(typeId), ".buffer, ", defaultOffset, ", ", defaultSize); kj::String blobKind = typeBody.which() == schema::Type::TEXT ? kj::str("Text") : kj::str("Data"); kj::String setterInputType = typeBody.which() == schema::Type::TEXT ? kj::str("String") : kj::str("byte []"); + kj::String factory = kj::str("org.capnproto.", kj::str(blobKind), ".factory"); return FieldText { kj::strTree( @@ -1022,8 +1023,8 @@ private: spaces(indent), " public ", type, ".Reader", " get", titleCase, "() {\n", - spaces(indent), " return _getPointerField(", - offset, ").get", blobKind, "(", defaultParams, ");\n", + spaces(indent), " return _getPointerField(", factory, ", ", + offset, ", ", defaultParams, ");\n", spaces(indent), " }\n", "\n"), kj::strTree( @@ -1033,8 +1034,8 @@ private: spaces(indent), " return !_getPointerField(", offset, ").isNull();\n", spaces(indent), " }\n", spaces(indent), " public final ", type, ".Builder get", titleCase, "() {\n", - spaces(indent), " return _getPointerField(", - offset, ").get", blobKind, "(", defaultParams, ");\n", + spaces(indent), " return _getPointerField(", factory, ", ", + offset, ", ", defaultParams, ");\n", spaces(indent), " }\n", spaces(indent), " public final void set", titleCase, "(", type, ".Reader value) {\n", unionDiscrim.set, @@ -1047,7 +1048,7 @@ private: spaces(indent), " }\n", spaces(indent), " public final ", type, ".Builder init", titleCase, "(int size) {\n", - spaces(indent), " return _getPointerField(", offset, ").init", blobKind, "(size);\n", + spaces(indent), " return _initSizedPointerField(", factory, ", ", offset, ", size);\n", spaces(indent), " }\n"), }; } else if (kind == FieldKind::LIST) { @@ -1090,7 +1091,7 @@ private: spaces(indent), " public final ", builderClass, " init", titleCase, "(int size) {\n", - spaces(indent), " return (", listFactory, ").initSizedFromPointerBuilder(_getPointerField(", offset, "), size);\n", + spaces(indent), " return _initSizedPointerField(", listFactory, ", ", offset, ", size);\n", spaces(indent), " }\n"), }; } else { diff --git a/runtime/src/main/java/org/capnproto/AnyPointer.java b/runtime/src/main/java/org/capnproto/AnyPointer.java index 0dd1263..41d7534 100644 --- a/runtime/src/main/java/org/capnproto/AnyPointer.java +++ b/runtime/src/main/java/org/capnproto/AnyPointer.java @@ -22,11 +22,11 @@ public final class AnyPointer { } public final T initAs(InitFromPointerBuilder factory) { - return factory.initFromPointerBuilder(this.builder); + return factory.initFromPointerBuilder(this.builder.segment, this.builder.pointer); } public final T initAs(InitSizedFromPointerBuilder factory, int elementCount) { - return factory.initSizedFromPointerBuilder(this.builder, elementCount); + return factory.initSizedFromPointerBuilder(this.builder.segment, this.builder.pointer, elementCount); } public final void clear() { diff --git a/runtime/src/main/java/org/capnproto/Data.java b/runtime/src/main/java/org/capnproto/Data.java index bdd3326..515a08e 100644 --- a/runtime/src/main/java/org/capnproto/Data.java +++ b/runtime/src/main/java/org/capnproto/Data.java @@ -3,6 +3,27 @@ package org.capnproto; import java.nio.ByteBuffer; public final class Data { + public static final class Factory implements FromPointerReaderBlobDefault, + FromPointerBuilderBlobDefault, + InitSizedFromPointerBuilder { + public Reader fromPointerReaderBlobDefault(SegmentReader segment, int pointer, java.nio.ByteBuffer defaultBuffer, + int defaultOffset, int defaultSize) { + return WireHelpers.readDataPointer(segment, pointer, defaultBuffer, defaultOffset, defaultSize); + } + public Builder fromPointerBuilderBlobDefault(SegmentBuilder segment, int pointer, + java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize) { + return WireHelpers.getWritableDataPointer(pointer, + segment, + defaultBuffer, + defaultOffset, + defaultSize); + } + + public Builder initSizedFromPointerBuilder(SegmentBuilder segment, int pointer, int size) { + return WireHelpers.initDataPointer(pointer, segment, size); + } + } + public static final Factory factory = new Factory(); public static final class Reader { public final ByteBuffer buffer; diff --git a/runtime/src/main/java/org/capnproto/DataList.java b/runtime/src/main/java/org/capnproto/DataList.java index b5e2432..7e8cd9e 100644 --- a/runtime/src/main/java/org/capnproto/DataList.java +++ b/runtime/src/main/java/org/capnproto/DataList.java @@ -30,7 +30,7 @@ public final class DataList { } public Data.Reader get(int index) { - return _getPointerElement(index).getData(); + return _getPointerElement(Data.factory, index, null, 0, 0); } public final class Iterator implements java.util.Iterator { @@ -41,7 +41,7 @@ public final class DataList { } public Data.Reader next() { - return this.list._getPointerElement(idx++).getData(); + return _getPointerElement(Data.factory, idx++, null, 0, 0); } public boolean hasNext() { return idx < list.size(); @@ -65,7 +65,7 @@ public final class DataList { } public final Data.Builder get(int index) { - return _getPointerElement(index).getData(); + return _getPointerElement(Data.factory, index, null, 0, 0); } public final void set(int index, Data.Reader value) { @@ -80,7 +80,7 @@ public final class DataList { } public Data.Builder next() { - return this.list._getPointerElement(idx++).getData(); + return this.list._getPointerElement(Data.factory, idx++, null, 0, 0); } public boolean hasNext() { return this.idx < this.list.size(); diff --git a/runtime/src/main/java/org/capnproto/FromPointerBuilderBlobDefault.java b/runtime/src/main/java/org/capnproto/FromPointerBuilderBlobDefault.java new file mode 100644 index 0000000..c87799f --- /dev/null +++ b/runtime/src/main/java/org/capnproto/FromPointerBuilderBlobDefault.java @@ -0,0 +1,6 @@ +package org.capnproto; + +public interface FromPointerBuilderBlobDefault { + T fromPointerBuilderBlobDefault(SegmentBuilder segment, int pointer, + java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize); +} diff --git a/runtime/src/main/java/org/capnproto/FromPointerReaderBlobDefault.java b/runtime/src/main/java/org/capnproto/FromPointerReaderBlobDefault.java new file mode 100644 index 0000000..b70f2d1 --- /dev/null +++ b/runtime/src/main/java/org/capnproto/FromPointerReaderBlobDefault.java @@ -0,0 +1,6 @@ +package org.capnproto; + +public interface FromPointerReaderBlobDefault { + T fromPointerReaderBlobDefault(SegmentReader segment, int pointer, java.nio.ByteBuffer defaultBuffer, + int defaultOffset, int defaultSize); +} diff --git a/runtime/src/main/java/org/capnproto/InitFromPointerBuilder.java b/runtime/src/main/java/org/capnproto/InitFromPointerBuilder.java index c5882f6..83a7b27 100644 --- a/runtime/src/main/java/org/capnproto/InitFromPointerBuilder.java +++ b/runtime/src/main/java/org/capnproto/InitFromPointerBuilder.java @@ -1,5 +1,5 @@ package org.capnproto; public interface InitFromPointerBuilder { - T initFromPointerBuilder(PointerBuilder builder); + T initFromPointerBuilder(SegmentBuilder segment, int pointer); } diff --git a/runtime/src/main/java/org/capnproto/InitSizedFromPointerBuilder.java b/runtime/src/main/java/org/capnproto/InitSizedFromPointerBuilder.java index cf18e75..5da43fb 100644 --- a/runtime/src/main/java/org/capnproto/InitSizedFromPointerBuilder.java +++ b/runtime/src/main/java/org/capnproto/InitSizedFromPointerBuilder.java @@ -1,5 +1,5 @@ package org.capnproto; public interface InitSizedFromPointerBuilder { - T initSizedFromPointerBuilder(PointerBuilder builder, int elementCount); + T initSizedFromPointerBuilder(SegmentBuilder segment, int pointer, int elementCount); } diff --git a/runtime/src/main/java/org/capnproto/ListBuilder.java b/runtime/src/main/java/org/capnproto/ListBuilder.java index 63f86c7..64a96e9 100644 --- a/runtime/src/main/java/org/capnproto/ListBuilder.java +++ b/runtime/src/main/java/org/capnproto/ListBuilder.java @@ -117,4 +117,26 @@ public class ListBuilder { (this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD, defaultSegment, defaultOffset); } + + protected final T _getPointerElement(FromPointerBuilderBlobDefault factory, int index, + java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize) { + return factory.fromPointerBuilderBlobDefault( + this.segment, + (this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD, + defaultBuffer, defaultOffset, defaultSize); + } + + + protected final T _initPointerElement(InitFromPointerBuilder factory, int index) { + return factory.initFromPointerBuilder( + this.segment, + (this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD); + } + + protected final T _initSizedPointerElement(InitSizedFromPointerBuilder factory, int index, int elementCount) { + return factory.initSizedFromPointerBuilder( + this.segment, + (this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD, + elementCount); + } } diff --git a/runtime/src/main/java/org/capnproto/ListFactory.java b/runtime/src/main/java/org/capnproto/ListFactory.java index 6a472d6..b7c9c19 100644 --- a/runtime/src/main/java/org/capnproto/ListFactory.java +++ b/runtime/src/main/java/org/capnproto/ListFactory.java @@ -27,7 +27,7 @@ public abstract class ListFactory implements ListBuilder.Factor defaultOffset); } - public Builder initSizedFromPointerBuilder(PointerBuilder builder, int elementCount) { - return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, this.elementSize); + public Builder initSizedFromPointerBuilder(SegmentBuilder segment, int pointer, int elementCount) { + return WireHelpers.initListPointer(this, pointer, segment, elementCount, this.elementSize); } } diff --git a/runtime/src/main/java/org/capnproto/ListList.java b/runtime/src/main/java/org/capnproto/ListList.java index 4da9ac4..12b8ffd 100644 --- a/runtime/src/main/java/org/capnproto/ListList.java +++ b/runtime/src/main/java/org/capnproto/ListList.java @@ -58,7 +58,7 @@ public final class ListList { } public final T init(int index, int size) { - return this.factory.initSizedFromPointerBuilder(_getPointerElement(index), size); + return _initSizedPointerElement(this.factory, index, size); } public final T get(int index) { diff --git a/runtime/src/main/java/org/capnproto/ListReader.java b/runtime/src/main/java/org/capnproto/ListReader.java index 1e0c3e2..e2a4bf6 100644 --- a/runtime/src/main/java/org/capnproto/ListReader.java +++ b/runtime/src/main/java/org/capnproto/ListReader.java @@ -99,4 +99,15 @@ public class ListReader { defaultOffset, this.nestingLimit); } + + protected T _getPointerElement(FromPointerReaderBlobDefault factory, int index, + java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize) { + return factory.fromPointerReaderBlobDefault( + this.segment, + (this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD, + defaultBuffer, + defaultOffset, + defaultSize); + } + } diff --git a/runtime/src/main/java/org/capnproto/PointerBuilder.java b/runtime/src/main/java/org/capnproto/PointerBuilder.java index a981a6e..c5b1442 100644 --- a/runtime/src/main/java/org/capnproto/PointerBuilder.java +++ b/runtime/src/main/java/org/capnproto/PointerBuilder.java @@ -17,42 +17,6 @@ public final class PointerBuilder { return this.segment.buffer.getLong(this.pointer) == 0; } - - public final Text.Builder getText() { - return WireHelpers.getWritableTextPointer( - this.pointer, this.segment, null, 0, 0); - } - - public Text.Builder getText(java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize) { - return WireHelpers.getWritableTextPointer(this.pointer, - this.segment, - defaultBuffer, - defaultOffset, - defaultSize); - } - - public final Data.Builder getData() { - return WireHelpers.getWritableDataPointer(this.pointer, - this.segment, - null, 0, 0); - } - - public Data.Builder getData(java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize) { - return WireHelpers.getWritableDataPointer(this.pointer, - this.segment, - defaultBuffer, - defaultOffset, - defaultSize); - } - - public final Text.Builder initText(int size) { - return WireHelpers.initTextPointer(this.pointer, this.segment, size); - } - - public final Data.Builder initData(int size) { - return WireHelpers.initDataPointer(this.pointer, this.segment, size); - } - public final void setList(ListReader value) { WireHelpers.setListPointer(this.segment, this.pointer, value); } diff --git a/runtime/src/main/java/org/capnproto/PointerReader.java b/runtime/src/main/java/org/capnproto/PointerReader.java index 8a84f3e..0604b7a 100644 --- a/runtime/src/main/java/org/capnproto/PointerReader.java +++ b/runtime/src/main/java/org/capnproto/PointerReader.java @@ -27,20 +27,4 @@ public final class PointerReader { public boolean isNull() { return this.segment.buffer.getLong(this.pointer) == 0; } - - public Text.Reader getText() { - return WireHelpers.readTextPointer(this.segment, this.pointer, null, 0, 0); - } - - public Text.Reader getText(java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize) { - return WireHelpers.readTextPointer(this.segment, this.pointer, defaultBuffer, defaultOffset, defaultSize); - } - - public Data.Reader getData() { - return WireHelpers.readDataPointer(this.segment, this.pointer, null, 0, 0); - } - - public Data.Reader getData(java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize) { - return WireHelpers.readDataPointer(this.segment, this.pointer, defaultBuffer, defaultOffset, defaultSize); - } } diff --git a/runtime/src/main/java/org/capnproto/StructBuilder.java b/runtime/src/main/java/org/capnproto/StructBuilder.java index eb3be9e..3a34962 100644 --- a/runtime/src/main/java/org/capnproto/StructBuilder.java +++ b/runtime/src/main/java/org/capnproto/StructBuilder.java @@ -157,4 +157,17 @@ public class StructBuilder { return factory.fromPointerBuilder(this.segment, this.pointers + index, defaultSegment, defaultOffset); } + protected final T _getPointerField(FromPointerBuilderBlobDefault factory, int index, + java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize) { + return factory.fromPointerBuilderBlobDefault(this.segment, this.pointers + index, defaultBuffer, defaultOffset, defaultSize); + } + + protected final T _initPointerField(InitFromPointerBuilder factory, int index) { + return factory.initFromPointerBuilder(this.segment, this.pointers + index); + } + + protected final T _initSizedPointerField(InitSizedFromPointerBuilder factory, int index, int elementCount) { + return factory.initSizedFromPointerBuilder(this.segment, this.pointers + index, elementCount); + } + } diff --git a/runtime/src/main/java/org/capnproto/StructFactory.java b/runtime/src/main/java/org/capnproto/StructFactory.java index 49ae6e6..29ff4be 100644 --- a/runtime/src/main/java/org/capnproto/StructFactory.java +++ b/runtime/src/main/java/org/capnproto/StructFactory.java @@ -16,8 +16,8 @@ public abstract class StructFactory implements FromPointerBuild return WireHelpers.getWritableStructPointer(this, pointer, segment, this.structSize(), defaultSegment, defaultOffset); } - public final Builder initFromPointerBuilder(PointerBuilder builder) { - return WireHelpers.initStructPointer(this, builder.pointer, builder.segment, this.structSize()); + public final Builder initFromPointerBuilder(SegmentBuilder segment, int pointer) { + return WireHelpers.initStructPointer(this, pointer, segment, this.structSize()); } public abstract Reader asReader(Builder builder); diff --git a/runtime/src/main/java/org/capnproto/StructList.java b/runtime/src/main/java/org/capnproto/StructList.java index 06c49d5..9751d8f 100644 --- a/runtime/src/main/java/org/capnproto/StructList.java +++ b/runtime/src/main/java/org/capnproto/StructList.java @@ -37,9 +37,9 @@ public final class StructList { defaultOffset); } - public final Builder initSizedFromPointerBuilder(PointerBuilder builder, - int elementCount) { - return WireHelpers.initStructListPointer(this, builder.pointer, builder.segment, elementCount, factory.structSize()); + public final Builder initSizedFromPointerBuilder(SegmentBuilder segment, int pointer, + int elementCount) { + return WireHelpers.initStructListPointer(this, pointer, segment, elementCount, factory.structSize()); } } diff --git a/runtime/src/main/java/org/capnproto/StructReader.java b/runtime/src/main/java/org/capnproto/StructReader.java index 471df5e..b017d62 100644 --- a/runtime/src/main/java/org/capnproto/StructReader.java +++ b/runtime/src/main/java/org/capnproto/StructReader.java @@ -160,4 +160,22 @@ public class StructReader { this.nestingLimit); } } + + protected final T _getPointerField(FromPointerReaderBlobDefault factory, int ptrIndex, + java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize) { + if (ptrIndex < this.pointerCount) { + return factory.fromPointerReaderBlobDefault(this.segment, + this.pointers + ptrIndex, + defaultBuffer, + defaultOffset, + defaultSize); + } else { + return factory.fromPointerReaderBlobDefault(SegmentReader.EMPTY, + 0, + defaultBuffer, + defaultOffset, + defaultSize); + } + } + } diff --git a/runtime/src/main/java/org/capnproto/Text.java b/runtime/src/main/java/org/capnproto/Text.java index 8490715..df6f3bc 100644 --- a/runtime/src/main/java/org/capnproto/Text.java +++ b/runtime/src/main/java/org/capnproto/Text.java @@ -3,6 +3,28 @@ package org.capnproto; import java.nio.ByteBuffer; public final class Text { + public static final class Factory implements FromPointerReaderBlobDefault, + FromPointerBuilderBlobDefault, + InitSizedFromPointerBuilder { + public Reader fromPointerReaderBlobDefault(SegmentReader segment, int pointer, java.nio.ByteBuffer defaultBuffer, + int defaultOffset, int defaultSize) { + return WireHelpers.readTextPointer(segment, pointer, defaultBuffer, defaultOffset, defaultSize); + } + + public Builder fromPointerBuilderBlobDefault(SegmentBuilder segment, int pointer, + java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize) { + return WireHelpers.getWritableTextPointer(pointer, + segment, + defaultBuffer, + defaultOffset, + defaultSize); + } + + public Builder initSizedFromPointerBuilder(SegmentBuilder segment, int pointer, int size) { + return WireHelpers.initTextPointer(pointer, segment, size); + } + } + public static final Factory factory = new Factory(); public static final class Reader { public final ByteBuffer buffer; diff --git a/runtime/src/main/java/org/capnproto/TextList.java b/runtime/src/main/java/org/capnproto/TextList.java index 5875b76..b994ee5 100644 --- a/runtime/src/main/java/org/capnproto/TextList.java +++ b/runtime/src/main/java/org/capnproto/TextList.java @@ -30,7 +30,7 @@ public final class TextList { } public Text.Reader get(int index) { - return _getPointerElement(index).getText(); + return _getPointerElement(Text.factory, index, null, 0, 0); } public final class Iterator implements java.util.Iterator { @@ -41,7 +41,7 @@ public final class TextList { } public Text.Reader next() { - return this.list._getPointerElement(idx++).getText(); + return _getPointerElement(Text.factory, idx++, null, 0, 0); } public boolean hasNext() { return idx < list.size(); @@ -65,7 +65,7 @@ public final class TextList { } public final Text.Builder get(int index) { - return _getPointerElement(index).getText(); + return _getPointerElement(Text.factory, index, null, 0, 0); } public final void set(int index, Text.Reader value) { @@ -80,7 +80,7 @@ public final class TextList { } public Text.Builder next() { - return this.list._getPointerElement(idx++).getText(); + return this.list._getPointerElement(Text.factory, idx++, null, 0, 0); } public boolean hasNext() { return this.idx < this.list.size();