avoiding allocations of PointerReader and PointerBuilder
This commit is contained in:
parent
b884ad11c4
commit
dce3c46cf1
12 changed files with 75 additions and 36 deletions
|
@ -981,16 +981,16 @@ private:
|
||||||
|
|
||||||
spaces(indent), " public ", type, ".Reader get", titleCase, "() {\n",
|
spaces(indent), " public ", type, ".Reader get", titleCase, "() {\n",
|
||||||
unionDiscrim.check,
|
unionDiscrim.check,
|
||||||
spaces(indent), " return ", type, ".factory.fromPointerReader(",
|
spaces(indent), " return ",
|
||||||
"_getPointerField(", offset,"),", defaultParams, ");\n",
|
"_getPointerField(", type, ".factory,", offset,",", defaultParams, ");\n",
|
||||||
spaces(indent), " }\n", "\n"),
|
spaces(indent), " }\n", "\n"),
|
||||||
|
|
||||||
kj::strTree(
|
kj::strTree(
|
||||||
kj::mv(unionDiscrim.builderIsDecl),
|
kj::mv(unionDiscrim.builderIsDecl),
|
||||||
spaces(indent), " public final ", type, ".Builder get", titleCase, "() {\n",
|
spaces(indent), " public final ", type, ".Builder get", titleCase, "() {\n",
|
||||||
unionDiscrim.check,
|
unionDiscrim.check,
|
||||||
spaces(indent), " return ", type, ".factory.fromPointerBuilder("
|
spaces(indent), " return ",
|
||||||
"_getPointerField(", offset, "),", defaultParams,");\n",
|
"_getPointerField(", type, ".factory, ", 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,
|
||||||
|
@ -1069,8 +1069,7 @@ private:
|
||||||
|
|
||||||
spaces(indent), " public final ", readerClass,
|
spaces(indent), " public final ", readerClass,
|
||||||
" get", titleCase, "() {\n",
|
" get", titleCase, "() {\n",
|
||||||
spaces(indent), " return (", listFactory, ").fromPointerReader(_getPointerField(", offset, "),",
|
spaces(indent), " return _getPointerField(", listFactory, ", ", offset, ", ", defaultParams, ");\n",
|
||||||
defaultParams, ");\n",
|
|
||||||
spaces(indent), " }\n",
|
spaces(indent), " }\n",
|
||||||
"\n"),
|
"\n"),
|
||||||
|
|
||||||
|
@ -1082,8 +1081,7 @@ private:
|
||||||
|
|
||||||
spaces(indent), " public final ", builderClass,
|
spaces(indent), " public final ", builderClass,
|
||||||
" get", titleCase, "() {\n",
|
" get", titleCase, "() {\n",
|
||||||
spaces(indent), " return (", listFactory, ").fromPointerBuilder(_getPointerField(", offset, "),",
|
spaces(indent), " return _getPointerField(", listFactory, ", ", offset, ", ", defaultParams, ");\n",
|
||||||
defaultParams, ");\n",
|
|
||||||
spaces(indent), " }\n",
|
spaces(indent), " }\n",
|
||||||
|
|
||||||
spaces(indent), " public final void set", titleCase, "(", readerClass, " value) {\n",
|
spaces(indent), " public final void set", titleCase, "(", readerClass, " value) {\n",
|
||||||
|
@ -1301,9 +1299,10 @@ private:
|
||||||
true,
|
true,
|
||||||
kj::strTree(spaces(indent),
|
kj::strTree(spaces(indent),
|
||||||
"public static final ", typeName_, ".Reader ", upperCase, " =\n",
|
"public static final ", typeName_, ".Reader ", upperCase, " =\n",
|
||||||
spaces(indent), " ", typeName_, ".factory.fromPointerReader"
|
spaces(indent), " ",
|
||||||
"(new org.capnproto.PointerReader(Schemas.b_",
|
"new org.capnproto.AnyPointer.Reader(new org.capnproto.PointerReader(Schemas.b_",
|
||||||
kj::hex(proto.getId()), ",", schema.getValueSchemaOffset(), ",0x7fffffff), null, 0);\n")
|
kj::hex(proto.getId()), ",", schema.getValueSchemaOffset(), ",0x7fffffff)).getAs(",
|
||||||
|
typeName_, ".factory);\n")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ public final class AnyPointer {
|
||||||
}
|
}
|
||||||
|
|
||||||
public final <T> T getAs(FromPointerReader<T> factory) {
|
public final <T> T getAs(FromPointerReader<T> factory) {
|
||||||
return factory.fromPointerReader(this.reader, null, 0);
|
return factory.fromPointerReader(this.reader.segment, this.reader.pointer, null, 0, this.reader.nestingLimit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
package org.capnproto;
|
package org.capnproto;
|
||||||
|
|
||||||
public interface FromPointerBuilder<T> {
|
public interface FromPointerBuilder<T> {
|
||||||
T fromPointerBuilder(PointerBuilder builder, SegmentReader defaultSegment, int defaultOffset);
|
T fromPointerBuilder(SegmentBuilder segment, int pointer, SegmentReader defaultSegment, int defaultOffset);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
package org.capnproto;
|
package org.capnproto;
|
||||||
|
|
||||||
public interface FromPointerReader<T> {
|
public interface FromPointerReader<T> {
|
||||||
T fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset);
|
T fromPointerReader(SegmentReader segment, int pointer, SegmentReader defaultSegment, int defaultOffset, int nestingLimit);
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,4 +111,10 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected final <T> T _getPointerElement(FromPointerBuilder<T> factory, int index, SegmentReader defaultSegment, int defaultOffset) {
|
||||||
|
return factory.fromPointerBuilder(
|
||||||
|
this.segment,
|
||||||
|
(this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD,
|
||||||
|
defaultSegment, defaultOffset);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,20 +6,22 @@ public abstract class ListFactory<Builder, Reader> implements ListBuilder.Factor
|
||||||
final byte elementSize;
|
final byte elementSize;
|
||||||
ListFactory(byte elementSize) {this.elementSize = elementSize;}
|
ListFactory(byte elementSize) {this.elementSize = elementSize;}
|
||||||
|
|
||||||
public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
|
public final Reader fromPointerReader(SegmentReader segment, int pointer,
|
||||||
|
SegmentReader defaultSegment, int defaultOffset,
|
||||||
|
int nestingLimit) {
|
||||||
return WireHelpers.readListPointer(this,
|
return WireHelpers.readListPointer(this,
|
||||||
reader.segment,
|
segment,
|
||||||
reader.pointer,
|
pointer,
|
||||||
defaultSegment,
|
defaultSegment,
|
||||||
defaultOffset,
|
defaultOffset,
|
||||||
this.elementSize,
|
this.elementSize,
|
||||||
reader.nestingLimit);
|
nestingLimit);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder fromPointerBuilder(PointerBuilder builder, SegmentReader defaultSegment, int defaultOffset) {
|
public Builder fromPointerBuilder(SegmentBuilder segment, int pointer, SegmentReader defaultSegment, int defaultOffset) {
|
||||||
return WireHelpers.getWritableListPointer(this,
|
return WireHelpers.getWritableListPointer(this,
|
||||||
builder.pointer,
|
pointer,
|
||||||
builder.segment,
|
segment,
|
||||||
this.elementSize,
|
this.elementSize,
|
||||||
defaultSegment,
|
defaultSegment,
|
||||||
defaultOffset);
|
defaultOffset);
|
||||||
|
|
|
@ -41,7 +41,7 @@ public final class ListList {
|
||||||
}
|
}
|
||||||
|
|
||||||
public T get(int index) {
|
public T get(int index) {
|
||||||
return this.factory.fromPointerReader(_getPointerElement(index), null, 0);
|
return _getPointerElement(this.factory, index, null, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -62,7 +62,7 @@ public final class ListList {
|
||||||
}
|
}
|
||||||
|
|
||||||
public final T get(int index) {
|
public final T get(int index) {
|
||||||
return this.factory.fromPointerBuilder(_getPointerElement(index), null, 0);
|
return _getPointerElement(this.factory, index, null, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,4 +91,12 @@ public class ListReader {
|
||||||
(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,
|
||||||
this.nestingLimit);
|
this.nestingLimit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected <T> T _getPointerElement(FromPointerReader<T> factory, int index, SegmentReader defaultSegment, int defaultOffset) {
|
||||||
|
return factory.fromPointerReader(this.segment,
|
||||||
|
(this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD,
|
||||||
|
defaultSegment,
|
||||||
|
defaultOffset,
|
||||||
|
this.nestingLimit);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,4 +153,8 @@ public class StructBuilder {
|
||||||
return new PointerBuilder(this.segment, this.pointers + index);
|
return new PointerBuilder(this.segment, this.pointers + index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected final <T> T _getPointerField(FromPointerBuilder<T> factory, int index, SegmentReader defaultSegment, int defaultOffset) {
|
||||||
|
return factory.fromPointerBuilder(this.segment, this.pointers + index, defaultSegment, defaultOffset);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,19 +3,22 @@ package org.capnproto;
|
||||||
public abstract class StructFactory<Builder, Reader> implements FromPointerBuilder<Builder>, StructBuilder.Factory<Builder>,
|
public abstract class StructFactory<Builder, Reader> implements FromPointerBuilder<Builder>, StructBuilder.Factory<Builder>,
|
||||||
InitFromPointerBuilder<Builder>,
|
InitFromPointerBuilder<Builder>,
|
||||||
FromPointerReader<Reader>, StructReader.Factory<Reader> {
|
FromPointerReader<Reader>, StructReader.Factory<Reader> {
|
||||||
public Builder fromPointerBuilder(PointerBuilder builder, SegmentReader defaultSegment, int defaultOffset) {
|
public final Reader fromPointerReader(SegmentReader segment, int pointer,
|
||||||
return WireHelpers.getWritableStructPointer(this, builder.pointer, builder.segment, this.structSize(),
|
SegmentReader defaultSegment, int defaultOffset,
|
||||||
|
int nestingLimit) {
|
||||||
|
return WireHelpers.readStructPointer(this,
|
||||||
|
segment,
|
||||||
|
pointer,
|
||||||
|
defaultSegment, defaultOffset,
|
||||||
|
nestingLimit);
|
||||||
|
}
|
||||||
|
public final Builder fromPointerBuilder(SegmentBuilder segment, int pointer, SegmentReader defaultSegment, int defaultOffset) {
|
||||||
|
return WireHelpers.getWritableStructPointer(this, pointer, segment, this.structSize(),
|
||||||
defaultSegment, defaultOffset);
|
defaultSegment, defaultOffset);
|
||||||
}
|
}
|
||||||
public Builder initFromPointerBuilder(PointerBuilder builder) {
|
public final Builder initFromPointerBuilder(PointerBuilder builder) {
|
||||||
return WireHelpers.initStructPointer(this, builder.pointer, builder.segment, this.structSize());
|
return WireHelpers.initStructPointer(this, builder.pointer, builder.segment, this.structSize());
|
||||||
}
|
}
|
||||||
public Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
|
|
||||||
return WireHelpers.readStructPointer(this,
|
|
||||||
reader.segment,
|
|
||||||
reader.pointer,
|
|
||||||
defaultSegment, defaultOffset,
|
|
||||||
reader.nestingLimit);
|
|
||||||
}
|
|
||||||
public abstract Reader asReader(Builder builder);
|
public abstract Reader asReader(Builder builder);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,10 +27,11 @@ public final class StructList {
|
||||||
return new Builder<ElementBuilder> (factory, segment, ptr, elementCount, step, structDataSize, structPointerCount);
|
return new Builder<ElementBuilder> (factory, segment, ptr, elementCount, step, structDataSize, structPointerCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final Builder<ElementBuilder> fromPointerBuilder(PointerBuilder builder, SegmentReader defaultSegment, int defaultOffset) {
|
public final Builder<ElementBuilder> fromPointerBuilder(SegmentBuilder segment, int pointer,
|
||||||
|
SegmentReader defaultSegment, int defaultOffset) {
|
||||||
return WireHelpers.getWritableStructListPointer(this,
|
return WireHelpers.getWritableStructListPointer(this,
|
||||||
builder.pointer,
|
pointer,
|
||||||
builder.segment,
|
segment,
|
||||||
factory.structSize(),
|
factory.structSize(),
|
||||||
defaultSegment,
|
defaultSegment,
|
||||||
defaultOffset);
|
defaultOffset);
|
||||||
|
|
|
@ -144,4 +144,20 @@ public class StructReader {
|
||||||
return new PointerReader();
|
return new PointerReader();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected final <T> T _getPointerField(FromPointerReader<T> factory, int ptrIndex, SegmentReader defaultSegment, int defaultOffset) {
|
||||||
|
if (ptrIndex < this.pointerCount) {
|
||||||
|
return factory.fromPointerReader(this.segment,
|
||||||
|
this.pointers + ptrIndex,
|
||||||
|
defaultSegment,
|
||||||
|
defaultOffset,
|
||||||
|
this.nestingLimit);
|
||||||
|
} else {
|
||||||
|
return factory.fromPointerReader(SegmentReader.EMPTY,
|
||||||
|
0,
|
||||||
|
defaultSegment,
|
||||||
|
defaultOffset,
|
||||||
|
this.nestingLimit);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue