From 77242cd15d869a972afd3e2a37245bc1ea56858d Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Tue, 28 Oct 2014 11:47:29 -0400 Subject: [PATCH] getters --- compiler/src/main/cpp/capnpc-java.c++ | 68 +++++++++++++++---- .../java/org/capnproto/StructBuilder.java | 4 ++ .../main/java/org/capnproto/StructReader.java | 13 ++++ 3 files changed, 72 insertions(+), 13 deletions(-) diff --git a/compiler/src/main/cpp/capnpc-java.c++ b/compiler/src/main/cpp/capnpc-java.c++ index cded847..c59e7b9 100644 --- a/compiler/src/main/cpp/capnpc-java.c++ +++ b/compiler/src/main/cpp/capnpc-java.c++ @@ -211,6 +211,18 @@ private: } } + kj::Vector getTypeParameters(Schema schema) { + auto node = schema.getProto(); + kj::Vector 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 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 getTypeParameters(Schema schema) { - auto node = schema.getProto(); - kj::Vector 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 nestedTypeDecls, int indent) { auto proto = schema.getProto(); diff --git a/runtime/src/main/java/org/capnproto/StructBuilder.java b/runtime/src/main/java/org/capnproto/StructBuilder.java index acf1738..9213c88 100644 --- a/runtime/src/main/java/org/capnproto/StructBuilder.java +++ b/runtime/src/main/java/org/capnproto/StructBuilder.java @@ -176,6 +176,10 @@ public class StructBuilder { this.segment.buffer.putLong(pointer * 8, 0L); } + protected final T _getPointerField(FromPointerBuilder factory, int index) { + return factory.fromPointerBuilder(this.segment, this.pointers + index); + } + protected final T _getPointerField(FromPointerBuilderRefDefault factory, int index, SegmentReader defaultSegment, int defaultOffset) { return factory.fromPointerBuilderRefDefault(this.segment, this.pointers + index, defaultSegment, defaultOffset); diff --git a/runtime/src/main/java/org/capnproto/StructReader.java b/runtime/src/main/java/org/capnproto/StructReader.java index 4277239..1bc7e4f 100644 --- a/runtime/src/main/java/org/capnproto/StructReader.java +++ b/runtime/src/main/java/org/capnproto/StructReader.java @@ -154,6 +154,19 @@ public class StructReader { return this.segment.buffer.getLong((this.pointers + ptrIndex) * Constants.BYTES_PER_WORD) == 0; } + protected final T _getPointerField(FromPointerReader 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 _getPointerField(FromPointerReaderRefDefault factory, int ptrIndex, SegmentReader defaultSegment, int defaultOffset) { if (ptrIndex < this.pointerCount) {