Text.factory, Data.factory

This commit is contained in:
David Renshaw 2014-10-08 11:00:22 -04:00
parent dce3c46cf1
commit 1cef64e2da
20 changed files with 149 additions and 81 deletions

View file

@ -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 {

View file

@ -22,11 +22,11 @@ public final class AnyPointer {
}
public final <T> T initAs(InitFromPointerBuilder<T> factory) {
return factory.initFromPointerBuilder(this.builder);
return factory.initFromPointerBuilder(this.builder.segment, this.builder.pointer);
}
public final <T> T initAs(InitSizedFromPointerBuilder<T> factory, int elementCount) {
return factory.initSizedFromPointerBuilder(this.builder, elementCount);
return factory.initSizedFromPointerBuilder(this.builder.segment, this.builder.pointer, elementCount);
}
public final void clear() {

View file

@ -3,6 +3,27 @@ package org.capnproto;
import java.nio.ByteBuffer;
public final class Data {
public static final class Factory implements FromPointerReaderBlobDefault<Reader>,
FromPointerBuilderBlobDefault<Builder>,
InitSizedFromPointerBuilder<Builder> {
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;

View file

@ -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<Data.Reader> {
@ -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();

View file

@ -0,0 +1,6 @@
package org.capnproto;
public interface FromPointerBuilderBlobDefault<T> {
T fromPointerBuilderBlobDefault(SegmentBuilder segment, int pointer,
java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize);
}

View file

@ -0,0 +1,6 @@
package org.capnproto;
public interface FromPointerReaderBlobDefault<T> {
T fromPointerReaderBlobDefault(SegmentReader segment, int pointer, java.nio.ByteBuffer defaultBuffer,
int defaultOffset, int defaultSize);
}

View file

@ -1,5 +1,5 @@
package org.capnproto;
public interface InitFromPointerBuilder<T> {
T initFromPointerBuilder(PointerBuilder builder);
T initFromPointerBuilder(SegmentBuilder segment, int pointer);
}

View file

@ -1,5 +1,5 @@
package org.capnproto;
public interface InitSizedFromPointerBuilder<T> {
T initSizedFromPointerBuilder(PointerBuilder builder, int elementCount);
T initSizedFromPointerBuilder(SegmentBuilder segment, int pointer, int elementCount);
}

View file

@ -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> T _getPointerElement(FromPointerBuilderBlobDefault<T> 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> T _initPointerElement(InitFromPointerBuilder<T> factory, int index) {
return factory.initFromPointerBuilder(
this.segment,
(this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD);
}
protected final <T> T _initSizedPointerElement(InitSizedFromPointerBuilder<T> factory, int index, int elementCount) {
return factory.initSizedFromPointerBuilder(
this.segment,
(this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD,
elementCount);
}
}

View file

@ -27,7 +27,7 @@ public abstract class ListFactory<Builder, Reader> 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);
}
}

View file

@ -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) {

View file

@ -99,4 +99,15 @@ public class ListReader {
defaultOffset,
this.nestingLimit);
}
protected <T> T _getPointerElement(FromPointerReaderBlobDefault<T> 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);
}
}

View file

@ -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);
}

View file

@ -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);
}
}

View file

@ -157,4 +157,17 @@ public class StructBuilder {
return factory.fromPointerBuilder(this.segment, this.pointers + index, defaultSegment, defaultOffset);
}
protected final <T> T _getPointerField(FromPointerBuilderBlobDefault<T> 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> T _initPointerField(InitFromPointerBuilder<T> factory, int index) {
return factory.initFromPointerBuilder(this.segment, this.pointers + index);
}
protected final <T> T _initSizedPointerField(InitSizedFromPointerBuilder<T> factory, int index, int elementCount) {
return factory.initSizedFromPointerBuilder(this.segment, this.pointers + index, elementCount);
}
}

View file

@ -16,8 +16,8 @@ public abstract class StructFactory<Builder, Reader> 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);

View file

@ -37,9 +37,9 @@ public final class StructList {
defaultOffset);
}
public final Builder<ElementBuilder> initSizedFromPointerBuilder(PointerBuilder builder,
public final Builder<ElementBuilder> initSizedFromPointerBuilder(SegmentBuilder segment, int pointer,
int elementCount) {
return WireHelpers.initStructListPointer(this, builder.pointer, builder.segment, elementCount, factory.structSize());
return WireHelpers.initStructListPointer(this, pointer, segment, elementCount, factory.structSize());
}
}

View file

@ -160,4 +160,22 @@ public class StructReader {
this.nestingLimit);
}
}
protected final <T> T _getPointerField(FromPointerReaderBlobDefault<T> 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);
}
}
}

View file

@ -3,6 +3,28 @@ package org.capnproto;
import java.nio.ByteBuffer;
public final class Text {
public static final class Factory implements FromPointerReaderBlobDefault<Reader>,
FromPointerBuilderBlobDefault<Builder>,
InitSizedFromPointerBuilder<Builder> {
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;

View file

@ -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<Text.Reader> {
@ -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();