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.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);

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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