From a6d31c57f0f9e253f8e669495ca8f28e85c11f16 Mon Sep 17 00:00:00 2001 From: Bryan Duxbury Date: Thu, 10 Mar 2011 18:14:14 +0000 Subject: [PATCH] THRIFT-627. cpp: should c++ have setters for optional fields? Yes, it should. Patch: Jake Farrell git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1080303 13f79535-47bb-0310-9956-ffa450edef68 --- compiler/cpp/src/generate/t_cpp_generator.cc | 31 ++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/compiler/cpp/src/generate/t_cpp_generator.cc b/compiler/cpp/src/generate/t_cpp_generator.cc index 8dfb0ee3..1d18a37c 100644 --- a/compiler/cpp/src/generate/t_cpp_generator.cc +++ b/compiler/cpp/src/generate/t_cpp_generator.cc @@ -198,6 +198,7 @@ class t_cpp_generator : public t_oop_generator { std::string argument_list(t_struct* tstruct, bool name_params=true, bool start_comma=false); std::string type_to_enum(t_type* ttype); std::string local_reflection_name(const char*, t_type* ttype, bool external=false); + std::string get_cap_name(std::string name); void generate_enum_constant_list(std::ofstream& f, const vector& constants, @@ -286,6 +287,13 @@ class t_cpp_generator : public t_oop_generator { std::set reflected_fingerprints_; }; +/** + * Uppercases the first letter of the name + */ +std::string t_cpp_generator::get_cap_name(std::string name) { + name[0] = toupper(name[0]); + return name; +} /** * Prepares for file generation by opening up the necessary file output @@ -897,6 +905,29 @@ void t_cpp_generator::generate_struct_definition(ofstream& out, indent() << "_" << tstruct->get_name() << "__isset __isset;" << endl; } + // Create a setter function for each field + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + if (pointers) { + continue; + } + out << + endl << + indent() << "void __set" << get_cap_name((*m_iter)->get_name()) << + "(" << type_name((*m_iter)->get_type(), false, true); + out << " val) {" << endl << indent() << + indent() << (*m_iter)->get_name() << " = val;" << endl; + + // assume all fields are required except optional fields. + // for optional fields change __isset.name to true + bool is_optional = (*m_iter)->get_req() == t_field::T_OPTIONAL; + if (is_optional) { + out << + indent() << + indent() << "__isset." << (*m_iter)->get_name() << " = true;" << endl; + } + out << + indent()<< "}" << endl; + } out << endl; if (!pointers) { -- 2.17.1