parameterize the struct factory

This commit is contained in:
David Renshaw 2014-10-27 14:46:16 -04:00
parent d1a2ce4049
commit 28b68ffcd2

View file

@ -1090,7 +1090,6 @@ private:
} }
} }
kj::Vector<kj::String> getTypeParameters(Schema schema) { kj::Vector<kj::String> getTypeParameters(Schema schema) {
auto node = schema.getProto(); auto node = schema.getProto();
kj::Vector<kj::String> result; kj::Vector<kj::String> result;
@ -1119,17 +1118,18 @@ private:
"\n"); "\n");
} }
kj::StringTree makeBuilderDef(StructSchema schema, kj::StringPtr typeParams, kj::Array<kj::StringTree>&& methodDecls, kj::StringTree makeBuilderDef(StructSchema schema, kj::StringPtr builderTypeParams, kj::StringPtr readerTypeParams,
kj::Array<kj::StringTree>&& methodDecls,
int indent) { int indent) {
return kj::strTree( return kj::strTree(
spaces(indent), "public static final class Builder", typeParams, " extends org.capnproto.StructBuilder {\n", spaces(indent), "public static final class Builder", builderTypeParams, " extends org.capnproto.StructBuilder {\n",
spaces(indent), " Builder(org.capnproto.SegmentBuilder segment, int data, int pointers,", spaces(indent), " Builder(org.capnproto.SegmentBuilder segment, int data, int pointers,",
"int dataSize, short pointerCount){\n", "int dataSize, short pointerCount){\n",
spaces(indent), " super(segment, data, pointers, dataSize, pointerCount);\n", spaces(indent), " super(segment, data, pointers, dataSize, pointerCount);\n",
spaces(indent), " }\n", spaces(indent), " }\n",
makeWhich(schema, indent+1), makeWhich(schema, indent+1),
spaces(indent), " public final Reader asReader() {\n", spaces(indent), " public final Reader", readerTypeParams, " asReader() {\n",
spaces(indent), " return new Reader(segment, data, pointers, dataSize, pointerCount, 0x7fffffff);\n", spaces(indent), " return new Reader", readerTypeParams, "(segment, data, pointers, dataSize, pointerCount, 0x7fffffff);\n",
spaces(indent), " }\n", spaces(indent), " }\n",
kj::mv(methodDecls), kj::mv(methodDecls),
spaces(indent), "}\n", spaces(indent), "}\n",
@ -1148,17 +1148,27 @@ private:
structNode.getPointerCount(); structNode.getPointerCount();
auto typeParamVec = getTypeParameters(schema); auto typeParamVec = getTypeParameters(schema);
bool hasTypeParams = typeParamVec.size() > 0;
kj::StringTree typeParamsTree; kj::StringTree readerTypeParamsTree;
if (typeParamVec.size() > 0) { kj::StringTree builderTypeParamsTree;
typeParamsTree = kj::strTree( if (hasTypeParams) {
readerTypeParamsTree = kj::strTree(
"<", "<",
kj::StringTree(KJ_MAP(p, typeParamVec) { kj::StringTree(KJ_MAP(p, typeParamVec) {
return kj::strTree(p); return kj::strTree(p, "_Reader");
}, ", "),
">");
builderTypeParamsTree = kj::strTree(
"<",
kj::StringTree(KJ_MAP(p, typeParamVec) {
return kj::strTree(p, "_Builder, ", p, "_Reader");
}, ", "), }, ", "),
">"); ">");
} }
kj::String typeParams = typeParamsTree.flatten(); kj::String readerTypeParams = readerTypeParamsTree.flatten();
kj::String builderTypeParams = builderTypeParamsTree.flatten();
return StructText { return StructText {
kj::strTree( kj::strTree(
@ -1168,33 +1178,36 @@ private:
" new org.capnproto.StructSize((short)", structNode.getDataWordCount(), " new org.capnproto.StructSize((short)", structNode.getDataWordCount(),
",(short)", structNode.getPointerCount(), ");\n"), ",(short)", structNode.getPointerCount(), ");\n"),
spaces(indent), " public static final class Factory extends org.capnproto.StructFactory<Builder, Reader> {\n", spaces(indent), " public static final class Factory", builderTypeParams,
" extends org.capnproto.StructFactory<Builder", builderTypeParams, ", Reader", readerTypeParams, "> {\n",
spaces(indent), spaces(indent),
" public final Reader constructReader(org.capnproto.SegmentReader segment, int data,", " public final Reader", readerTypeParams, " constructReader(org.capnproto.SegmentReader segment, int data,",
"int pointers, int dataSize, short pointerCount, int nestingLimit) {\n", "int pointers, int dataSize, short pointerCount, int nestingLimit) {\n",
spaces(indent), " return new Reader(segment,data,pointers,dataSize,pointerCount, nestingLimit);\n", spaces(indent), " return new Reader", readerTypeParams, "(segment,data,pointers,dataSize,pointerCount, nestingLimit);\n",
spaces(indent), " }\n", spaces(indent), " }\n",
spaces(indent), " public final Builder constructBuilder(org.capnproto.SegmentBuilder segment, int data,", spaces(indent), " public final Builder", builderTypeParams, " constructBuilder(org.capnproto.SegmentBuilder segment, int data,",
"int pointers, int dataSize, short pointerCount) {\n", "int pointers, int dataSize, short pointerCount) {\n",
spaces(indent), " return new Builder(segment, data, pointers, dataSize, pointerCount);\n", spaces(indent), " return new Builder", builderTypeParams, "(segment, data, pointers, dataSize, pointerCount);\n",
spaces(indent), " }\n", spaces(indent), " }\n",
spaces(indent), " public final org.capnproto.StructSize structSize() {\n", spaces(indent), " public final org.capnproto.StructSize structSize() {\n",
spaces(indent), " return ", fullName, ".STRUCT_SIZE;\n", spaces(indent), " return ", fullName, ".STRUCT_SIZE;\n",
spaces(indent), " }\n", spaces(indent), " }\n",
spaces(indent), " public final Reader asReader(Builder builder) {\n", spaces(indent), " public final Reader", readerTypeParams, " asReader(Builder", builderTypeParams, " builder) {\n",
spaces(indent), " return builder.asReader();\n", spaces(indent), " return builder.asReader();\n",
spaces(indent), " }\n", spaces(indent), " }\n",
spaces(indent), " }\n", spaces(indent), " }\n",
spaces(indent), " public static final Factory factory = new Factory();\n", (hasTypeParams ? kj::strTree() :
spaces(indent), " public static final org.capnproto.StructList.Factory<Builder,Reader> listFactory =\n", kj::strTree(
spaces(indent), " new org.capnproto.StructList.Factory<Builder, Reader>(factory);\n", spaces(indent), " public static final Factory factory = new Factory();\n",
spaces(indent), " public static final org.capnproto.StructList.Factory<Builder,Reader> listFactory =\n",
spaces(indent), " new org.capnproto.StructList.Factory<Builder, Reader>(factory);\n")),
kj::strTree(makeReaderDef(schema, typeParams, kj::strTree(makeReaderDef(schema, readerTypeParams,
KJ_MAP(f, fieldTexts) { return kj::mv(f.readerMethodDecls); }, KJ_MAP(f, fieldTexts) { return kj::mv(f.readerMethodDecls); },
indent + 1), indent + 1),
makeBuilderDef(schema, typeParams, makeBuilderDef(schema, builderTypeParams, readerTypeParams,
KJ_MAP(f, fieldTexts) { return kj::mv(f.builderMethodDecls); }, KJ_MAP(f, fieldTexts) { return kj::mv(f.builderMethodDecls); },
indent + 1)), indent + 1)),