THRIFT-4830: Add to_string helper function for cpp generator (#1765)
diff --git a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc
index dca3167..d66b6e6 100644
--- a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc
@@ -114,6 +114,8 @@
void generate_enum(t_enum* tenum) override;
void generate_enum_ostream_operator_decl(std::ostream& out, t_enum* tenum);
void generate_enum_ostream_operator(std::ostream& out, t_enum* tenum);
+ void generate_enum_to_string_helper_function_decl(std::ostream& out, t_enum* tenum);
+ void generate_enum_to_string_helper_function(std::ostream& out, t_enum* tenum);
void generate_forward_declaration(t_struct* tstruct) override;
void generate_struct(t_struct* tstruct) override { generate_cpp_struct(tstruct, false); }
void generate_xception(t_struct* txception) override { generate_cpp_struct(txception, true); }
@@ -584,6 +586,9 @@
generate_enum_ostream_operator_decl(f_types_, tenum);
generate_enum_ostream_operator(f_types_impl_, tenum);
+
+ generate_enum_to_string_helper_function_decl(f_types_, tenum);
+ generate_enum_to_string_helper_function(f_types_impl_, tenum);
}
void t_cpp_generator::generate_enum_ostream_operator_decl(std::ostream& out, t_enum* tenum) {
@@ -631,6 +636,45 @@
}
}
+void t_cpp_generator::generate_enum_to_string_helper_function_decl(std::ostream& out, t_enum* tenum) {
+ out << "std::string to_string(const ";
+ if (gen_pure_enums_) {
+ out << tenum->get_name();
+ } else {
+ out << tenum->get_name() << "::type&";
+ }
+ out << " val);" << endl;
+ out << endl;
+}
+
+void t_cpp_generator::generate_enum_to_string_helper_function(std::ostream& out, t_enum* tenum) {
+ if (!has_custom_ostream(tenum)) {
+ out << "std::string to_string(const ";
+ if (gen_pure_enums_) {
+ out << tenum->get_name();
+ } else {
+ out << tenum->get_name() << "::type&";
+ }
+ out << " val) " ;
+ scope_up(out);
+
+ out << indent() << "std::map<int, const char*>::const_iterator it = _"
+ << tenum->get_name() << "_VALUES_TO_NAMES.find(val);" << endl;
+ out << indent() << "if (it != _" << tenum->get_name() << "_VALUES_TO_NAMES.end()) {" << endl;
+ indent_up();
+ out << indent() << "return std::string(it->second);" << endl;
+ indent_down();
+ out << indent() << "} else {" << endl;
+ indent_up();
+ out << indent() << "return std::to_string(static_cast<int>(val));" << endl;
+ indent_down();
+ out << indent() << "}" << endl;
+
+ scope_down(out);
+ out << endl;
+ }
+}
+
/**
* Generates a class that holds all the constants.
*/
diff --git a/lib/cpp/test/EnumTest.cpp b/lib/cpp/test/EnumTest.cpp
index 6487906..388abb7 100644
--- a/lib/cpp/test/EnumTest.cpp
+++ b/lib/cpp/test/EnumTest.cpp
@@ -26,6 +26,13 @@
return os;
}
+std::string to_string(const MyEnumWithCustomOstream::type& val)
+{
+ std::ostringstream os;
+ os << val;
+ return os.str();
+}
+
BOOST_AUTO_TEST_SUITE(EnumTest)
BOOST_AUTO_TEST_CASE(test_enum_value) {
@@ -66,7 +73,6 @@
return ss.str();
}
-
BOOST_AUTO_TEST_CASE(test_enum_ostream)
{
BOOST_CHECK_EQUAL(EnumToString(MyEnum1::ME1_0), "ME1_0");
@@ -75,10 +81,22 @@
BOOST_CHECK_EQUAL(EnumToString(MyEnumWithCustomOstream::CustoM2), "{2:CUSTOM!}");
// some invalid or unknown value
- auto uut = (MyEnum5::type)44;
+ auto uut = static_cast<MyEnum5::type>(44);
BOOST_CHECK_EQUAL(EnumToString(uut), "44");
}
+BOOST_AUTO_TEST_CASE(test_enum_to_string)
+{
+ BOOST_CHECK_EQUAL(::to_string(MyEnum1::ME1_0), "ME1_0");
+ BOOST_CHECK_EQUAL(::to_string(MyEnum5::e2), "e2");
+ BOOST_CHECK_EQUAL(::to_string(MyEnum3::ME3_N1), "ME3_N1");
+ BOOST_CHECK_EQUAL(::to_string(MyEnumWithCustomOstream::CustoM2), "{2:CUSTOM!}");
+
+ // some invalid or unknown value
+ auto uut = static_cast<MyEnum5::type>(44);
+ BOOST_CHECK_EQUAL(::to_string(uut), "44");
+}
+
BOOST_AUTO_TEST_CASE(test_enum_constant)
{
MyStruct ms;