list reader defaults
This commit is contained in:
parent
de33553666
commit
195d688970
13 changed files with 95 additions and 113 deletions
|
@ -1052,94 +1052,13 @@ private:
|
|||
} else if (kind == FieldKind::LIST) {
|
||||
|
||||
uint64_t typeId = field.getContainingStruct().getProto().getId();
|
||||
kj::String defaultParam = defaultOffset == 0 ? kj::str() : kj::str(
|
||||
",\n ::capnp::schemas::s_", kj::hex(typeId), ".encodedNode + ", defaultOffset,
|
||||
defaultSize == 0 ? kj::strTree() : kj::strTree(", ", defaultSize));
|
||||
kj::String defaultParams = defaultOffset == 0 ? kj::str("null, 0") : kj::str(
|
||||
"Schemas.b_", kj::hex(typeId), ", ", defaultOffset);
|
||||
|
||||
kj::String listFactory = makeListFactoryArg(typeBody);
|
||||
kj::String fieldSize;
|
||||
kj::String readerClass = kj::str(typeName(typeBody, kj::str(".Reader")));
|
||||
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 {
|
||||
kj::strTree(
|
||||
kj::mv(unionDiscrim.readerIsDecl),
|
||||
|
@ -1149,7 +1068,8 @@ private:
|
|||
|
||||
spaces(indent), " public final ", readerClass,
|
||||
" 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",
|
||||
"\n"),
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -114,6 +114,31 @@ struct TestDefaults {
|
|||
# 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 {
|
||||
|
|
|
@ -14,7 +14,7 @@ public final class AnyPointer {
|
|||
}
|
||||
|
||||
public final <T> T getAsList(FromPointerReader<T> factory) {
|
||||
return factory.fromPointerReader(this.reader);
|
||||
return factory.fromPointerReader(this.reader, null, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,8 +2,8 @@ package org.capnproto;
|
|||
|
||||
public final class DataList {
|
||||
public static final class Factory implements ListFactory<Builder, Reader> {
|
||||
public final Reader fromPointerReader(PointerReader reader) {
|
||||
return new Reader(reader.getList(FieldSize.POINTER));
|
||||
public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
|
||||
return new Reader(reader.getList(FieldSize.POINTER, defaultSegment, defaultOffset));
|
||||
}
|
||||
|
||||
public final Builder fromPointerBuilder(PointerBuilder builder) {
|
||||
|
|
|
@ -16,8 +16,8 @@ public class EnumList {
|
|||
this.values = values;
|
||||
}
|
||||
|
||||
public final Reader<T> fromPointerReader(PointerReader reader) {
|
||||
return new Reader<T>(values, reader.getList(FieldSize.TWO_BYTES));
|
||||
public final Reader<T> fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
|
||||
return new Reader<T>(values, reader.getList(FieldSize.TWO_BYTES, defaultSegment, defaultOffset));
|
||||
}
|
||||
|
||||
public final Builder<T> fromPointerBuilder(PointerBuilder builder) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
package org.capnproto;
|
||||
|
||||
public interface FromPointerReader<T> {
|
||||
T fromPointerReader(PointerReader reader);
|
||||
T fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset);
|
||||
}
|
||||
|
|
|
@ -10,8 +10,8 @@ public final class ListList {
|
|||
this.factory = factory;
|
||||
}
|
||||
|
||||
public final Reader<ElementReader> fromPointerReader(PointerReader reader) {
|
||||
return new Reader<ElementReader>(factory, reader.getList(FieldSize.POINTER));
|
||||
public final Reader<ElementReader> fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
|
||||
return new Reader<ElementReader>(factory, reader.getList(FieldSize.POINTER, defaultSegment, defaultOffset));
|
||||
}
|
||||
|
||||
public final Builder<ElementBuilder> fromPointerBuilder(PointerBuilder builder) {
|
||||
|
@ -38,7 +38,7 @@ public final class ListList {
|
|||
}
|
||||
|
||||
public T get(int index) {
|
||||
return this.factory.fromPointerReader(this.reader.getPointerElement(index));
|
||||
return this.factory.fromPointerReader(this.reader.getPointerElement(index), null, 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -45,6 +45,17 @@ public final class PointerReader {
|
|||
public ListReader getList(byte expectedElementSize) {
|
||||
return WireHelpers.readListPointer(this.segment,
|
||||
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,
|
||||
this.nestingLimit);
|
||||
}
|
||||
|
|
|
@ -3,8 +3,8 @@ package org.capnproto;
|
|||
public class PrimitiveList {
|
||||
public static class Void {
|
||||
public static final class Factory implements ListFactory<Builder, Reader> {
|
||||
public final Reader fromPointerReader(PointerReader reader) {
|
||||
return new Reader(reader.getList(FieldSize.VOID));
|
||||
public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
|
||||
return new Reader(reader.getList(FieldSize.VOID, defaultSegment, defaultOffset));
|
||||
}
|
||||
|
||||
public final Builder fromPointerBuilder(PointerBuilder builder) {
|
||||
|
@ -50,8 +50,8 @@ public class PrimitiveList {
|
|||
|
||||
public static class Boolean {
|
||||
public static final class Factory implements ListFactory<Builder, Reader> {
|
||||
public final Reader fromPointerReader(PointerReader reader) {
|
||||
return new Reader(reader.getList(FieldSize.BIT));
|
||||
public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
|
||||
return new Reader(reader.getList(FieldSize.BIT, defaultSegment, defaultOffset));
|
||||
}
|
||||
|
||||
public final Builder fromPointerBuilder(PointerBuilder builder) {
|
||||
|
@ -103,8 +103,8 @@ public class PrimitiveList {
|
|||
|
||||
public static class Byte {
|
||||
public static final class Factory implements ListFactory<Builder, Reader> {
|
||||
public final Reader fromPointerReader(PointerReader reader) {
|
||||
return new Reader(reader.getList(FieldSize.BYTE));
|
||||
public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
|
||||
return new Reader(reader.getList(FieldSize.BYTE, defaultSegment, defaultOffset));
|
||||
}
|
||||
|
||||
public final Builder fromPointerBuilder(PointerBuilder builder) {
|
||||
|
@ -157,8 +157,8 @@ public class PrimitiveList {
|
|||
|
||||
public static class Short {
|
||||
public static final class Factory implements ListFactory<Builder, Reader> {
|
||||
public final Reader fromPointerReader(PointerReader reader) {
|
||||
return new Reader(reader.getList(FieldSize.TWO_BYTES));
|
||||
public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
|
||||
return new Reader(reader.getList(FieldSize.TWO_BYTES, defaultSegment, defaultOffset));
|
||||
}
|
||||
|
||||
public final Builder fromPointerBuilder(PointerBuilder builder) {
|
||||
|
@ -211,8 +211,8 @@ public class PrimitiveList {
|
|||
|
||||
public static class Int {
|
||||
public static final class Factory implements ListFactory<Builder, Reader> {
|
||||
public final Reader fromPointerReader(PointerReader reader) {
|
||||
return new Reader(reader.getList(FieldSize.FOUR_BYTES));
|
||||
public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
|
||||
return new Reader(reader.getList(FieldSize.FOUR_BYTES, defaultSegment, defaultOffset));
|
||||
}
|
||||
|
||||
public final Builder fromPointerBuilder(PointerBuilder builder) {
|
||||
|
@ -264,8 +264,8 @@ public class PrimitiveList {
|
|||
|
||||
public static class Float {
|
||||
public static final class Factory implements ListFactory<Builder, Reader> {
|
||||
public final Reader fromPointerReader(PointerReader reader) {
|
||||
return new Reader(reader.getList(FieldSize.FOUR_BYTES));
|
||||
public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
|
||||
return new Reader(reader.getList(FieldSize.FOUR_BYTES, defaultSegment, defaultOffset));
|
||||
}
|
||||
|
||||
public final Builder fromPointerBuilder(PointerBuilder builder) {
|
||||
|
@ -318,7 +318,7 @@ public class PrimitiveList {
|
|||
|
||||
public static class Long {
|
||||
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));
|
||||
}
|
||||
|
||||
|
@ -371,8 +371,8 @@ public class PrimitiveList {
|
|||
|
||||
public static class Double {
|
||||
public static final class Factory implements ListFactory<Builder, Reader> {
|
||||
public final Reader fromPointerReader(PointerReader reader) {
|
||||
return new Reader(reader.getList(FieldSize.EIGHT_BYTES));
|
||||
public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
|
||||
return new Reader(reader.getList(FieldSize.EIGHT_BYTES, defaultSegment, defaultOffset));
|
||||
}
|
||||
|
||||
public final Builder fromPointerBuilder(PointerBuilder builder) {
|
||||
|
|
|
@ -10,8 +10,8 @@ public final class StructList {
|
|||
this.factory = factory;
|
||||
}
|
||||
|
||||
public final Reader<ElementReader> fromPointerReader(PointerReader reader) {
|
||||
return new Reader<ElementReader>(factory, reader.getList(FieldSize.INLINE_COMPOSITE));
|
||||
public final Reader<ElementReader> fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
|
||||
return new Reader<ElementReader>(factory, reader.getList(FieldSize.INLINE_COMPOSITE, defaultSegment, defaultOffset));
|
||||
}
|
||||
|
||||
public final Builder<ElementBuilder> fromPointerBuilder(PointerBuilder builder) {
|
||||
|
|
|
@ -2,8 +2,8 @@ package org.capnproto;
|
|||
|
||||
public final class TextList {
|
||||
public static final class Factory implements ListFactory<Builder, Reader> {
|
||||
public final Reader fromPointerReader(PointerReader reader) {
|
||||
return new Reader(reader.getList(FieldSize.POINTER));
|
||||
public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
|
||||
return new Reader(reader.getList(FieldSize.POINTER, defaultSegment, defaultOffset));
|
||||
}
|
||||
|
||||
public final Builder fromPointerBuilder(PointerBuilder builder) {
|
||||
|
|
|
@ -464,13 +464,21 @@ final class WireHelpers {
|
|||
|
||||
static ListReader readListPointer(SegmentReader segment,
|
||||
int refOffset,
|
||||
SegmentReader defaultSegment,
|
||||
int defaultOffset,
|
||||
byte expectedElementSize,
|
||||
int nestingLimit) {
|
||||
|
||||
long ref = WirePointer.get(segment.buffer, refOffset);
|
||||
|
||||
if (WirePointer.isNull(ref)) {
|
||||
if (defaultSegment == null) {
|
||||
return new ListReader();
|
||||
} else {
|
||||
segment = defaultSegment;
|
||||
refOffset = defaultOffset;
|
||||
ref = WirePointer.get(segment.buffer, refOffset);
|
||||
}
|
||||
}
|
||||
|
||||
if (nestingLimit <= 0) {
|
||||
|
|
Loading…
Reference in a new issue