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), " }\n",
spaces(indent), " public final ", type, ".Builder init", titleCase, "() {\n", spaces(indent), " public final ", type, ".Builder init", titleCase, "() {\n",
unionDiscrim.set, unionDiscrim.set,
spaces(indent), " return ", type, ".factory.initFromPointerBuilder(", spaces(indent), " return ",
"_getPointerField(", offset, "));\n", "_initPointerField(", type, ".factory,", offset, ");\n",
spaces(indent), " }\n"), spaces(indent), " }\n"),
}; };
} else if (kind == FieldKind::BLOB) { } else if (kind == FieldKind::BLOB) {
uint64_t typeId = field.getContainingStruct().getProto().getId(); 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); "Schemas.b_", kj::hex(typeId), ".buffer, ", defaultOffset, ", ", defaultSize);
kj::String blobKind = typeBody.which() == schema::Type::TEXT ? kj::str("Text") : kj::str("Data"); 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 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 { return FieldText {
kj::strTree( kj::strTree(
@ -1022,8 +1023,8 @@ private:
spaces(indent), " public ", type, ".Reader", spaces(indent), " public ", type, ".Reader",
" get", titleCase, "() {\n", " get", titleCase, "() {\n",
spaces(indent), " return _getPointerField(", spaces(indent), " return _getPointerField(", factory, ", ",
offset, ").get", blobKind, "(", defaultParams, ");\n", offset, ", ", defaultParams, ");\n",
spaces(indent), " }\n", "\n"), spaces(indent), " }\n", "\n"),
kj::strTree( kj::strTree(
@ -1033,8 +1034,8 @@ private:
spaces(indent), " return !_getPointerField(", offset, ").isNull();\n", spaces(indent), " return !_getPointerField(", offset, ").isNull();\n",
spaces(indent), " }\n", spaces(indent), " }\n",
spaces(indent), " public final ", type, ".Builder get", titleCase, "() {\n", spaces(indent), " public final ", type, ".Builder get", titleCase, "() {\n",
spaces(indent), " return _getPointerField(", spaces(indent), " return _getPointerField(", factory, ", ",
offset, ").get", blobKind, "(", defaultParams, ");\n", offset, ", ", defaultParams, ");\n",
spaces(indent), " }\n", spaces(indent), " }\n",
spaces(indent), " public final void set", titleCase, "(", type, ".Reader value) {\n", spaces(indent), " public final void set", titleCase, "(", type, ".Reader value) {\n",
unionDiscrim.set, unionDiscrim.set,
@ -1047,7 +1048,7 @@ private:
spaces(indent), " }\n", spaces(indent), " }\n",
spaces(indent), " public final ", type, ".Builder init", titleCase, "(int size) {\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"), spaces(indent), " }\n"),
}; };
} else if (kind == FieldKind::LIST) { } else if (kind == FieldKind::LIST) {
@ -1090,7 +1091,7 @@ private:
spaces(indent), " public final ", builderClass, spaces(indent), " public final ", builderClass,
" init", titleCase, "(int size) {\n", " 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"), spaces(indent), " }\n"),
}; };
} else { } else {

View file

@ -22,11 +22,11 @@ public final class AnyPointer {
} }
public final <T> T initAs(InitFromPointerBuilder<T> factory) { 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) { 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() { public final void clear() {

View file

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

View file

@ -30,7 +30,7 @@ public final class DataList {
} }
public Data.Reader get(int index) { 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> { public final class Iterator implements java.util.Iterator<Data.Reader> {
@ -41,7 +41,7 @@ public final class DataList {
} }
public Data.Reader next() { public Data.Reader next() {
return this.list._getPointerElement(idx++).getData(); return _getPointerElement(Data.factory, idx++, null, 0, 0);
} }
public boolean hasNext() { public boolean hasNext() {
return idx < list.size(); return idx < list.size();
@ -65,7 +65,7 @@ public final class DataList {
} }
public final Data.Builder get(int index) { 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) { public final void set(int index, Data.Reader value) {
@ -80,7 +80,7 @@ public final class DataList {
} }
public Data.Builder next() { public Data.Builder next() {
return this.list._getPointerElement(idx++).getData(); return this.list._getPointerElement(Data.factory, idx++, null, 0, 0);
} }
public boolean hasNext() { public boolean hasNext() {
return this.idx < this.list.size(); 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; package org.capnproto;
public interface InitFromPointerBuilder<T> { public interface InitFromPointerBuilder<T> {
T initFromPointerBuilder(PointerBuilder builder); T initFromPointerBuilder(SegmentBuilder segment, int pointer);
} }

View file

@ -1,5 +1,5 @@
package org.capnproto; package org.capnproto;
public interface InitSizedFromPointerBuilder<T> { 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, (this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD,
defaultSegment, defaultOffset); 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); defaultOffset);
} }
public Builder initSizedFromPointerBuilder(PointerBuilder builder, int elementCount) { public Builder initSizedFromPointerBuilder(SegmentBuilder segment, int pointer, int elementCount) {
return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, this.elementSize); 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) { 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) { public final T get(int index) {

View file

@ -99,4 +99,15 @@ public class ListReader {
defaultOffset, defaultOffset,
this.nestingLimit); 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; 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) { public final void setList(ListReader value) {
WireHelpers.setListPointer(this.segment, this.pointer, value); WireHelpers.setListPointer(this.segment, this.pointer, value);
} }

View file

@ -27,20 +27,4 @@ public final class PointerReader {
public boolean isNull() { public boolean isNull() {
return this.segment.buffer.getLong(this.pointer) == 0; 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); 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(), return WireHelpers.getWritableStructPointer(this, pointer, segment, this.structSize(),
defaultSegment, defaultOffset); defaultSegment, defaultOffset);
} }
public final Builder initFromPointerBuilder(PointerBuilder builder) { public final Builder initFromPointerBuilder(SegmentBuilder segment, int pointer) {
return WireHelpers.initStructPointer(this, builder.pointer, builder.segment, this.structSize()); return WireHelpers.initStructPointer(this, pointer, segment, this.structSize());
} }
public abstract Reader asReader(Builder builder); public abstract Reader asReader(Builder builder);

View file

@ -37,9 +37,9 @@ public final class StructList {
defaultOffset); defaultOffset);
} }
public final Builder<ElementBuilder> initSizedFromPointerBuilder(PointerBuilder builder, public final Builder<ElementBuilder> initSizedFromPointerBuilder(SegmentBuilder segment, int pointer,
int elementCount) { 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); 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; import java.nio.ByteBuffer;
public final class Text { 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 static final class Reader {
public final ByteBuffer buffer; public final ByteBuffer buffer;

View file

@ -30,7 +30,7 @@ public final class TextList {
} }
public Text.Reader get(int index) { 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> { public final class Iterator implements java.util.Iterator<Text.Reader> {
@ -41,7 +41,7 @@ public final class TextList {
} }
public Text.Reader next() { public Text.Reader next() {
return this.list._getPointerElement(idx++).getText(); return _getPointerElement(Text.factory, idx++, null, 0, 0);
} }
public boolean hasNext() { public boolean hasNext() {
return idx < list.size(); return idx < list.size();
@ -65,7 +65,7 @@ public final class TextList {
} }
public final Text.Builder get(int index) { 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) { public final void set(int index, Text.Reader value) {
@ -80,7 +80,7 @@ public final class TextList {
} }
public Text.Builder next() { public Text.Builder next() {
return this.list._getPointerElement(idx++).getText(); return this.list._getPointerElement(Text.factory, idx++, null, 0, 0);
} }
public boolean hasNext() { public boolean hasNext() {
return this.idx < this.list.size(); return this.idx < this.list.size();