From: Mark Slee Date: Thu, 31 Jan 2008 22:02:26 +0000 (+0000) Subject: If a list has a custom CPP type, use push_back X-Git-Tag: 0.2.0~1021 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=5cf89c1610e54609b551f7d46d2745c2f16d00c2;p=common%2Fthrift.git If a list has a custom CPP type, use push_back Summary: Can't deserialize by reference into std::list, for example Reviewed By: dweatherford Test Plan: Build feed git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665451 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/compiler/cpp/src/generate/t_cpp_generator.cc b/compiler/cpp/src/generate/t_cpp_generator.cc index 755fbb59..660b2a41 100644 --- a/compiler/cpp/src/generate/t_cpp_generator.cc +++ b/compiler/cpp/src/generate/t_cpp_generator.cc @@ -2241,6 +2241,9 @@ void t_cpp_generator::generate_deserialize_container(ofstream& out, string vtype = tmp("_vtype"); string etype = tmp("_etype"); + t_container* tcontainer = (t_container*)ttype; + bool use_push = tcontainer->has_cpp_name(); + indent(out) << prefix << ".clear();" << endl << indent() << "uint32_t " << size << ";" << endl; @@ -2261,8 +2264,10 @@ void t_cpp_generator::generate_deserialize_container(ofstream& out, out << indent() << "facebook::thrift::protocol::TType " << etype << ";" << endl << indent() << "iprot->readListBegin(" << - etype << ", " << size << ");" << endl << - indent() << prefix << ".resize(" << size << ");"; + etype << ", " << size << ");" << endl; + if (!use_push) { + indent(out) << prefix << ".resize(" << size << ");" << endl; + } } @@ -2279,7 +2284,7 @@ void t_cpp_generator::generate_deserialize_container(ofstream& out, } else if (ttype->is_set()) { generate_deserialize_set_element(out, (t_set*)ttype, prefix); } else if (ttype->is_list()) { - generate_deserialize_list_element(out, (t_list*)ttype, prefix, i); + generate_deserialize_list_element(out, (t_list*)ttype, prefix, use_push, i); } scope_down(out); @@ -2337,9 +2342,18 @@ void t_cpp_generator::generate_deserialize_set_element(ofstream& out, void t_cpp_generator::generate_deserialize_list_element(ofstream& out, t_list* tlist, string prefix, + bool use_push, string index) { - t_field felem(tlist->get_elem_type(), prefix + "[" + index + "]"); - generate_deserialize_field(out, &felem); + if (use_push) { + string elem = tmp("_elem"); + t_field felem(tlist->get_elem_type(), elem); + indent(out) << declare_field(&felem) << endl; + generate_deserialize_field(out, &felem); + indent(out) << prefix << ".push_back(" << elem << ";" << endl; + } else { + t_field felem(tlist->get_elem_type(), prefix + "[" + index + "]"); + generate_deserialize_field(out, &felem); + } } diff --git a/compiler/cpp/src/generate/t_cpp_generator.h b/compiler/cpp/src/generate/t_cpp_generator.h index e737d305..8b395a5a 100644 --- a/compiler/cpp/src/generate/t_cpp_generator.h +++ b/compiler/cpp/src/generate/t_cpp_generator.h @@ -109,6 +109,7 @@ class t_cpp_generator : public t_oop_generator { void generate_deserialize_list_element (std::ofstream& out, t_list* tlist, std::string prefix, + bool push_back, std::string index); void generate_serialize_field (std::ofstream& out,