From: Bryan Duxbury Date: Sat, 16 Jan 2010 09:13:20 +0000 (+0000) Subject: THRIFT-675. java: Generated findByValue() should just switch on value instead of... X-Git-Tag: 0.3.0~135 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=c4ad9be578f22e240b28af2ca89f83ac18179cd1;p=common%2Fthrift.git 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 e2da8771..d1142e76 100644 --- a/compiler/cpp/src/generate/t_java_generator.cc +++ b/compiler/cpp/src/generate/t_java_generator.cc @@ -396,22 +396,13 @@ void t_java_generator::generate_enum(t_enum* tenum) { } f_enum << ";" << endl << endl; - indent(f_enum) << "private static final Mapget_name() + - "> BY_VALUE = new HashMapget_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;" <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);