list constants

This commit is contained in:
David Renshaw 2014-10-06 11:15:33 -04:00
parent 710c03f7f9
commit 80e1471323
4 changed files with 83 additions and 6 deletions

View file

@ -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")
}; };
} }

View file

@ -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") {

View file

@ -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;

View file

@ -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 {