Skip to content

Commit

Permalink
Also generate destructor for _result, presult, args, pargs
Browse files Browse the repository at this point in the history
  • Loading branch information
Dave Watson committed Apr 9, 2014
1 parent e0e8316 commit f4daec9
Showing 1 changed file with 34 additions and 27 deletions.
61 changes: 34 additions & 27 deletions compiler/cpp/src/generate/t_cpp_generator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ class t_cpp_generator : public t_oop_generator {
bool read=true,
bool write=true,
bool swap=false);
void generate_struct_definition (std::ofstream& out, t_struct* tstruct);
void generate_struct_definition (std::ofstream& out, t_struct* tstruct, bool setters=true);
void generate_copy_constructor (std::ofstream& out, t_struct* tstruct);
void generate_assignment_operator (std::ofstream& out, t_struct* tstruct);
void generate_struct_fingerprint (std::ofstream& out, t_struct* tstruct, bool is_definition);
Expand Down Expand Up @@ -1137,7 +1137,8 @@ void t_cpp_generator::generate_struct_declaration(ofstream& out,
}

void t_cpp_generator::generate_struct_definition(ofstream& out,
t_struct* tstruct) {
t_struct* tstruct,
bool setters) {
// Get members
vector<t_field*>::const_iterator m_iter;
const vector<t_field*>& members = tstruct->get_members();
Expand All @@ -1162,35 +1163,37 @@ void t_cpp_generator::generate_struct_definition(ofstream& out,
}

// Create a setter function for each field
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
out <<
endl <<
indent() << "void " << tstruct->get_name() << "::__set_" << (*m_iter)->get_name() <<
if (setters) {
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
out <<
endl <<
indent() << "void " << tstruct->get_name() << "::__set_" << (*m_iter)->get_name() <<
"(" << type_name((*m_iter)->get_type(), false, true);
out << " val) {" << endl;
indent_up();
if (is_reference((*m_iter))) {
std::string type = type_name((*m_iter)->get_type());
indent(out) << "if (" << (*m_iter)->get_name() << ") {" << endl;
indent(out) << " *" << (*m_iter)->get_name() << " = val;" << endl;
indent(out) << "} else {" << endl;
indent(out) << " " << (*m_iter)->get_name() << " = new " << type << "(val);" << endl;
indent(out) << "}" << endl;
} else {
out << indent() << (*m_iter)->get_name() << " = val;" << endl;
}
indent_down();
out << " val) {" << endl;
indent_up();
if (is_reference((*m_iter))) {
std::string type = type_name((*m_iter)->get_type());
indent(out) << "if (" << (*m_iter)->get_name() << ") {" << endl;
indent(out) << " *" << (*m_iter)->get_name() << " = val;" << endl;
indent(out) << "} else {" << endl;
indent(out) << " " << (*m_iter)->get_name() << " = new " << type << "(val);" << endl;
indent(out) << "}" << endl;
} else {
out << indent() << (*m_iter)->get_name() << " = val;" << endl;
}
indent_down();

// 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) {
// 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() <<
indent() << "__isset." << (*m_iter)->get_name() << " = true;" << endl;
indent()<< "}" << endl;
}
out <<
indent()<< "}" << endl;
}
out << endl;
}
Expand Down Expand Up @@ -1887,10 +1890,12 @@ void t_cpp_generator::generate_service_helpers(t_service* tservice) {
// TODO(dreiss): Why is this stuff not in generate_function_helpers?
ts->set_name(tservice->get_name() + "_" + (*f_iter)->get_name() + "_args");
generate_struct_declaration(f_header_, ts, false);
generate_struct_definition(out, ts, false);
generate_struct_reader(out, ts);
generate_struct_writer(out, ts);
ts->set_name(tservice->get_name() + "_" + (*f_iter)->get_name() + "_pargs");
generate_struct_declaration(f_header_, ts, false, true, false, true);
generate_struct_definition(out, ts, false);
generate_struct_writer(out, ts, true);
ts->set_name(name_orig);

Expand Down Expand Up @@ -3342,11 +3347,13 @@ void t_cpp_generator::generate_function_helpers(t_service* tservice,
}

generate_struct_declaration(f_header_, &result, false);
generate_struct_definition(out, &result, false);
generate_struct_reader(out, &result);
generate_struct_result_writer(out, &result);

result.set_name(tservice->get_name() + "_" + tfunction->get_name() + "_presult");
generate_struct_declaration(f_header_, &result, false, true, true, gen_cob_style_);
generate_struct_definition(out, &result, false);
generate_struct_reader(out, &result, true);
if (gen_cob_style_) {
generate_struct_writer(out, &result, true);
Expand Down

0 comments on commit f4daec9

Please sign in to comment.