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) {
|
||||
auto proto = field.getProto();
|
||||
kj::String titleCase = toTitleCase(proto.getName());
|
||||
|
@ -1370,12 +1391,16 @@ private:
|
|||
}
|
||||
|
||||
case schema::Value::LIST: {
|
||||
kj::String constType = kj::strTree(
|
||||
"::capnp::_::ConstList<", typeName(type.getList().getElementType()), ">").flatten();
|
||||
kj::String constType = typeName(type, kj::str(".Reader")).flatten();;
|
||||
return ConstText {
|
||||
true,
|
||||
kj::strTree("const ", constType, ' ', scope, upperCase, "(::capnp::schemas::b_",
|
||||
kj::hex(proto.getId()), ".words + ", schema.getValueSchemaOffset(), ");\n")
|
||||
kj::strTree(
|
||||
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") {
|
||||
|
|
|
@ -313,8 +313,28 @@ struct TestConstants {
|
|||
# interfaceList can't have a default
|
||||
|
||||
);
|
||||
# ...
|
||||
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;
|
|
@ -12,6 +12,10 @@ public final class AnyPointer {
|
|||
public final <T> T getAsStruct(FromStructReader<T> factory) {
|
||||
return factory.fromStructReader(this.reader.getStruct());
|
||||
}
|
||||
|
||||
public final <T> T getAsList(FromPointerReader<T> factory) {
|
||||
return factory.fromPointerReader(this.reader);
|
||||
}
|
||||
}
|
||||
|
||||
public static final class Builder {
|
||||
|
|
Loading…
Reference in a new issue