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 755fbb5..660b2a4 100644
--- a/compiler/cpp/src/generate/t_cpp_generator.cc
+++ b/compiler/cpp/src/generate/t_cpp_generator.cc
@@ -2241,6 +2241,9 @@
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 @@
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 @@
} 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_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 e737d30..8b395a5 100644
--- a/compiler/cpp/src/generate/t_cpp_generator.h
+++ b/compiler/cpp/src/generate/t_cpp_generator.h
@@ -109,6 +109,7 @@
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,