voidlist at least compiles

This commit is contained in:
David Renshaw 2014-05-28 21:02:53 -04:00
parent 3d049d5803
commit 245ff0b15d
5 changed files with 58 additions and 16 deletions

View file

@ -980,12 +980,21 @@ private:
kj::String elementReaderType; kj::String elementReaderType;
kj::String elementBuilderType; kj::String elementBuilderType;
kj::String builderFactoryType;
kj::String readerFactoryType;
kj::String fieldSize;
bool isStructOrCapList = false; bool isStructOrCapList = false;
bool isStructList = false;
if (kind == FieldKind::LIST) { if (kind == FieldKind::LIST) {
bool primitiveElement = false; bool primitiveElement = false;
bool interface = false; bool interface = false;
switch (typeBody.getList().getElementType().which()) { switch (typeBody.getList().getElementType().which()) {
case schema::Type::VOID: case schema::Type::VOID:
primitiveElement = true;
builderFactoryType = kj::str("org.capnproto.PrimitiveElementFactory.VOID");
readerFactoryType = kj::str(builderFactoryType);
fieldSize = kj::str("org.capnproto.FieldSize.VOID");
break;
case schema::Type::BOOL: case schema::Type::BOOL:
case schema::Type::INT8: case schema::Type::INT8:
case schema::Type::INT16: case schema::Type::INT16:
@ -1015,16 +1024,20 @@ private:
break; break;
case schema::Type::STRUCT: case schema::Type::STRUCT:
isStructList = true;
isStructOrCapList = true; isStructOrCapList = true;
primitiveElement = false; primitiveElement = false;
elementReaderType = kj::str(typeName(typeBody.getList().getElementType()), ".Reader");
elementBuilderType = kj::str(typeName(typeBody.getList().getElementType()), ".Builder");
readerFactoryType = kj::str(elementReaderType, ".factory"),
builderFactoryType = kj::str(elementBuilderType, ".factory"),
fieldSize = kj::str(typeName(typeBody.getList().getElementType()),".STRUCT_SIZE.preferredListEncoding");
break; break;
} }
elementReaderType = kj::str( if (primitiveElement) {
typeName(typeBody.getList().getElementType()), elementReaderType = kj::str(typeName(typeBody.getList().getElementType()));
primitiveElement ? "" : interface ? "::Client" : ".Reader"); elementBuilderType = kj::str(typeName(typeBody.getList().getElementType()));
elementBuilderType = kj::str( }
typeName(typeBody.getList().getElementType()),
primitiveElement ? "" : interface ? "::Client" : ".Builder");
} }
@ -1038,10 +1051,9 @@ private:
spaces(indent), " public final ", type, ".Reader<", elementReaderType, ">", spaces(indent), " public final ", type, ".Reader<", elementReaderType, ">",
" get", titleCase, "() {\n", " get", titleCase, "() {\n",
spaces(indent), " return new ", type, ".Reader<", elementReaderType, ">(\n", spaces(indent), " return new ", type, ".Reader<", elementReaderType, ">(\n",
spaces(indent), " ", elementReaderType, ".factory,\n", spaces(indent), " ", readerFactoryType, ",\n",
spaces(indent), " _reader.getPointerField(", offset, ").getList(", spaces(indent), " _reader.getPointerField(", offset, ").getList(",
// XXX what about lists of non-structs? fieldSize, ")",
typeName(typeBody.getList().getElementType()),".STRUCT_SIZE.preferredListEncoding)",
");\n", ");\n",
spaces(indent), " }\n", spaces(indent), " }\n",
"\n"), "\n"),
@ -1061,10 +1073,11 @@ private:
spaces(indent), " public final ", type, ".Builder<", elementBuilderType,">", spaces(indent), " public final ", type, ".Builder<", elementBuilderType,">",
" init", titleCase, "(int size) {\n", " init", titleCase, "(int size) {\n",
spaces(indent), " return new ", type, ".Builder<", elementBuilderType, ">(\n", spaces(indent), " return new ", type, ".Builder<", elementBuilderType, ">(\n",
spaces(indent), " ", elementBuilderType,".factory,\n", spaces(indent), " ", builderFactoryType, ",\n",
// XXX what about non-struct lists? spaces(indent), " _builder.getPointerField(", offset, ").init",
spaces(indent), " _builder.getPointerField(", offset, ").initStructList(", (isStructList ?
"size,", typeName(typeBody.getList().getElementType()),".STRUCT_SIZE)", kj::strTree("StructList(size,", typeName(typeBody.getList().getElementType()),".STRUCT_SIZE)") :
kj::strTree("List(", fieldSize, ", size)")),
");\n", ");\n",
spaces(indent), " }\n"), spaces(indent), " }\n"),

View file

@ -34,7 +34,7 @@ struct TestAllTypes {
enumField @15 : TestEnum; enumField @15 : TestEnum;
interfaceField @16 : Void; # TODO interfaceField @16 : Void; # TODO
# voidList @17 : List(Void); voidList @17 : List(Void);
# boolList @18 : List(Bool); # boolList @18 : List(Bool);
# ... # ...
} }

View file

@ -21,6 +21,10 @@ public final class PointerBuilder {
return WireHelpers.initStructPointer(this.pointer, this.segment, size); return WireHelpers.initStructPointer(this.pointer, this.segment, size);
} }
public final ListBuilder initList(byte elementSize, int elementCount) {
throw new Error("unimplemented");
}
public final ListBuilder initStructList(int elementCount, StructSize elementSize) { public final ListBuilder initStructList(int elementCount, StructSize elementSize) {
return WireHelpers.initStructListPointer(this.pointer, this.segment, elementCount, elementSize); return WireHelpers.initStructListPointer(this.pointer, this.segment, elementCount, elementSize);
} }

View file

@ -0,0 +1,15 @@
package org.capnproto;
public interface PrimitiveElementFactory<T> {
public T get(ListReader listReader, int index);
public static final PrimitiveElementFactory<Void> VOID = new PrimitiveElementFactoryVoid();
}
class PrimitiveElementFactoryVoid implements PrimitiveElementFactory<Void> {
public Void get(ListReader listReader, int index) {
return Void.VOID;
}
}

View file

@ -3,8 +3,10 @@ package org.capnproto;
public class PrimitiveList { public class PrimitiveList {
public static final class Reader<T> { public static final class Reader<T> {
public final ListReader reader; public final ListReader reader;
public final PrimitiveElementFactory<T> factory;
public Reader(ListReader reader) { public Reader(PrimitiveElementFactory<T> factory, ListReader reader) {
this.factory = factory;
this.reader = reader; this.reader = reader;
} }
@ -13,11 +15,19 @@ public class PrimitiveList {
} }
public T get(int index) { public T get(int index) {
throw new Error(); return this.factory.get(this.reader, index);
} }
} }
public static final class Builder<T> { public static final class Builder<T> {
public final ListBuilder builder;
public final PrimitiveElementFactory<T> factory;
public Builder(PrimitiveElementFactory<T> factory, ListBuilder builder) {
this.factory = factory;
this.builder = builder;
}
} }
} }