abstracting

This commit is contained in:
David Renshaw 2014-10-07 22:35:08 -04:00
parent a3c836c619
commit 4d842f0ef7
21 changed files with 78 additions and 84 deletions

View file

@ -981,17 +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 ", spaces(indent), " return ", type, ".factory.fromPointerReader(",
"_getPointerField(", offset,").getStruct(", type, ".factory,", defaultParams, ");\n", "_getPointerField(", 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 ", spaces(indent), " return ", type, ".factory.fromPointerBuilder("
"_getPointerField(", offset, ").getStruct(", "_getPointerField(", offset, "),", defaultParams,");\n",
type, ".factory,", 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,
@ -999,9 +998,8 @@ 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 ", spaces(indent), " return ", type, ".factory.initFromPointerBuilder(",
"_getPointerField(", offset, ").initStruct(", "_getPointerField(", offset, "));\n",
type, ".factory", ");\n",
spaces(indent), " }\n"), spaces(indent), " }\n"),
}; };
@ -1094,7 +1092,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, ").initFromPointerBuilder(_getPointerField(", offset, "), size);\n", spaces(indent), " return (", listFactory, ").initSizedFromPointerBuilder(_getPointerField(", offset, "), size);\n",
spaces(indent), " }\n"), spaces(indent), " }\n"),
}; };
} else { } else {
@ -1187,7 +1185,7 @@ private:
",(short)", structNode.getPointerCount(), ",(short)", structNode.getPointerCount(),
", org.capnproto.FieldSize.", FIELD_SIZE_NAMES[(int)structNode.getPreferredListEncoding()], ");\n"), ", org.capnproto.FieldSize.", FIELD_SIZE_NAMES[(int)structNode.getPreferredListEncoding()], ");\n"),
spaces(indent), " public static class Factory implements org.capnproto.StructFactory<Builder, Reader> {\n", spaces(indent), " public static class Factory extends org.capnproto.StructFactory<Builder, Reader> {\n",
spaces(indent), spaces(indent),
" public final Reader constructReader(org.capnproto.SegmentReader segment, int data,", " public final Reader constructReader(org.capnproto.SegmentReader segment, int data,",
"int pointers, int dataSize, short pointerCount, byte bit0Offset, int nestingLimit) {\n", "int pointers, int dataSize, short pointerCount, byte bit0Offset, int nestingLimit) {\n",
@ -1303,10 +1301,9 @@ 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), " ", spaces(indent), " ", typeName_, ".factory.fromPointerReader"
"(new org.capnproto.PointerReader(Schemas.b_", "(new org.capnproto.PointerReader(Schemas.b_",
kj::hex(proto.getId()), ",", schema.getValueSchemaOffset(), ",0x7fffffff)).getStruct(", kj::hex(proto.getId()), ",", schema.getValueSchemaOffset(), ",0x7fffffff), null, 0);\n")
typeName_, ".factory"");\n")
}; };
} }
@ -1319,7 +1316,7 @@ private:
"public static final ", constType, ' ', upperCase, " =\n", "public static final ", constType, ' ', upperCase, " =\n",
spaces(indent), " (", spaces(indent), " (",
"new org.capnproto.AnyPointer.Reader(new org.capnproto.PointerReader(Schemas.b_", "new org.capnproto.AnyPointer.Reader(new org.capnproto.PointerReader(Schemas.b_",
kj::hex(proto.getId()), ",", schema.getValueSchemaOffset(), ",0x7fffffff)).getAsList(", kj::hex(proto.getId()), ",", schema.getValueSchemaOffset(), ",0x7fffffff)).getAs(",
makeListFactoryArg(type), "));\n") makeListFactoryArg(type), "));\n")
}; };
} }

View file

@ -103,7 +103,7 @@ class EncodingSuite extends FunSuite {
val oldReader = { val oldReader = {
val oldVersion = root.getAnyPointerField().initAsStruct(TestOldVersion.factory); val oldVersion = root.getAnyPointerField().initAs(TestOldVersion.factory);
oldVersion.setOld1(123); oldVersion.setOld1(123);
oldVersion.setOld2("foo"); oldVersion.setOld2("foo");
val sub = oldVersion.initOld3(); val sub = oldVersion.initOld3();

View file

@ -9,11 +9,7 @@ public final class AnyPointer {
this.reader = reader; this.reader = reader;
} }
public final <T> T getAsStruct(StructReader.Factory<T> factory) { public final <T> T getAs(FromPointerReader<T> factory) {
return this.reader.getStruct(factory);
}
public final <T> T getAsList(FromPointerReader<T> factory) {
return factory.fromPointerReader(this.reader, null, 0); return factory.fromPointerReader(this.reader, null, 0);
} }
} }
@ -25,8 +21,12 @@ public final class AnyPointer {
this.builder = builder; this.builder = builder;
} }
public final <T> T initAsStruct(StructBuilder.Factory<T> factory) { public final <T> T initAs(InitFromPointerBuilder<T> factory) {
return this.builder.initStruct(factory); return factory.initFromPointerBuilder(this.builder);
}
public final <T> T initAs(InitSizedFromPointerBuilder<T> factory, int elementCount) {
return factory.initSizedFromPointerBuilder(this.builder, elementCount);
} }
public final void clear() { public final void clear() {

View file

@ -36,7 +36,7 @@ public final class DataList {
defaultOffset); defaultOffset);
} }
public final Builder initFromPointerBuilder(PointerBuilder builder, int elementCount) { public final Builder initSizedFromPointerBuilder(PointerBuilder builder, int elementCount) {
return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.POINTER); return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.POINTER);
} }
} }

View file

@ -50,7 +50,7 @@ public class EnumList {
defaultOffset); defaultOffset);
} }
public final Builder<T> initFromPointerBuilder(PointerBuilder builder, int elementCount) { public final Builder<T> initSizedFromPointerBuilder(PointerBuilder builder, int elementCount) {
return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.TWO_BYTES); return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.TWO_BYTES);
} }
} }

View file

@ -2,5 +2,4 @@ package org.capnproto;
public interface FromPointerBuilder<T> { public interface FromPointerBuilder<T> {
T fromPointerBuilder(PointerBuilder builder, SegmentReader defaultSegment, int defaultOffset); T fromPointerBuilder(PointerBuilder builder, SegmentReader defaultSegment, int defaultOffset);
T initFromPointerBuilder(PointerBuilder builder, int elementCount);
} }

View file

@ -0,0 +1,5 @@
package org.capnproto;
public interface InitFromPointerBuilder<T> {
T initFromPointerBuilder(PointerBuilder builder);
}

View file

@ -0,0 +1,5 @@
package org.capnproto;
public interface InitSizedFromPointerBuilder<T> {
T initSizedFromPointerBuilder(PointerBuilder builder, int elementCount);
}

View file

@ -1,6 +1,7 @@
package org.capnproto; package org.capnproto;
public interface ListFactory<Builder, Reader> extends ListBuilder.Factory<Builder>, FromPointerBuilder<Builder>, public interface ListFactory<Builder, Reader> extends ListBuilder.Factory<Builder>, FromPointerBuilder<Builder>,
InitSizedFromPointerBuilder<Builder>,
ListReader.Factory<Reader>, FromPointerReader<Reader> { ListReader.Factory<Reader>, FromPointerReader<Reader> {
} }

View file

@ -44,7 +44,7 @@ public final class ListList {
defaultOffset); defaultOffset);
} }
public final Builder<ElementBuilder> initFromPointerBuilder(PointerBuilder builder, public final Builder<ElementBuilder> initSizedFromPointerBuilder(PointerBuilder builder,
int elementCount) { int elementCount) {
return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.POINTER); return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.POINTER);
} }
@ -70,9 +70,9 @@ public final class ListList {
} }
public static final class Builder<T> extends ListBuilder { public static final class Builder<T> extends ListBuilder {
private final FromPointerBuilder<T> factory; private final ListFactory<T, ?> factory;
public Builder(FromPointerBuilder<T> factory, public Builder(ListFactory<T, ?> factory,
SegmentBuilder segment, int ptr, SegmentBuilder segment, int ptr,
int elementCount, int step, int elementCount, int step,
int structDataSize, short structPointerCount){ int structDataSize, short structPointerCount){
@ -81,7 +81,7 @@ public final class ListList {
} }
public final T init(int index, int size) { public final T init(int index, int size) {
return this.factory.initFromPointerBuilder(_getPointerElement(index), size); return this.factory.initSizedFromPointerBuilder(_getPointerElement(index), size);
} }
public final T get(int index) { public final T get(int index) {

View file

@ -23,7 +23,7 @@ public final class MessageBuilder {
throw new Error("unimplemented"); throw new Error("unimplemented");
} }
public <T> T initRoot(StructBuilder.Factory <T> factory) { public <T> T initRoot(InitFromPointerBuilder<T> factory) {
SegmentBuilder rootSegment = this.arena.segments.get(0); SegmentBuilder rootSegment = this.arena.segments.get(0);
int location = rootSegment.allocate(1); int location = rootSegment.allocate(1);
if (location == SegmentBuilder.FAILED_ALLOCATION) { if (location == SegmentBuilder.FAILED_ALLOCATION) {
@ -31,7 +31,7 @@ public final class MessageBuilder {
} }
AnyPointer.Builder ptr = new AnyPointer.Builder(PointerBuilder.getRoot(rootSegment, location)); AnyPointer.Builder ptr = new AnyPointer.Builder(PointerBuilder.getRoot(rootSegment, location));
return ptr.initAsStruct(factory); return ptr.initAs(factory);
} }
public final java.nio.ByteBuffer[] getSegmentsForOutput() { public final java.nio.ByteBuffer[] getSegmentsForOutput() {

View file

@ -9,11 +9,11 @@ public final class MessageReader {
this.arena = new ReaderArena(segmentSlices); this.arena = new ReaderArena(segmentSlices);
} }
public <T> T getRoot(StructReader.Factory<T> factory) { public <T> T getRoot(FromPointerReader<T> factory) {
SegmentReader segment = this.arena.tryGetSegment(0); SegmentReader segment = this.arena.tryGetSegment(0);
PointerReader pointerReader = PointerReader.getRoot(segment, 0, PointerReader pointerReader = PointerReader.getRoot(segment, 0,
0x7fffffff /* XXX */); 0x7fffffff /* XXX */);
AnyPointer.Reader any = new AnyPointer.Reader(pointerReader); AnyPointer.Reader any = new AnyPointer.Reader(pointerReader);
return any.getAsStruct(factory); return any.getAs(factory);
} }
} }

View file

@ -18,15 +18,6 @@ public final class PointerBuilder {
} }
public final <T> T getStruct(StructBuilder.Factory<T> factory) {
return WireHelpers.getWritableStructPointer(factory, this.pointer, this.segment, factory.structSize(), null, 0);
}
public final <T> T getStruct(StructBuilder.Factory<T> factory, SegmentReader defaultReader, int defaultOffset) {
return WireHelpers.getWritableStructPointer(factory, this.pointer, this.segment, factory.structSize(),
defaultReader, defaultOffset);
}
public final Text.Builder getText() { public final Text.Builder getText() {
return WireHelpers.getWritableTextPointer( return WireHelpers.getWritableTextPointer(
this.pointer, this.segment, null, 0, 0); this.pointer, this.segment, null, 0, 0);
@ -54,10 +45,6 @@ public final class PointerBuilder {
defaultSize); defaultSize);
} }
public final <T> T initStruct(StructBuilder.Factory<T> factory) {
return WireHelpers.initStructPointer(factory, this.pointer, this.segment, factory.structSize());
}
public final Text.Builder initText(int size) { public final Text.Builder initText(int size) {
return WireHelpers.initTextPointer(this.pointer, this.segment, size); return WireHelpers.initTextPointer(this.pointer, this.segment, size);
} }

View file

@ -28,22 +28,6 @@ public final class PointerReader {
return this.segment.buffer.getLong(this.pointer) == 0; return this.segment.buffer.getLong(this.pointer) == 0;
} }
public <T> T getStruct(StructReader.Factory<T> factory) {
return WireHelpers.readStructPointer(factory,
this.segment,
this.pointer,
null, 0,
this.nestingLimit);
}
public <T> T getStruct(StructReader.Factory<T> factory, SegmentReader defaultSegment, int defaultOffset) {
return WireHelpers.readStructPointer(factory,
this.segment,
this.pointer,
defaultSegment, defaultOffset,
this.nestingLimit);
}
public Text.Reader getText() { public Text.Reader getText() {
return WireHelpers.readTextPointer(this.segment, this.pointer, null, 0, 0); return WireHelpers.readTextPointer(this.segment, this.pointer, null, 0, 0);
} }

View file

@ -37,7 +37,7 @@ public class PrimitiveList {
defaultOffset); defaultOffset);
} }
public final Builder initFromPointerBuilder(PointerBuilder builder, int elementCount) { public final Builder initSizedFromPointerBuilder(PointerBuilder builder, int elementCount) {
return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.VOID); return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.VOID);
} }
} }
@ -102,7 +102,7 @@ public class PrimitiveList {
defaultOffset); defaultOffset);
} }
public final Builder initFromPointerBuilder(PointerBuilder builder, int elementCount) { public final Builder initSizedFromPointerBuilder(PointerBuilder builder, int elementCount) {
return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.BIT); return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.BIT);
} }
} }
@ -175,7 +175,7 @@ public class PrimitiveList {
defaultOffset); defaultOffset);
} }
public final Builder initFromPointerBuilder(PointerBuilder builder, int elementCount) { public final Builder initSizedFromPointerBuilder(PointerBuilder builder, int elementCount) {
return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.BYTE); return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.BYTE);
} }
} }
@ -249,7 +249,7 @@ public class PrimitiveList {
defaultOffset); defaultOffset);
} }
public final Builder initFromPointerBuilder(PointerBuilder builder, int elementCount) { public final Builder initSizedFromPointerBuilder(PointerBuilder builder, int elementCount) {
return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.TWO_BYTES); return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.TWO_BYTES);
} }
} }
@ -323,7 +323,7 @@ public class PrimitiveList {
defaultOffset); defaultOffset);
} }
public final Builder initFromPointerBuilder(PointerBuilder builder, int elementCount) { public final Builder initSizedFromPointerBuilder(PointerBuilder builder, int elementCount) {
return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.FOUR_BYTES); return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.FOUR_BYTES);
} }
} }
@ -397,7 +397,7 @@ public class PrimitiveList {
defaultOffset); defaultOffset);
} }
public final Builder initFromPointerBuilder(PointerBuilder builder, int elementCount) { public final Builder initSizedFromPointerBuilder(PointerBuilder builder, int elementCount) {
return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.FOUR_BYTES); return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.FOUR_BYTES);
} }
@ -472,7 +472,7 @@ public class PrimitiveList {
defaultOffset); defaultOffset);
} }
public final Builder initFromPointerBuilder(PointerBuilder builder, int elementCount) { public final Builder initSizedFromPointerBuilder(PointerBuilder builder, int elementCount) {
return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.EIGHT_BYTES); return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.EIGHT_BYTES);
} }
} }
@ -545,7 +545,7 @@ public class PrimitiveList {
defaultOffset); defaultOffset);
} }
public final Builder initFromPointerBuilder(PointerBuilder builder, int elementCount) { public final Builder initSizedFromPointerBuilder(PointerBuilder builder, int elementCount) {
return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.EIGHT_BYTES); return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.EIGHT_BYTES);
} }
} }

View file

@ -1,10 +1,9 @@
package org.capnproto; package org.capnproto;
public class StructBuilder { public class StructBuilder {
public interface Factory<T> { public interface Factory<T> {
T constructBuilder(SegmentBuilder segment, int data, int pointers, int dataSize, T constructBuilder(SegmentBuilder segment, int data, int pointers, int dataSize,
short pointerCount, byte bit0Offset); short pointerCount, byte bit0Offset);
StructSize structSize(); StructSize structSize();
} }

View file

@ -1,5 +1,21 @@
package org.capnproto; package org.capnproto;
public interface StructFactory<Builder, Reader> extends StructBuilder.Factory<Builder>, StructReader.Factory<Reader>{ public abstract class StructFactory<Builder, Reader> implements FromPointerBuilder<Builder>, StructBuilder.Factory<Builder>,
public Reader asReader(Builder builder); InitFromPointerBuilder<Builder>,
FromPointerReader<Reader>, StructReader.Factory<Reader> {
public Builder fromPointerBuilder(PointerBuilder builder, SegmentReader defaultSegment, int defaultOffset) {
return WireHelpers.getWritableStructPointer(this, builder.pointer, builder.segment, this.structSize(),
defaultSegment, defaultOffset);
}
public Builder initFromPointerBuilder(PointerBuilder builder) {
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);
} }

View file

@ -45,7 +45,7 @@ public final class StructList {
defaultOffset); defaultOffset);
} }
public final Builder<ElementBuilder> initFromPointerBuilder(PointerBuilder builder, public final Builder<ElementBuilder> initSizedFromPointerBuilder(PointerBuilder builder,
int elementCount) { int elementCount) {
return WireHelpers.initStructListPointer(this, builder.pointer, builder.segment, elementCount, factory.structSize()); return WireHelpers.initStructListPointer(this, builder.pointer, builder.segment, elementCount, factory.structSize());
} }

View file

@ -1,11 +1,10 @@
package org.capnproto; package org.capnproto;
public class StructReader { public class StructReader {
public interface Factory<T> { public interface Factory<T> {
T constructReader(SegmentReader segment, int data, int pointers, abstract T constructReader(SegmentReader segment, int data, int pointers,
int dataSize, short pointerCount, int dataSize, short pointerCount,
byte bit0Offset, int nestingLimit); byte bit0Offset, int nestingLimit);
} }
protected final SegmentReader segment; protected final SegmentReader segment;

View file

@ -36,7 +36,7 @@ public final class TextList {
defaultOffset); defaultOffset);
} }
public final Builder initFromPointerBuilder(PointerBuilder builder, int elementCount) { public final Builder initSizedFromPointerBuilder(PointerBuilder builder, int elementCount) {
return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.POINTER); return WireHelpers.initListPointer(this, builder.pointer, builder.segment, elementCount, FieldSize.POINTER);
} }

View file

@ -12,7 +12,6 @@ class LayoutSuite extends FunSuite {
} }
} }
test("SimpleRawDataStruct") { test("SimpleRawDataStruct") {
val data : Array[Byte] = val data : Array[Byte] =
Array(0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, Array(0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
@ -24,7 +23,10 @@ class LayoutSuite extends FunSuite {
val arena = new ReaderArena(Array(buffer)); val arena = new ReaderArena(Array(buffer));
val pointerReader = new PointerReader(arena.tryGetSegment(0), 0, 0x7fffffff); val pointerReader = new PointerReader(arena.tryGetSegment(0), 0, 0x7fffffff);
val reader = pointerReader.getStruct(new BareStructReader());
val reader = WireHelpers.readStructPointer(new BareStructReader(),
pointerReader.segment,
pointerReader.pointer, null, 0, 0x7fffffff);
assert(reader._getLongField(0) === 0xefcdab8967452301L); assert(reader._getLongField(0) === 0xefcdab8967452301L);
assert(reader._getLongField(1) === 0L); assert(reader._getLongField(1) === 0L);
@ -117,9 +119,9 @@ class LayoutSuite extends FunSuite {
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); 0);
val builder = pointerBuilder.initStruct(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());
setupStruct(builder); setupStruct(builder);
checkStruct(builder); checkStruct(builder);
} }