eradicate PointerBuilder

This commit is contained in:
David Renshaw 2014-10-08 12:22:58 -04:00
parent b876c52ecd
commit 6e9a325ca5
18 changed files with 95 additions and 93 deletions

View file

@ -11,10 +11,13 @@ import org.capnproto.StructFactory;
import org.capnproto.MessageBuilder; import org.capnproto.MessageBuilder;
import org.capnproto.MessageReader; import org.capnproto.MessageReader;
public abstract class TestCase<RequestFactory extends StructFactory<RequestBuilder, RequestReader>, public abstract class TestCase<RequestFactory extends
RequestBuilder, RequestReader, StructFactory<RequestBuilder, RequestReader>,
RequestBuilder extends org.capnproto.StructBuilder,
RequestReader extends org.capnproto.StructReader,
ResponseFactory extends StructFactory<ResponseBuilder, ResponseReader>, 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 Expectation setupRequest(Common.FastRand rng, RequestBuilder request);
public abstract void handleRequest(RequestReader request, ResponseBuilder response); public abstract void handleRequest(RequestReader request, ResponseBuilder response);
public abstract boolean checkResponse(ResponseReader response, Expectation expected); public abstract boolean checkResponse(ResponseReader response, Expectation expected);

View file

@ -763,7 +763,7 @@ private:
");\n"); ");\n");
case Section::POINTERS: case Section::POINTERS:
return kj::strTree( return kj::strTree(
spaces(indent), " _getPointerField(", slot.offset, ").clear();\n"); spaces(indent), " _clearPointerField(", slot.offset, ");\n");
} }
KJ_UNREACHABLE; KJ_UNREACHABLE;
}, },
@ -947,20 +947,20 @@ private:
kj::strTree( kj::strTree(
kj::mv(unionDiscrim.builderIsDecl), kj::mv(unionDiscrim.builderIsDecl),
spaces(indent), " public final boolean has", titleCase, "() {\n", 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), " }\n",
spaces(indent), " public org.capnproto.AnyPointer.Builder get", titleCase, "() {\n", spaces(indent), " public org.capnproto.AnyPointer.Builder get", titleCase, "() {\n",
unionDiscrim.check, unionDiscrim.check,
spaces(indent), " return new org.capnproto.AnyPointer.Builder(_getPointerField(", spaces(indent), " return new org.capnproto.AnyPointer.Builder(this.segment, this.pointers + ",
offset, "));\n", offset, ");\n",
spaces(indent), " }\n", spaces(indent), " }\n",
spaces(indent), " public org.capnproto.AnyPointer.Builder init", titleCase, "() {\n", spaces(indent), " public org.capnproto.AnyPointer.Builder init", titleCase, "() {\n",
unionDiscrim.set, unionDiscrim.set,
spaces(indent), " org.capnproto.AnyPointer.Builder result =\n", spaces(indent), " org.capnproto.AnyPointer.Builder result =\n",
spaces(indent), " new org.capnproto.AnyPointer.Builder(_getPointerField(", spaces(indent), " new org.capnproto.AnyPointer.Builder(this.segment, this.pointers +",
offset, "));\n", offset, ");\n",
spaces(indent), " result.clear();\n", spaces(indent), " result.clear();\n",
spaces(indent), " return result;\n", spaces(indent), " return result;\n",
spaces(indent), " }\n", spaces(indent), " }\n",
@ -994,7 +994,7 @@ private:
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,
spaces(indent), " _getPointerField(", offset, ").setStruct(value);\n", spaces(indent), " _setPointerField(", type, ".factory,", offset, ", value);\n",
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,
@ -1031,7 +1031,7 @@ private:
kj::mv(unionDiscrim.builderIsDecl), kj::mv(unionDiscrim.builderIsDecl),
spaces(indent), " public final boolean has", titleCase, "() {\n", spaces(indent), " public final boolean has", titleCase, "() {\n",
unionDiscrim.has, unionDiscrim.has,
spaces(indent), " return !_getPointerField(", offset, ").isNull();\n", spaces(indent), " return !_pointerFieldIsNull(", offset, ");\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(", factory, ", ", spaces(indent), " return _getPointerField(", factory, ", ",
@ -1039,11 +1039,11 @@ private:
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,
spaces(indent), " _getPointerField(", offset, ").set", blobKind, "(value);\n", spaces(indent), " _setPointerField(", factory, ", ", offset, ", value);\n",
spaces(indent), " }\n", spaces(indent), " }\n",
spaces(indent), " public final void set", titleCase, "(", setterInputType, " value) {\n", spaces(indent), " public final void set", titleCase, "(", setterInputType, " value) {\n",
unionDiscrim.set, unionDiscrim.set,
spaces(indent), " _getPointerField(", offset, ").set", blobKind, "( new", spaces(indent), " _setPointerField(", factory, ", ", offset, ", new",
type, ".Reader(value));\n", type, ".Reader(value));\n",
spaces(indent), " }\n", spaces(indent), " }\n",
@ -1077,7 +1077,7 @@ private:
kj::strTree( kj::strTree(
kj::mv(unionDiscrim.builderIsDecl), kj::mv(unionDiscrim.builderIsDecl),
spaces(indent), " public final boolean has", titleCase, "() {\n", 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), " }\n",
spaces(indent), " public final ", builderClass, spaces(indent), " public final ", builderClass,
@ -1086,7 +1086,7 @@ private:
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",
spaces(indent), " _getPointerField(", offset, ").setList(value);\n", spaces(indent), " _setPointerField(", listFactory, ", ", offset, ", value);\n",
spaces(indent), " }\n", spaces(indent), " }\n",
spaces(indent), " public final ", builderClass, spaces(indent), " public final ", builderClass,

View file

@ -19,22 +19,25 @@ public final class AnyPointer {
} }
public static final class Builder { public static final class Builder {
public final PointerBuilder builder; final SegmentBuilder segment;
final int pointer;
public Builder(PointerBuilder builder) { public Builder(SegmentBuilder segment, int pointer) {
this.builder = builder; this.segment = segment;
this.pointer = pointer;
} }
public final <T> T initAs(InitFromPointerBuilder<T> factory) { 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) { 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() { public final void clear() {
this.builder.clear(); WireHelpers.zeroObject(this.segment, this.pointer);
this.segment.buffer.putLong(this.pointer * 8, 0L);
} }
} }

View file

@ -5,12 +5,13 @@ import java.nio.ByteBuffer;
public final class Data { public final class Data {
public static final class Factory implements FromPointerReaderBlobDefault<Reader>, public static final class Factory implements FromPointerReaderBlobDefault<Reader>,
FromPointerBuilderBlobDefault<Builder>, FromPointerBuilderBlobDefault<Builder>,
SetPointerBuilder<Reader>,
InitSizedFromPointerBuilder<Builder> { 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) { int defaultOffset, int defaultSize) {
return WireHelpers.readDataPointer(segment, pointer, defaultBuffer, defaultOffset, 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) { java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize) {
return WireHelpers.getWritableDataPointer(pointer, return WireHelpers.getWritableDataPointer(pointer,
segment, segment,
@ -19,9 +20,13 @@ public final class Data {
defaultSize); 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); 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(); public static final Factory factory = new Factory();

View file

@ -69,7 +69,7 @@ public final class DataList {
} }
public final void set(int index, Data.Reader value) { 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> { public final class Iterator implements java.util.Iterator<Data.Builder> {

View file

@ -104,13 +104,6 @@ public class ListBuilder {
(byte)(indexBit % 8)); (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) { protected final <T> T _getPointerElement(FromPointerBuilder<T> factory, int index, SegmentReader defaultSegment, int defaultOffset) {
return factory.fromPointerBuilder( return factory.fromPointerBuilder(
this.segment, this.segment,
@ -139,4 +132,11 @@ 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,
elementCount); 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);
}
} }

View file

@ -1,8 +1,11 @@
package org.capnproto; 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>, InitSizedFromPointerBuilder<Builder>,
SetPointerBuilder<Reader>,
ListReader.Factory<Reader>, FromPointerReader<Reader> { ListReader.Factory<Reader>, FromPointerReader<Reader> {
final byte elementSize; final byte elementSize;
ListFactory(byte elementSize) {this.elementSize = 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) { public Builder initSizedFromPointerBuilder(SegmentBuilder segment, int pointer, int elementCount) {
return WireHelpers.initListPointer(this, pointer, segment, elementCount, this.elementSize); return WireHelpers.initListPointer(this, pointer, segment, elementCount, this.elementSize);
} }
public final void setPointerBuilder(SegmentBuilder segment, int pointer, Reader value) {
WireHelpers.setListPointer(segment, pointer, value);
}
} }

View file

@ -1,7 +1,7 @@
package org.capnproto; package org.capnproto;
public final class ListList { 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>> { extends ListFactory<Builder<ElementBuilder>, Reader<ElementReader>> {
public final ListFactory<ElementBuilder, ElementReader> factory; public final ListFactory<ElementBuilder, ElementReader> factory;

View file

@ -30,7 +30,7 @@ public final class MessageBuilder {
throw new Error("could not allocate root pointer"); 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); return ptr.initAs(factory);
} }

View file

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

View file

@ -0,0 +1,5 @@
package org.capnproto;
public interface SetPointerBuilder<Reader> {
void setPointerBuilder(SegmentBuilder segment, int pointer, Reader value);
}

View file

@ -149,8 +149,14 @@ public class StructBuilder {
Double.doubleToLongBits(value) ^ mask); Double.doubleToLongBits(value) ^ mask);
} }
protected final PointerBuilder _getPointerField(int index) { protected final boolean _pointerFieldIsNull(int ptrIndex) {
return new PointerBuilder(this.segment, this.pointers + index); 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) { 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); 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);
}
} }

View file

@ -1,7 +1,9 @@
package org.capnproto; 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>, InitFromPointerBuilder<Builder>,
SetPointerBuilder<Reader>,
FromPointerReader<Reader>, StructReader.Factory<Reader> { FromPointerReader<Reader>, StructReader.Factory<Reader> {
public final Reader fromPointerReader(SegmentReader segment, int pointer, public final Reader fromPointerReader(SegmentReader segment, int pointer,
SegmentReader defaultSegment, int defaultOffset, SegmentReader defaultSegment, int defaultOffset,
@ -20,5 +22,9 @@ public abstract class StructFactory<Builder, Reader> implements FromPointerBuild
return WireHelpers.initStructPointer(this, pointer, segment, this.structSize()); 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); public abstract Reader asReader(Builder builder);
} }

View file

@ -1,7 +1,7 @@
package org.capnproto; package org.capnproto;
public final class StructList { 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>> { extends ListFactory<Builder<ElementBuilder>, Reader<ElementReader>> {
public final StructFactory<ElementBuilder, ElementReader> factory; public final StructFactory<ElementBuilder, ElementReader> factory;

View file

@ -136,7 +136,7 @@ public class StructReader {
} }
protected final boolean _pointerFieldIsNull(int ptrIndex) { 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) { protected final <T> T _getPointerField(FromPointerReader<T> factory, int ptrIndex, SegmentReader defaultSegment, int defaultOffset) {

View file

@ -5,13 +5,14 @@ import java.nio.ByteBuffer;
public final class Text { public final class Text {
public static final class Factory implements FromPointerReaderBlobDefault<Reader>, public static final class Factory implements FromPointerReaderBlobDefault<Reader>,
FromPointerBuilderBlobDefault<Builder>, FromPointerBuilderBlobDefault<Builder>,
SetPointerBuilder<Reader>,
InitSizedFromPointerBuilder<Builder> { 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) { int defaultOffset, int defaultSize) {
return WireHelpers.readTextPointer(segment, pointer, defaultBuffer, defaultOffset, 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) { java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize) {
return WireHelpers.getWritableTextPointer(pointer, return WireHelpers.getWritableTextPointer(pointer,
segment, segment,
@ -20,9 +21,13 @@ public final class Text {
defaultSize); 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); 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(); public static final Factory factory = new Factory();

View file

@ -69,7 +69,7 @@ public final class TextList {
} }
public final void set(int index, Text.Reader value) { 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> { public final class Iterator implements java.util.Iterator<Text.Builder> {

View file

@ -114,12 +114,10 @@ class LayoutSuite extends FunSuite {
val buffer = java.nio.ByteBuffer.allocate(1024 * 8); val buffer = java.nio.ByteBuffer.allocate(1024 * 8);
buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN); buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN);
val pointerBuilder = PointerBuilder.getRoot( val segment = new SegmentBuilder(buffer, new BuilderArena(BuilderArena.SUGGESTED_FIRST_SEGMENT_WORDS,
new SegmentBuilder(buffer, new BuilderArena(BuilderArena.SUGGESTED_FIRST_SEGMENT_WORDS, BuilderArena.SUGGESTED_ALLOCATION_STRATEGY))
BuilderArena.SUGGESTED_ALLOCATION_STRATEGY)),
0);
val factory = new BareStructBuilder(new StructSize(2, 4, FieldSize.INLINE_COMPOSITE)); 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); setupStruct(builder);
checkStruct(builder); checkStruct(builder);
} }