list constants
This commit is contained in:
parent
710c03f7f9
commit
80e1471323
4 changed files with 83 additions and 6 deletions
|
@ -692,6 +692,27 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kj::String makeListFactoryArg(schema::Type::Reader type) {
|
||||||
|
auto elementType = type.getList().getElementType();
|
||||||
|
switch (elementType.which()) {
|
||||||
|
case schema::Type::STRUCT:
|
||||||
|
return kj::str("new org.capnproto.StructList.Factory<",
|
||||||
|
typeName(elementType, kj::str(".Builder")),", ",
|
||||||
|
typeName(elementType, kj::str(".Reader")), ">(",
|
||||||
|
typeName(elementType, kj::str("")), ".factory)");
|
||||||
|
case schema::Type::LIST:
|
||||||
|
return makeListListFactoryArg(elementType);
|
||||||
|
case schema::Type::ENUM:
|
||||||
|
return kj::str("new org.capnproto.EnumList.Factory<",
|
||||||
|
typeName(elementType), ">(",
|
||||||
|
typeName(elementType, kj::str("")),
|
||||||
|
".values())");
|
||||||
|
default:
|
||||||
|
return kj::str(typeName(type, kj::str(".factory")));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
FieldText makeFieldText(kj::StringPtr scope, StructSchema::Field field, int indent) {
|
FieldText makeFieldText(kj::StringPtr scope, StructSchema::Field field, int indent) {
|
||||||
auto proto = field.getProto();
|
auto proto = field.getProto();
|
||||||
kj::String titleCase = toTitleCase(proto.getName());
|
kj::String titleCase = toTitleCase(proto.getName());
|
||||||
|
@ -1370,12 +1391,16 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
case schema::Value::LIST: {
|
case schema::Value::LIST: {
|
||||||
kj::String constType = kj::strTree(
|
kj::String constType = typeName(type, kj::str(".Reader")).flatten();;
|
||||||
"::capnp::_::ConstList<", typeName(type.getList().getElementType()), ">").flatten();
|
|
||||||
return ConstText {
|
return ConstText {
|
||||||
true,
|
true,
|
||||||
kj::strTree("const ", constType, ' ', scope, upperCase, "(::capnp::schemas::b_",
|
kj::strTree(
|
||||||
kj::hex(proto.getId()), ".words + ", schema.getValueSchemaOffset(), ");\n")
|
spaces(indent),
|
||||||
|
"public static final ", constType, ' ', upperCase, " =\n",
|
||||||
|
spaces(indent), " (",
|
||||||
|
"new org.capnproto.AnyPointer.Reader(new org.capnproto.PointerReader(Schemas.b_",
|
||||||
|
kj::hex(proto.getId()), ",", schema.getValueSchemaOffset(), ",0x7fffffff)).getAsList(",
|
||||||
|
makeListFactoryArg(type), "));\n")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -156,6 +156,34 @@ class EncodingSuite extends FunSuite {
|
||||||
// ...
|
// ...
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TestConstants.VOID_LIST_CONST.size() should equal (6);
|
||||||
|
|
||||||
|
{
|
||||||
|
val listReader = TestConstants.BOOL_LIST_CONST;
|
||||||
|
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 = TestConstants.TEXT_LIST_CONST;
|
||||||
|
listReader.size() should equal(3);
|
||||||
|
listReader.get(0).toString() should equal ("plugh");
|
||||||
|
listReader.get(1).toString() should equal ("xyzzy");
|
||||||
|
listReader.get(2).toString() should equal ("thud");
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
val listReader = TestConstants.STRUCT_LIST_CONST;
|
||||||
|
listReader.size() should equal(3);
|
||||||
|
listReader.get(0).getTextField().toString() should equal ("structlist 1");
|
||||||
|
listReader.get(1).getTextField().toString() should equal ("structlist 2");
|
||||||
|
listReader.get(2).getTextField().toString() should equal ("structlist 3");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
test("GlobalConstants") {
|
test("GlobalConstants") {
|
||||||
|
|
|
@ -313,8 +313,28 @@ struct TestConstants {
|
||||||
# interfaceList can't have a default
|
# interfaceList can't have a default
|
||||||
|
|
||||||
);
|
);
|
||||||
# ...
|
|
||||||
const enumConst :TestEnum = corge;
|
const enumConst :TestEnum = corge;
|
||||||
|
|
||||||
|
const voidListConst :List(Void) = [void, void, void, void, void, void];
|
||||||
|
const boolListConst :List(Bool) = [true, false, false, true];
|
||||||
|
const int8ListConst :List(Int8) = [111, -111];
|
||||||
|
const int16ListConst :List(Int16) = [11111, -11111];
|
||||||
|
const int32ListConst :List(Int32) = [111111111, -111111111];
|
||||||
|
const int64ListConst :List(Int64) = [1111111111111111111, -1111111111111111111];
|
||||||
|
const uint8ListConst :List(UInt8) = [111, 222] ;
|
||||||
|
const uint16ListConst :List(UInt16) = [33333, 44444];
|
||||||
|
const uint32ListConst :List(UInt32) = [3333333333];
|
||||||
|
const uint64ListConst :List(UInt64) = [11111111111111111111];
|
||||||
|
const float32ListConst :List(Float32) = [5555.5, inf, -inf, nan];
|
||||||
|
const float64ListConst :List(Float64) = [7777.75, inf, -inf, nan];
|
||||||
|
const textListConst :List(Text) = ["plugh", "xyzzy", "thud"];
|
||||||
|
const dataListConst :List(Data) = ["oops", "exhausted", "rfc3092"];
|
||||||
|
const structListConst :List(TestAllTypes) = [
|
||||||
|
(textField = "structlist 1"),
|
||||||
|
(textField = "structlist 2"),
|
||||||
|
(textField = "structlist 3")];
|
||||||
|
const enumListConst :List(TestEnum) = [foo, garply];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const globalInt :UInt32 = 12345;
|
const globalInt :UInt32 = 12345;
|
|
@ -12,6 +12,10 @@ public final class AnyPointer {
|
||||||
public final <T> T getAsStruct(FromStructReader<T> factory) {
|
public final <T> T getAsStruct(FromStructReader<T> factory) {
|
||||||
return factory.fromStructReader(this.reader.getStruct());
|
return factory.fromStructReader(this.reader.getStruct());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final <T> T getAsList(FromPointerReader<T> factory) {
|
||||||
|
return factory.fromPointerReader(this.reader);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final class Builder {
|
public static final class Builder {
|
||||||
|
|
Loading…
Reference in a new issue