This is an automated email from the ASF dual-hosted git repository.
jking pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/thrift.git
The following commit(s) were added to refs/heads/master by this push:
new 6a61dfa THRIFT-4830: Add to_string helper function for cpp generator
(#1765)
6a61dfa is described below
commit 6a61dfabbf6ae2fa9fbbc3996590ebdbe38e569f
Author: soroshsabz <[email protected]>
AuthorDate: Tue Jul 2 04:43:54 2019 +0430
THRIFT-4830: Add to_string helper function for cpp generator (#1765)
---
.../cpp/src/thrift/generate/t_cpp_generator.cc | 44 ++++++++++++++++++++++
lib/cpp/test/EnumTest.cpp | 22 ++++++++++-
2 files changed, 64 insertions(+), 2 deletions(-)
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 @@ public:
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 @@ void t_cpp_generator::generate_enum(t_enum* tenum) {
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_ostream_operator(std::ostream& out, t_enum*
}
}
+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 @@ std::ostream& operator <<(std::ostream& os, const
MyEnumWithCustomOstream::type&
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 @@ std::string EnumToString(_T e)
return ss.str();
}
-
BOOST_AUTO_TEST_CASE(test_enum_ostream)
{
BOOST_CHECK_EQUAL(EnumToString(MyEnum1::ME1_0), "ME1_0");
@@ -75,10 +81,22 @@ BOOST_AUTO_TEST_CASE(test_enum_ostream)
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;