list reader defaults

This commit is contained in:
David Renshaw 2014-10-06 14:54:15 -04:00
parent de33553666
commit 195d688970
13 changed files with 95 additions and 113 deletions

View file

@ -1052,94 +1052,13 @@ private:
} else if (kind == FieldKind::LIST) { } else if (kind == FieldKind::LIST) {
uint64_t typeId = field.getContainingStruct().getProto().getId(); uint64_t typeId = field.getContainingStruct().getProto().getId();
kj::String defaultParam = defaultOffset == 0 ? kj::str() : kj::str( kj::String defaultParams = defaultOffset == 0 ? kj::str("null, 0") : kj::str(
",\n ::capnp::schemas::s_", kj::hex(typeId), ".encodedNode + ", defaultOffset, "Schemas.b_", kj::hex(typeId), ", ", defaultOffset);
defaultSize == 0 ? kj::strTree() : kj::strTree(", ", defaultSize));
kj::String listFactory = makeListFactoryArg(typeBody); kj::String listFactory = makeListFactoryArg(typeBody);
kj::String fieldSize;
kj::String readerClass = kj::str(typeName(typeBody, kj::str(".Reader"))); kj::String readerClass = kj::str(typeName(typeBody, kj::str(".Reader")));
kj::String builderClass = kj::str(typeName(typeBody, kj::str(".Builder"))); kj::String builderClass = kj::str(typeName(typeBody, kj::str(".Builder")));
bool isStructOrCapList = false;
bool isStructList = false;
if (kind == FieldKind::LIST) {
bool primitiveElement = false;
bool interface = false;
switch (typeBody.getList().getElementType().which()) {
case schema::Type::VOID:
primitiveElement = true;
fieldSize = kj::str("org.capnproto.FieldSize.VOID");
break;
case schema::Type::BOOL:
primitiveElement = true;
fieldSize = kj::str("org.capnproto.FieldSize.BIT");
break;
case schema::Type::INT8:
case schema::Type::UINT8:
primitiveElement = true;
fieldSize = kj::str("org.capnproto.FieldSize.BYTE");
break;
case schema::Type::INT16:
case schema::Type::UINT16:
primitiveElement = true;
fieldSize = kj::str("org.capnproto.FieldSize.TWO_BYTES");
break;
case schema::Type::INT32:
case schema::Type::UINT32:
case schema::Type::FLOAT32:
primitiveElement = true;
fieldSize = kj::str("org.capnproto.FieldSize.FOUR_BYTES");
break;
case schema::Type::INT64:
case schema::Type::UINT64:
case schema::Type::FLOAT64:
primitiveElement = true;
fieldSize = kj::str("org.capnproto.FieldSize.EIGHT_BYTES");
break;
case schema::Type::ENUM:
primitiveElement = true;
fieldSize = kj::str("org.capnproto.FieldSize.TWO_BYTES");
break;
case schema::Type::TEXT:
primitiveElement = false;
fieldSize = kj::str("org.capnproto.FieldSize.POINTER");
break;
case schema::Type::DATA:
primitiveElement = false;
fieldSize = kj::str("org.capnproto.FieldSize.POINTER");
break;
case schema::Type::LIST:
primitiveElement = false;
fieldSize = kj::str("org.capnproto.FieldSize.POINTER");
break;
case schema::Type::ANY_POINTER:
primitiveElement = false;
break;
case schema::Type::INTERFACE:
isStructOrCapList = true;
primitiveElement = false;
interface = true;
break;
case schema::Type::STRUCT:
isStructList = true;
isStructOrCapList = true;
primitiveElement = false;
fieldSize = kj::str(typeName(typeBody.getList().getElementType()),".STRUCT_SIZE.preferredListEncoding");
break;
}
}
return FieldText { return FieldText {
kj::strTree( kj::strTree(
kj::mv(unionDiscrim.readerIsDecl), kj::mv(unionDiscrim.readerIsDecl),
@ -1149,7 +1068,8 @@ private:
spaces(indent), " public final ", readerClass, spaces(indent), " public final ", readerClass,
" get", titleCase, "() {\n", " get", titleCase, "() {\n",
spaces(indent), " return (", listFactory, ").fromPointerReader(_reader.getPointerField(", offset, "));\n", spaces(indent), " return (", listFactory, ").fromPointerReader(_reader.getPointerField(", offset, "),",
defaultParams, ");\n",
spaces(indent), " }\n", spaces(indent), " }\n",
"\n"), "\n"),

View file

@ -272,6 +272,24 @@ object TestUtil {
} }
} }
reader.getVoidList().size() should equal (6);
{
val listReader = reader.getBoolList();
listReader.size() should equal (4);
listReader.get(0) should equal (true);
listReader.get(1) should equal (false);
listReader.get(2) should equal (false);
listReader.get(3) should equal (true);
}
{
val listReader = reader.getInt8List();
listReader.size() should equal (2);
listReader.get(0) should equal (111);
listReader.get(1) should equal (-111);
}
} }
} }

View file

@ -114,6 +114,31 @@ struct TestDefaults {
# interfaceList can't have a default # interfaceList can't have a default
); );
enumField @15 : TestEnum = corge;
interfaceField @16 : Void; # TODO
voidList @17 : List(Void) = [void, void, void, void, void, void];
boolList @18 : List(Bool) = [true, false, false, true];
int8List @19 : List(Int8) = [111, -111];
int16List @20 : List(Int16) = [11111, -11111];
int32List @21 : List(Int32) = [111111111, -111111111];
int64List @22 : List(Int64) = [1111111111111111111, -1111111111111111111];
uInt8List @23 : List(UInt8) = [111, 222] ;
uInt16List @24 : List(UInt16) = [33333, 44444];
uInt32List @25 : List(UInt32) = [3333333333];
uInt64List @26 : List(UInt64) = [11111111111111111111];
float32List @27 : List(Float32) = [5555.5, inf, -inf, nan];
float64List @28 : List(Float64) = [7777.75, inf, -inf, nan];
textList @29 : List(Text) = ["plugh", "xyzzy", "thud"];
dataList @30 : List(Data) = ["oops", "exhausted", "rfc3092"];
structList @31 : List(TestAllTypes) = [
(textField = "structlist 1"),
(textField = "structlist 2"),
(textField = "structlist 3")];
enumList @32 : List(TestEnum) = [foo, garply];
interfaceList @33 : List(Void); # TODO
} }
struct TestAnyPointer { struct TestAnyPointer {

View file

@ -14,7 +14,7 @@ public final class AnyPointer {
} }
public final <T> T getAsList(FromPointerReader<T> factory) { public final <T> T getAsList(FromPointerReader<T> factory) {
return factory.fromPointerReader(this.reader); return factory.fromPointerReader(this.reader, null, 0);
} }
} }

View file

@ -2,8 +2,8 @@ package org.capnproto;
public final class DataList { public final class DataList {
public static final class Factory implements ListFactory<Builder, Reader> { public static final class Factory implements ListFactory<Builder, Reader> {
public final Reader fromPointerReader(PointerReader reader) { public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
return new Reader(reader.getList(FieldSize.POINTER)); return new Reader(reader.getList(FieldSize.POINTER, defaultSegment, defaultOffset));
} }
public final Builder fromPointerBuilder(PointerBuilder builder) { public final Builder fromPointerBuilder(PointerBuilder builder) {

View file

@ -16,8 +16,8 @@ public class EnumList {
this.values = values; this.values = values;
} }
public final Reader<T> fromPointerReader(PointerReader reader) { public final Reader<T> fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
return new Reader<T>(values, reader.getList(FieldSize.TWO_BYTES)); return new Reader<T>(values, reader.getList(FieldSize.TWO_BYTES, defaultSegment, defaultOffset));
} }
public final Builder<T> fromPointerBuilder(PointerBuilder builder) { public final Builder<T> fromPointerBuilder(PointerBuilder builder) {

View file

@ -1,5 +1,5 @@
package org.capnproto; package org.capnproto;
public interface FromPointerReader<T> { public interface FromPointerReader<T> {
T fromPointerReader(PointerReader reader); T fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset);
} }

View file

@ -10,8 +10,8 @@ public final class ListList {
this.factory = factory; this.factory = factory;
} }
public final Reader<ElementReader> fromPointerReader(PointerReader reader) { public final Reader<ElementReader> fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
return new Reader<ElementReader>(factory, reader.getList(FieldSize.POINTER)); return new Reader<ElementReader>(factory, reader.getList(FieldSize.POINTER, defaultSegment, defaultOffset));
} }
public final Builder<ElementBuilder> fromPointerBuilder(PointerBuilder builder) { public final Builder<ElementBuilder> fromPointerBuilder(PointerBuilder builder) {
@ -38,7 +38,7 @@ public final class ListList {
} }
public T get(int index) { public T get(int index) {
return this.factory.fromPointerReader(this.reader.getPointerElement(index)); return this.factory.fromPointerReader(this.reader.getPointerElement(index), null, 0);
} }
} }

View file

@ -45,6 +45,17 @@ public final class PointerReader {
public ListReader getList(byte expectedElementSize) { public ListReader getList(byte expectedElementSize) {
return WireHelpers.readListPointer(this.segment, return WireHelpers.readListPointer(this.segment,
this.pointer, this.pointer,
null, 0,
expectedElementSize,
this.nestingLimit);
}
public ListReader getList(byte expectedElementSize, SegmentReader defaultSegment, int defaultOffset) {
return WireHelpers.readListPointer(this.segment,
this.pointer,
defaultSegment,
defaultOffset,
expectedElementSize, expectedElementSize,
this.nestingLimit); this.nestingLimit);
} }

View file

@ -3,8 +3,8 @@ package org.capnproto;
public class PrimitiveList { public class PrimitiveList {
public static class Void { public static class Void {
public static final class Factory implements ListFactory<Builder, Reader> { public static final class Factory implements ListFactory<Builder, Reader> {
public final Reader fromPointerReader(PointerReader reader) { public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
return new Reader(reader.getList(FieldSize.VOID)); return new Reader(reader.getList(FieldSize.VOID, defaultSegment, defaultOffset));
} }
public final Builder fromPointerBuilder(PointerBuilder builder) { public final Builder fromPointerBuilder(PointerBuilder builder) {
@ -50,8 +50,8 @@ public class PrimitiveList {
public static class Boolean { public static class Boolean {
public static final class Factory implements ListFactory<Builder, Reader> { public static final class Factory implements ListFactory<Builder, Reader> {
public final Reader fromPointerReader(PointerReader reader) { public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
return new Reader(reader.getList(FieldSize.BIT)); return new Reader(reader.getList(FieldSize.BIT, defaultSegment, defaultOffset));
} }
public final Builder fromPointerBuilder(PointerBuilder builder) { public final Builder fromPointerBuilder(PointerBuilder builder) {
@ -103,8 +103,8 @@ public class PrimitiveList {
public static class Byte { public static class Byte {
public static final class Factory implements ListFactory<Builder, Reader> { public static final class Factory implements ListFactory<Builder, Reader> {
public final Reader fromPointerReader(PointerReader reader) { public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
return new Reader(reader.getList(FieldSize.BYTE)); return new Reader(reader.getList(FieldSize.BYTE, defaultSegment, defaultOffset));
} }
public final Builder fromPointerBuilder(PointerBuilder builder) { public final Builder fromPointerBuilder(PointerBuilder builder) {
@ -157,8 +157,8 @@ public class PrimitiveList {
public static class Short { public static class Short {
public static final class Factory implements ListFactory<Builder, Reader> { public static final class Factory implements ListFactory<Builder, Reader> {
public final Reader fromPointerReader(PointerReader reader) { public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
return new Reader(reader.getList(FieldSize.TWO_BYTES)); return new Reader(reader.getList(FieldSize.TWO_BYTES, defaultSegment, defaultOffset));
} }
public final Builder fromPointerBuilder(PointerBuilder builder) { public final Builder fromPointerBuilder(PointerBuilder builder) {
@ -211,8 +211,8 @@ public class PrimitiveList {
public static class Int { public static class Int {
public static final class Factory implements ListFactory<Builder, Reader> { public static final class Factory implements ListFactory<Builder, Reader> {
public final Reader fromPointerReader(PointerReader reader) { public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
return new Reader(reader.getList(FieldSize.FOUR_BYTES)); return new Reader(reader.getList(FieldSize.FOUR_BYTES, defaultSegment, defaultOffset));
} }
public final Builder fromPointerBuilder(PointerBuilder builder) { public final Builder fromPointerBuilder(PointerBuilder builder) {
@ -264,8 +264,8 @@ public class PrimitiveList {
public static class Float { public static class Float {
public static final class Factory implements ListFactory<Builder, Reader> { public static final class Factory implements ListFactory<Builder, Reader> {
public final Reader fromPointerReader(PointerReader reader) { public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
return new Reader(reader.getList(FieldSize.FOUR_BYTES)); return new Reader(reader.getList(FieldSize.FOUR_BYTES, defaultSegment, defaultOffset));
} }
public final Builder fromPointerBuilder(PointerBuilder builder) { public final Builder fromPointerBuilder(PointerBuilder builder) {
@ -318,7 +318,7 @@ public class PrimitiveList {
public static class Long { public static class Long {
public static final class Factory implements ListFactory<Builder, Reader> { public static final class Factory implements ListFactory<Builder, Reader> {
public final Reader fromPointerReader(PointerReader reader) { public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
return new Reader(reader.getList(FieldSize.EIGHT_BYTES)); return new Reader(reader.getList(FieldSize.EIGHT_BYTES));
} }
@ -371,8 +371,8 @@ public class PrimitiveList {
public static class Double { public static class Double {
public static final class Factory implements ListFactory<Builder, Reader> { public static final class Factory implements ListFactory<Builder, Reader> {
public final Reader fromPointerReader(PointerReader reader) { public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
return new Reader(reader.getList(FieldSize.EIGHT_BYTES)); return new Reader(reader.getList(FieldSize.EIGHT_BYTES, defaultSegment, defaultOffset));
} }
public final Builder fromPointerBuilder(PointerBuilder builder) { public final Builder fromPointerBuilder(PointerBuilder builder) {

View file

@ -10,8 +10,8 @@ public final class StructList {
this.factory = factory; this.factory = factory;
} }
public final Reader<ElementReader> fromPointerReader(PointerReader reader) { public final Reader<ElementReader> fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
return new Reader<ElementReader>(factory, reader.getList(FieldSize.INLINE_COMPOSITE)); return new Reader<ElementReader>(factory, reader.getList(FieldSize.INLINE_COMPOSITE, defaultSegment, defaultOffset));
} }
public final Builder<ElementBuilder> fromPointerBuilder(PointerBuilder builder) { public final Builder<ElementBuilder> fromPointerBuilder(PointerBuilder builder) {

View file

@ -2,8 +2,8 @@ package org.capnproto;
public final class TextList { public final class TextList {
public static final class Factory implements ListFactory<Builder, Reader> { public static final class Factory implements ListFactory<Builder, Reader> {
public final Reader fromPointerReader(PointerReader reader) { public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
return new Reader(reader.getList(FieldSize.POINTER)); return new Reader(reader.getList(FieldSize.POINTER, defaultSegment, defaultOffset));
} }
public final Builder fromPointerBuilder(PointerBuilder builder) { public final Builder fromPointerBuilder(PointerBuilder builder) {

View file

@ -464,13 +464,21 @@ final class WireHelpers {
static ListReader readListPointer(SegmentReader segment, static ListReader readListPointer(SegmentReader segment,
int refOffset, int refOffset,
SegmentReader defaultSegment,
int defaultOffset,
byte expectedElementSize, byte expectedElementSize,
int nestingLimit) { int nestingLimit) {
long ref = WirePointer.get(segment.buffer, refOffset); long ref = WirePointer.get(segment.buffer, refOffset);
if (WirePointer.isNull(ref)) { if (WirePointer.isNull(ref)) {
if (defaultSegment == null) {
return new ListReader(); return new ListReader();
} else {
segment = defaultSegment;
refOffset = defaultOffset;
ref = WirePointer.get(segment.buffer, refOffset);
}
} }
if (nestingLimit <= 0) { if (nestingLimit <= 0) {