Author: bryanduxbury
Date: Sat Jan 16 09:13:20 2010
New Revision: 899911

URL: http://svn.apache.org/viewvc?rev=899911&view=rev
Log:
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.

Modified:
    incubator/thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc

Modified: incubator/thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc
URL: 
http://svn.apache.org/viewvc/incubator/thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc?rev=899911&r1=899910&r2=899911&view=diff
==============================================================================
--- incubator/thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc 
(original)
+++ incubator/thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc Sat 
Jan 16 09:13:20 2010
@@ -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);


Reply via email to