THRIFT-675. java: Generated findByValue() should just switch on value instead of mapping
This patch removes the map-based enum value lookup and replaces it with a static switch statement.
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@899911 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc
index e2da877..d1142e7 100644
--- a/compiler/cpp/src/generate/t_java_generator.cc
+++ b/compiler/cpp/src/generate/t_java_generator.cc
@@ -396,22 +396,13 @@
}
f_enum << ";" << endl << endl;
- indent(f_enum) << "private static final Map<Integer, "+ tenum->get_name() +
- "> BY_VALUE = new HashMap<Integer,"+ tenum->get_name() +">() {{" << endl;
- indent(f_enum) << " for("+ tenum->get_name() +" val : "+ tenum->get_name() +".values()) {" << endl;
- indent(f_enum) << " put(val.getValue(), val);" << endl;
- indent(f_enum) << " }" << endl;
- indent(f_enum) << "}};" << endl;
-
- f_enum << endl;
-
// Field for thriftCode
indent(f_enum) << "private final int value;" << endl << endl;
indent(f_enum) << "private " << tenum->get_name() << "(int value) {" << endl;
indent(f_enum) << " this.value = value;" <<endl;
indent(f_enum) << "}" << endl << endl;
-
+
indent(f_enum) << "/**" << endl;
indent(f_enum) << " * Get the integer value of this enum value, as defined in the Thrift IDL." << endl;
indent(f_enum) << " */" << endl;
@@ -424,7 +415,34 @@
indent(f_enum) << " * @return null if the value is not found." << endl;
indent(f_enum) << " */" << endl;
indent(f_enum) << "public static "+ tenum->get_name() + " findByValue(int value) { " << endl;
- indent(f_enum) << " return BY_VALUE.get(value);" << endl;
+
+ indent_up();
+
+ indent(f_enum) << "switch (value) {" << endl;
+ indent_up();
+
+ value = -1;
+
+ for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
+ if ((*c_iter)->has_value()) {
+ value = (*c_iter)->get_value();
+ } else {
+ ++value;
+ }
+
+ indent(f_enum) << "case " << value << ":" << endl;
+ indent(f_enum) << " return " << (*c_iter)->get_name() << ";" << endl;
+ }
+
+ indent(f_enum) << "default:" << endl;
+ indent(f_enum) << " return null;" << endl;
+
+ indent_down();
+
+ indent(f_enum) << "}" << endl;
+
+ indent_down();
+
indent(f_enum) << "}" << endl;
scope_down(f_enum);