From 32d2a7bbdadb99d5debb8b26111787d05ff5c217 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Wed, 1 Oct 2014 21:32:59 -0400 Subject: [PATCH] don't use values() for Which --- compiler/src/main/cpp/capnpc-java.c++ | 53 +++++++++++-------- .../org/capnproto/GeneratedClassSupport.java | 9 ---- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/compiler/src/main/cpp/capnpc-java.c++ b/compiler/src/main/cpp/capnpc-java.c++ index 77c1ed7..c6abe58 100644 --- a/compiler/src/main/cpp/capnpc-java.c++ +++ b/compiler/src/main/cpp/capnpc-java.c++ @@ -610,9 +610,9 @@ private: kj::str( spaces(indent), " _builder.setShortField(", discrimOffset, ", (short)", scope, "Which.", upperCase, ".ordinal());\n"), - kj::strTree(spaces(indent), " public final boolean is", titleCase, "() {\n", - spaces(indent), " return which() == ", scope, "Which.", upperCase,";\n", - spaces(indent), " }\n"), + kj::strTree(spaces(indent), "public final boolean is", titleCase, "() {\n", + spaces(indent), " return which() == ", scope, "Which.", upperCase,";\n", + spaces(indent), "}\n"), kj::strTree(spaces(indent), "public final boolean is", titleCase, "() {\n", spaces(indent), " return which() == ", scope, "Which.", upperCase, ";\n", spaces(indent), "}\n"), @@ -1236,19 +1236,36 @@ private: kj::StringTree inlineMethodDefs; }; + kj::StringTree makeWhich(StructSchema schema, kj::String member, int indent) { + if (schema.getProto().getStruct().getDiscriminantCount() == 0) { + return kj::strTree(); + } else { + auto fields = schema.getUnionFields(); + return kj::strTree( + spaces(indent), "public Which which() {\n", + spaces(indent+1), "switch(", member, ".getShortField(", + schema.getProto().getStruct().getDiscriminantOffset(), ")) {\n", + KJ_MAP(f, fields) { + return kj::strTree(spaces(indent+2), "case ", f.getProto().getDiscriminantValue(), " : return ", + "Which.", + toUpperCase(f.getProto().getName()), ";\n"); + }, + spaces(indent+2), "default: return Which._UNKNOWN;\n", + spaces(indent+1), "}\n", + spaces(indent), "}\n" + ); + } + } + + kj::StringTree makeReaderDef(kj::StringPtr fullName, kj::StringPtr unqualifiedParentType, - bool isUnion, uint discriminantOffset, kj::Array&& methodDecls, + StructSchema schema, kj::Array&& methodDecls, int indent) { return kj::strTree( spaces(indent), "public static final class Reader {\n", spaces(indent), " public Reader(org.capnproto.StructReader base){ this._reader = base; }\n", "\n", - (isUnion ? - kj::strTree(spaces(indent), " public Which which() {\n", - spaces(indent), " return org.capnproto.GeneratedClassSupport.clampOrdinal(Which.values(),", - "_reader.getShortField(", discriminantOffset, "));\n", - spaces(indent), " }\n") - : kj::strTree()), + makeWhich(schema, kj::str("_reader"), indent+1), kj::mv(methodDecls), spaces(indent), " public org.capnproto.StructReader _reader;\n", spaces(indent), "}\n" @@ -1256,20 +1273,13 @@ private: } kj::StringTree makeBuilderDef(kj::StringPtr fullName, kj::StringPtr unqualifiedParentType, - schema::Node::Struct::Reader structNode, - kj::Array&& methodDecls, + StructSchema schema, kj::Array&& methodDecls, int indent) { - bool isUnion = structNode.getDiscriminantCount() != 0; return kj::strTree( spaces(indent), "public static final class Builder {\n", spaces(indent), " public Builder(org.capnproto.StructBuilder base){ this._builder = base; }\n", spaces(indent), " public org.capnproto.StructBuilder _builder;\n", - (isUnion ? - kj::strTree(spaces(indent), " public Which which() {\n", - spaces(indent), " return org.capnproto.GeneratedClassSupport.clampOrdinal(Which.values(),", - "_builder.getShortField(", structNode.getDiscriminantOffset(), "));\n", - spaces(indent), " }\n") - : kj::strTree()), + makeWhich(schema, kj::str("_builder"), indent+1), spaces(indent), " public final Reader asReader() {\n", spaces(indent), " return new Reader(this._builder.asReader());\n", spaces(indent), " }\n", @@ -1317,11 +1327,10 @@ private: spaces(indent), " public static final Factory factory = new Factory();\n", - kj::strTree(makeReaderDef(fullName, name, structNode.getDiscriminantCount() != 0, - structNode.getDiscriminantOffset(), + kj::strTree(makeReaderDef(fullName, name, schema, KJ_MAP(f, fieldTexts) { return kj::mv(f.readerMethodDecls); }, indent + 1), - makeBuilderDef(fullName, name, structNode, + makeBuilderDef(fullName, name, schema, KJ_MAP(f, fieldTexts) { return kj::mv(f.builderMethodDecls); }, indent + 1)), diff --git a/runtime/src/main/java/org/capnproto/GeneratedClassSupport.java b/runtime/src/main/java/org/capnproto/GeneratedClassSupport.java index d2b357a..e8a6624 100644 --- a/runtime/src/main/java/org/capnproto/GeneratedClassSupport.java +++ b/runtime/src/main/java/org/capnproto/GeneratedClassSupport.java @@ -1,15 +1,6 @@ package org.capnproto; public final class GeneratedClassSupport { - - public static T clampOrdinal(T values[], short ordinal) { - int index = ordinal; - if (ordinal < 0 || ordinal >= values.length) { - index = values.length - 1; - } - return values[index]; - } - public static byte[] decodeRawBytes(String s) { try { return s.getBytes("ISO_8859-1");