eradicate PointerBuilder
This commit is contained in:
parent
b876c52ecd
commit
6e9a325ca5
18 changed files with 95 additions and 93 deletions
|
@ -11,10 +11,13 @@ import org.capnproto.StructFactory;
|
|||
import org.capnproto.MessageBuilder;
|
||||
import org.capnproto.MessageReader;
|
||||
|
||||
public abstract class TestCase<RequestFactory extends StructFactory<RequestBuilder, RequestReader>,
|
||||
RequestBuilder, RequestReader,
|
||||
public abstract class TestCase<RequestFactory extends
|
||||
StructFactory<RequestBuilder, RequestReader>,
|
||||
RequestBuilder extends org.capnproto.StructBuilder,
|
||||
RequestReader extends org.capnproto.StructReader,
|
||||
ResponseFactory extends StructFactory<ResponseBuilder, ResponseReader>,
|
||||
ResponseBuilder, ResponseReader, Expectation> {
|
||||
ResponseBuilder extends org.capnproto.StructBuilder,
|
||||
ResponseReader extends org.capnproto.StructReader, Expectation> {
|
||||
public abstract Expectation setupRequest(Common.FastRand rng, RequestBuilder request);
|
||||
public abstract void handleRequest(RequestReader request, ResponseBuilder response);
|
||||
public abstract boolean checkResponse(ResponseReader response, Expectation expected);
|
||||
|
|
|
@ -763,7 +763,7 @@ private:
|
|||
");\n");
|
||||
case Section::POINTERS:
|
||||
return kj::strTree(
|
||||
spaces(indent), " _getPointerField(", slot.offset, ").clear();\n");
|
||||
spaces(indent), " _clearPointerField(", slot.offset, ");\n");
|
||||
}
|
||||
KJ_UNREACHABLE;
|
||||
},
|
||||
|
@ -947,20 +947,20 @@ private:
|
|||
kj::strTree(
|
||||
kj::mv(unionDiscrim.builderIsDecl),
|
||||
spaces(indent), " public final boolean has", titleCase, "() {\n",
|
||||
spaces(indent), " return !_getPointerField(", offset, ").isNull();\n",
|
||||
spaces(indent), " return !_pointerFieldIsNull(", offset, ");\n",
|
||||
spaces(indent), " }\n",
|
||||
|
||||
spaces(indent), " public org.capnproto.AnyPointer.Builder get", titleCase, "() {\n",
|
||||
unionDiscrim.check,
|
||||
spaces(indent), " return new org.capnproto.AnyPointer.Builder(_getPointerField(",
|
||||
offset, "));\n",
|
||||
spaces(indent), " return new org.capnproto.AnyPointer.Builder(this.segment, this.pointers + ",
|
||||
offset, ");\n",
|
||||
spaces(indent), " }\n",
|
||||
|
||||
spaces(indent), " public org.capnproto.AnyPointer.Builder init", titleCase, "() {\n",
|
||||
unionDiscrim.set,
|
||||
spaces(indent), " org.capnproto.AnyPointer.Builder result =\n",
|
||||
spaces(indent), " new org.capnproto.AnyPointer.Builder(_getPointerField(",
|
||||
offset, "));\n",
|
||||
spaces(indent), " new org.capnproto.AnyPointer.Builder(this.segment, this.pointers +",
|
||||
offset, ");\n",
|
||||
spaces(indent), " result.clear();\n",
|
||||
spaces(indent), " return result;\n",
|
||||
spaces(indent), " }\n",
|
||||
|
@ -994,7 +994,7 @@ private:
|
|||
spaces(indent), " }\n",
|
||||
spaces(indent), " public final void set", titleCase, "(", type, ".Reader value) {\n",
|
||||
unionDiscrim.set,
|
||||
spaces(indent), " _getPointerField(", offset, ").setStruct(value);\n",
|
||||
spaces(indent), " _setPointerField(", type, ".factory,", offset, ", value);\n",
|
||||
spaces(indent), " }\n",
|
||||
spaces(indent), " public final ", type, ".Builder init", titleCase, "() {\n",
|
||||
unionDiscrim.set,
|
||||
|
@ -1031,7 +1031,7 @@ private:
|
|||
kj::mv(unionDiscrim.builderIsDecl),
|
||||
spaces(indent), " public final boolean has", titleCase, "() {\n",
|
||||
unionDiscrim.has,
|
||||
spaces(indent), " return !_getPointerField(", offset, ").isNull();\n",
|
||||
spaces(indent), " return !_pointerFieldIsNull(", offset, ");\n",
|
||||
spaces(indent), " }\n",
|
||||
spaces(indent), " public final ", type, ".Builder get", titleCase, "() {\n",
|
||||
spaces(indent), " return _getPointerField(", factory, ", ",
|
||||
|
@ -1039,11 +1039,11 @@ private:
|
|||
spaces(indent), " }\n",
|
||||
spaces(indent), " public final void set", titleCase, "(", type, ".Reader value) {\n",
|
||||
unionDiscrim.set,
|
||||
spaces(indent), " _getPointerField(", offset, ").set", blobKind, "(value);\n",
|
||||
spaces(indent), " _setPointerField(", factory, ", ", offset, ", value);\n",
|
||||
spaces(indent), " }\n",
|
||||
spaces(indent), " public final void set", titleCase, "(", setterInputType, " value) {\n",
|
||||
unionDiscrim.set,
|
||||
spaces(indent), " _getPointerField(", offset, ").set", blobKind, "( new",
|
||||
spaces(indent), " _setPointerField(", factory, ", ", offset, ", new",
|
||||
type, ".Reader(value));\n",
|
||||
spaces(indent), " }\n",
|
||||
|
||||
|
@ -1077,7 +1077,7 @@ private:
|
|||
kj::strTree(
|
||||
kj::mv(unionDiscrim.builderIsDecl),
|
||||
spaces(indent), " public final boolean has", titleCase, "() {\n",
|
||||
spaces(indent), " return !_getPointerField(", offset, ").isNull();\n",
|
||||
spaces(indent), " return !_pointerFieldIsNull(", offset, ");\n",
|
||||
spaces(indent), " }\n",
|
||||
|
||||
spaces(indent), " public final ", builderClass,
|
||||
|
@ -1086,7 +1086,7 @@ private:
|
|||
spaces(indent), " }\n",
|
||||
|
||||
spaces(indent), " public final void set", titleCase, "(", readerClass, " value) {\n",
|
||||
spaces(indent), " _getPointerField(", offset, ").setList(value);\n",
|
||||
spaces(indent), " _setPointerField(", listFactory, ", ", offset, ", value);\n",
|
||||
spaces(indent), " }\n",
|
||||
|
||||
spaces(indent), " public final ", builderClass,
|
||||
|
|
|
@ -19,22 +19,25 @@ public final class AnyPointer {
|
|||
}
|
||||
|
||||
public static final class Builder {
|
||||
public final PointerBuilder builder;
|
||||
final SegmentBuilder segment;
|
||||
final int pointer;
|
||||
|
||||
public Builder(PointerBuilder builder) {
|
||||
this.builder = builder;
|
||||
public Builder(SegmentBuilder segment, int pointer) {
|
||||
this.segment = segment;
|
||||
this.pointer = pointer;
|
||||
}
|
||||
|
||||
public final <T> T initAs(InitFromPointerBuilder<T> factory) {
|
||||
return factory.initFromPointerBuilder(this.builder.segment, this.builder.pointer);
|
||||
return factory.initFromPointerBuilder(this.segment, this.pointer);
|
||||
}
|
||||
|
||||
public final <T> T initAs(InitSizedFromPointerBuilder<T> factory, int elementCount) {
|
||||
return factory.initSizedFromPointerBuilder(this.builder.segment, this.builder.pointer, elementCount);
|
||||
return factory.initSizedFromPointerBuilder(this.segment, this.pointer, elementCount);
|
||||
}
|
||||
|
||||
public final void clear() {
|
||||
this.builder.clear();
|
||||
WireHelpers.zeroObject(this.segment, this.pointer);
|
||||
this.segment.buffer.putLong(this.pointer * 8, 0L);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,12 +5,13 @@ import java.nio.ByteBuffer;
|
|||
public final class Data {
|
||||
public static final class Factory implements FromPointerReaderBlobDefault<Reader>,
|
||||
FromPointerBuilderBlobDefault<Builder>,
|
||||
SetPointerBuilder<Reader>,
|
||||
InitSizedFromPointerBuilder<Builder> {
|
||||
public Reader fromPointerReaderBlobDefault(SegmentReader segment, int pointer, java.nio.ByteBuffer defaultBuffer,
|
||||
public final 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,
|
||||
public final Builder fromPointerBuilderBlobDefault(SegmentBuilder segment, int pointer,
|
||||
java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize) {
|
||||
return WireHelpers.getWritableDataPointer(pointer,
|
||||
segment,
|
||||
|
@ -19,9 +20,13 @@ public final class Data {
|
|||
defaultSize);
|
||||
}
|
||||
|
||||
public Builder initSizedFromPointerBuilder(SegmentBuilder segment, int pointer, int size) {
|
||||
public final Builder initSizedFromPointerBuilder(SegmentBuilder segment, int pointer, int size) {
|
||||
return WireHelpers.initDataPointer(pointer, segment, size);
|
||||
}
|
||||
|
||||
public final void setPointerBuilder(SegmentBuilder segment, int pointer, Reader value) {
|
||||
WireHelpers.setDataPointer(pointer, segment, value);
|
||||
}
|
||||
}
|
||||
public static final Factory factory = new Factory();
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@ public final class DataList {
|
|||
}
|
||||
|
||||
public final void set(int index, Data.Reader value) {
|
||||
_getPointerElement(index).setData(value);
|
||||
_setPointerElement(Data.factory, index, value);
|
||||
}
|
||||
|
||||
public final class Iterator implements java.util.Iterator<Data.Builder> {
|
||||
|
|
|
@ -104,13 +104,6 @@ public class ListBuilder {
|
|||
(byte)(indexBit % 8));
|
||||
}
|
||||
|
||||
|
||||
protected final PointerBuilder _getPointerElement(int index) {
|
||||
return new PointerBuilder(
|
||||
this.segment,
|
||||
(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,
|
||||
|
@ -139,4 +132,11 @@ public class ListBuilder {
|
|||
(this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD,
|
||||
elementCount);
|
||||
}
|
||||
|
||||
protected final <Reader> void _setPointerElement(SetPointerBuilder<Reader> factory, int index, Reader value) {
|
||||
factory.setPointerBuilder(this.segment,
|
||||
(this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD,
|
||||
value);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,8 +1,11 @@
|
|||
package org.capnproto;
|
||||
|
||||
public abstract class ListFactory<Builder, Reader> implements ListBuilder.Factory<Builder>, FromPointerBuilder<Builder>,
|
||||
public abstract class ListFactory<Builder, Reader extends ListReader>
|
||||
implements ListBuilder.Factory<Builder>, FromPointerBuilder<Builder>,
|
||||
InitSizedFromPointerBuilder<Builder>,
|
||||
SetPointerBuilder<Reader>,
|
||||
ListReader.Factory<Reader>, FromPointerReader<Reader> {
|
||||
|
||||
final byte elementSize;
|
||||
ListFactory(byte elementSize) {this.elementSize = elementSize;}
|
||||
|
||||
|
@ -30,4 +33,8 @@ public abstract class ListFactory<Builder, Reader> implements ListBuilder.Factor
|
|||
public Builder initSizedFromPointerBuilder(SegmentBuilder segment, int pointer, int elementCount) {
|
||||
return WireHelpers.initListPointer(this, pointer, segment, elementCount, this.elementSize);
|
||||
}
|
||||
|
||||
public final void setPointerBuilder(SegmentBuilder segment, int pointer, Reader value) {
|
||||
WireHelpers.setListPointer(segment, pointer, value);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package org.capnproto;
|
||||
|
||||
public final class ListList {
|
||||
public static final class Factory<ElementBuilder, ElementReader>
|
||||
public static final class Factory<ElementBuilder, ElementReader extends ListReader>
|
||||
extends ListFactory<Builder<ElementBuilder>, Reader<ElementReader>> {
|
||||
|
||||
public final ListFactory<ElementBuilder, ElementReader> factory;
|
||||
|
|
|
@ -30,7 +30,7 @@ public final class MessageBuilder {
|
|||
throw new Error("could not allocate root pointer");
|
||||
}
|
||||
|
||||
AnyPointer.Builder ptr = new AnyPointer.Builder(PointerBuilder.getRoot(rootSegment, location));
|
||||
AnyPointer.Builder ptr = new AnyPointer.Builder(rootSegment, location);
|
||||
return ptr.initAs(factory);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,40 +0,0 @@
|
|||
package org.capnproto;
|
||||
|
||||
public final class PointerBuilder {
|
||||
final SegmentBuilder segment;
|
||||
final int pointer; // word offset
|
||||
|
||||
public PointerBuilder(SegmentBuilder segment, int pointer) {
|
||||
this.segment = segment;
|
||||
this.pointer = pointer;
|
||||
}
|
||||
|
||||
public static PointerBuilder getRoot(SegmentBuilder segment, int location) {
|
||||
return new PointerBuilder(segment, location);
|
||||
}
|
||||
|
||||
public final boolean isNull() {
|
||||
return this.segment.buffer.getLong(this.pointer) == 0;
|
||||
}
|
||||
|
||||
public final void setList(ListReader value) {
|
||||
WireHelpers.setListPointer(this.segment, this.pointer, value);
|
||||
}
|
||||
|
||||
public final void setStruct(StructReader value) {
|
||||
WireHelpers.setStructPointer(this.segment, this.pointer, value);
|
||||
}
|
||||
|
||||
public final void setText(Text.Reader value) {
|
||||
WireHelpers.setTextPointer(this.pointer, this.segment, value);
|
||||
}
|
||||
|
||||
public final void setData(Data.Reader value) {
|
||||
WireHelpers.setDataPointer(this.pointer, this.segment, value);
|
||||
}
|
||||
|
||||
public final void clear() {
|
||||
WireHelpers.zeroObject(this.segment, this.pointer);
|
||||
this.segment.buffer.putLong(this.pointer * 8, 0L);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
package org.capnproto;
|
||||
|
||||
public interface SetPointerBuilder<Reader> {
|
||||
void setPointerBuilder(SegmentBuilder segment, int pointer, Reader value);
|
||||
}
|
|
@ -149,8 +149,14 @@ public class StructBuilder {
|
|||
Double.doubleToLongBits(value) ^ mask);
|
||||
}
|
||||
|
||||
protected final PointerBuilder _getPointerField(int index) {
|
||||
return new PointerBuilder(this.segment, this.pointers + index);
|
||||
protected final boolean _pointerFieldIsNull(int ptrIndex) {
|
||||
return this.segment.buffer.getLong((this.pointers + ptrIndex) * Constants.BYTES_PER_WORD) == 0;
|
||||
}
|
||||
|
||||
protected final void _clearPointerField(int ptrIndex) {
|
||||
int pointer = this.pointers + ptrIndex;
|
||||
WireHelpers.zeroObject(this.segment, pointer);
|
||||
this.segment.buffer.putLong(pointer * 8, 0L);
|
||||
}
|
||||
|
||||
protected final <T> T _getPointerField(FromPointerBuilder<T> factory, int index, SegmentReader defaultSegment, int defaultOffset) {
|
||||
|
@ -170,4 +176,8 @@ public class StructBuilder {
|
|||
return factory.initSizedFromPointerBuilder(this.segment, this.pointers + index, elementCount);
|
||||
}
|
||||
|
||||
protected final <Reader> void _setPointerField(SetPointerBuilder<Reader> factory, int index, Reader value) {
|
||||
factory.setPointerBuilder(this.segment, this.pointers + index, value);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
package org.capnproto;
|
||||
|
||||
public abstract class StructFactory<Builder, Reader> implements FromPointerBuilder<Builder>, StructBuilder.Factory<Builder>,
|
||||
public abstract class StructFactory<Builder, Reader extends StructReader>
|
||||
implements FromPointerBuilder<Builder>, StructBuilder.Factory<Builder>,
|
||||
InitFromPointerBuilder<Builder>,
|
||||
SetPointerBuilder<Reader>,
|
||||
FromPointerReader<Reader>, StructReader.Factory<Reader> {
|
||||
public final Reader fromPointerReader(SegmentReader segment, int pointer,
|
||||
SegmentReader defaultSegment, int defaultOffset,
|
||||
|
@ -20,5 +22,9 @@ public abstract class StructFactory<Builder, Reader> implements FromPointerBuild
|
|||
return WireHelpers.initStructPointer(this, pointer, segment, this.structSize());
|
||||
}
|
||||
|
||||
public final void setPointerBuilder(SegmentBuilder segment, int pointer, Reader value) {
|
||||
WireHelpers.setStructPointer(segment, pointer, value);
|
||||
}
|
||||
|
||||
public abstract Reader asReader(Builder builder);
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package org.capnproto;
|
||||
|
||||
public final class StructList {
|
||||
public static final class Factory<ElementBuilder, ElementReader>
|
||||
public static final class Factory<ElementBuilder extends StructBuilder, ElementReader extends StructReader>
|
||||
extends ListFactory<Builder<ElementBuilder>, Reader<ElementReader>> {
|
||||
|
||||
public final StructFactory<ElementBuilder, ElementReader> factory;
|
||||
|
|
|
@ -136,7 +136,7 @@ public class StructReader {
|
|||
}
|
||||
|
||||
protected final boolean _pointerFieldIsNull(int ptrIndex) {
|
||||
return this.segment.buffer.getLong(this.pointers + ptrIndex) == 0;
|
||||
return this.segment.buffer.getLong((this.pointers + ptrIndex) * Constants.BYTES_PER_WORD) == 0;
|
||||
}
|
||||
|
||||
protected final <T> T _getPointerField(FromPointerReader<T> factory, int ptrIndex, SegmentReader defaultSegment, int defaultOffset) {
|
||||
|
|
|
@ -5,13 +5,14 @@ import java.nio.ByteBuffer;
|
|||
public final class Text {
|
||||
public static final class Factory implements FromPointerReaderBlobDefault<Reader>,
|
||||
FromPointerBuilderBlobDefault<Builder>,
|
||||
SetPointerBuilder<Reader>,
|
||||
InitSizedFromPointerBuilder<Builder> {
|
||||
public Reader fromPointerReaderBlobDefault(SegmentReader segment, int pointer, java.nio.ByteBuffer defaultBuffer,
|
||||
public final 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,
|
||||
public final Builder fromPointerBuilderBlobDefault(SegmentBuilder segment, int pointer,
|
||||
java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize) {
|
||||
return WireHelpers.getWritableTextPointer(pointer,
|
||||
segment,
|
||||
|
@ -20,9 +21,13 @@ public final class Text {
|
|||
defaultSize);
|
||||
}
|
||||
|
||||
public Builder initSizedFromPointerBuilder(SegmentBuilder segment, int pointer, int size) {
|
||||
public final Builder initSizedFromPointerBuilder(SegmentBuilder segment, int pointer, int size) {
|
||||
return WireHelpers.initTextPointer(pointer, segment, size);
|
||||
}
|
||||
|
||||
public final void setPointerBuilder(SegmentBuilder segment, int pointer, Reader value) {
|
||||
WireHelpers.setTextPointer(pointer, segment, value);
|
||||
}
|
||||
}
|
||||
public static final Factory factory = new Factory();
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@ public final class TextList {
|
|||
}
|
||||
|
||||
public final void set(int index, Text.Reader value) {
|
||||
_getPointerElement(index).setText(value);
|
||||
_setPointerElement(Text.factory, index, value);
|
||||
}
|
||||
|
||||
public final class Iterator implements java.util.Iterator<Text.Builder> {
|
||||
|
|
|
@ -114,12 +114,10 @@ class LayoutSuite extends FunSuite {
|
|||
val buffer = java.nio.ByteBuffer.allocate(1024 * 8);
|
||||
buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN);
|
||||
|
||||
val pointerBuilder = PointerBuilder.getRoot(
|
||||
new SegmentBuilder(buffer, new BuilderArena(BuilderArena.SUGGESTED_FIRST_SEGMENT_WORDS,
|
||||
BuilderArena.SUGGESTED_ALLOCATION_STRATEGY)),
|
||||
0);
|
||||
val segment = new SegmentBuilder(buffer, new BuilderArena(BuilderArena.SUGGESTED_FIRST_SEGMENT_WORDS,
|
||||
BuilderArena.SUGGESTED_ALLOCATION_STRATEGY))
|
||||
val factory = new BareStructBuilder(new StructSize(2, 4, FieldSize.INLINE_COMPOSITE));
|
||||
val builder = WireHelpers.initStructPointer(factory, pointerBuilder.pointer, pointerBuilder.segment, factory.structSize());
|
||||
val builder = WireHelpers.initStructPointer(factory, 0, segment, factory.structSize());
|
||||
setupStruct(builder);
|
||||
checkStruct(builder);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue