This commit is contained in:
David Renshaw 2014-10-28 11:47:29 -04:00
parent 2da0d65423
commit 77242cd15d
3 changed files with 72 additions and 13 deletions

View file

@ -211,6 +211,18 @@ private:
}
}
kj::Vector<kj::String> getTypeParameters(Schema schema) {
auto node = schema.getProto();
kj::Vector<kj::String> result;
if (node.getScopeId() != 0) {
Schema parent = schemaLoader.get(node.getScopeId());
result = getTypeParameters(parent);
}
for (auto parameter : node.getParameters()) {
result.add(kj::str(parameter.getName(), "_", kj::hex(node.getId())));
}
return kj::mv(result);
}
kj::String toUpperCase(kj::StringPtr name) {
kj::Vector<char> result(name.size() + 4);
@ -891,7 +903,50 @@ private:
} else if (kind == FieldKind::INTERFACE) {
KJ_FAIL_REQUIRE("interfaces unimplemented");
} else if (kind == FieldKind::ANY_POINTER) {
if (typeBody.getAnyPointer().isParameter()) {
auto brandParam = typeBody.getAnyPointer().getParameter();
auto structSchema = field.getContainingStruct();
auto typeParam =
kj::strTree(schemaLoader.get(brandParam.getScopeId()).getProto().getParameters()[brandParam.getParameterIndex()].getName(),
"_", kj::hex(brandParam.getScopeId()));;
return FieldText {
kj::strTree(
kj::mv(unionDiscrim.readerIsDef),
spaces(indent), " public boolean has", titleCase, "() {\n",
unionDiscrim.has,
spaces(indent), " return !_pointerFieldIsNull(", offset, ");\n",
spaces(indent), " }\n",
spaces(indent), " public ", typeParam.flatten(), "_Reader get", titleCase, "() {\n",
unionDiscrim.check,
spaces(indent), " return _getPointerField(", typeParam.flatten(), "_Factory, ", offset, ");\n",
spaces(indent), " }\n"),
kj::strTree(
kj::mv(unionDiscrim.builderIsDef),
spaces(indent), " public final boolean has", titleCase, "() {\n",
spaces(indent), " return !_pointerFieldIsNull(", offset, ");\n",
spaces(indent), " }\n",
spaces(indent), " public ", typeParam.flatten(), "_Builder get", titleCase, "() {\n",
unionDiscrim.check,
spaces(indent), " return _getPointerField(", typeParam.flatten(), "_Factory, ", offset, ");\n",
spaces(indent), " }\n",
spaces(indent), " public org.capnproto.AnyPointer.Builder init", titleCase, "() {\n",
unionDiscrim.set,
spaces(indent), " org.capnproto.AnyPointer.Builder result =\n",
spaces(indent), " new org.capnproto.AnyPointer.Builder(this.segment, this.pointers +",
offset, ");\n",
spaces(indent), " result.clear();\n",
spaces(indent), " return result;\n",
spaces(indent), " }\n",
"\n"),
};
};
return FieldText {
kj::strTree(
kj::mv(unionDiscrim.readerIsDef),
@ -1090,19 +1145,6 @@ private:
}
}
kj::Vector<kj::String> getTypeParameters(Schema schema) {
auto node = schema.getProto();
kj::Vector<kj::String> result;
if (node.getScopeId() != 0) {
Schema parent = schemaLoader.get(node.getScopeId());
result = getTypeParameters(parent);
}
for (auto parameter : node.getParameters()) {
result.add(kj::str(parameter.getName(), "_", kj::hex(node.getId())));
}
return kj::mv(result);
}
StructText makeStructText(kj::StringPtr scope, kj::StringPtr name, StructSchema schema,
kj::Array<kj::StringTree> nestedTypeDecls, int indent) {
auto proto = schema.getProto();

View file

@ -176,6 +176,10 @@ public class StructBuilder {
this.segment.buffer.putLong(pointer * 8, 0L);
}
protected final <T> T _getPointerField(FromPointerBuilder<T> factory, int index) {
return factory.fromPointerBuilder(this.segment, this.pointers + index);
}
protected final <T> T _getPointerField(FromPointerBuilderRefDefault<T> factory, int index,
SegmentReader defaultSegment, int defaultOffset) {
return factory.fromPointerBuilderRefDefault(this.segment, this.pointers + index, defaultSegment, defaultOffset);

View file

@ -154,6 +154,19 @@ public class StructReader {
return this.segment.buffer.getLong((this.pointers + ptrIndex) * Constants.BYTES_PER_WORD) == 0;
}
protected final <T> T _getPointerField(FromPointerReader<T> factory, int ptrIndex) {
if (ptrIndex < this.pointerCount) {
return factory.fromPointerReader(this.segment,
this.pointers + ptrIndex,
this.nestingLimit);
} else {
return factory.fromPointerReader(SegmentReader.EMPTY,
0,
this.nestingLimit);
}
}
protected final <T> T _getPointerField(FromPointerReaderRefDefault<T> factory, int ptrIndex,
SegmentReader defaultSegment, int defaultOffset) {
if (ptrIndex < this.pointerCount) {