Improve C++ vector deserialization
Summary: Use std::vector::resize() method to default construct placeholder elements. Then grab references via operator[] to deserialize directly into the vector, instead of copy-constructing elements in.
Reviewed By: hzhao
Test Plan: test/cpp contains list serialization/deserialization checks
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665449 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 2518509..755fbb5 100644
--- a/compiler/cpp/src/generate/t_cpp_generator.cc
+++ b/compiler/cpp/src/generate/t_cpp_generator.cc
@@ -2261,7 +2261,8 @@
out <<
indent() << "facebook::thrift::protocol::TType " << etype << ";" << endl <<
indent() << "iprot->readListBegin(" <<
- etype << ", " << size << ");" << endl;
+ etype << ", " << size << ");" << endl <<
+ indent() << prefix << ".resize(" << size << ");";
}
@@ -2278,7 +2279,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);
+ generate_deserialize_list_element(out, (t_list*)ttype, prefix, i);
}
scope_down(out);
@@ -2335,17 +2336,10 @@
void t_cpp_generator::generate_deserialize_list_element(ofstream& out,
t_list* tlist,
- string prefix) {
- string elem = tmp("_elem");
- t_field felem(tlist->get_elem_type(), elem);
-
- indent(out) <<
- declare_field(&felem) << endl;
-
+ string prefix,
+ string index) {
+ t_field felem(tlist->get_elem_type(), prefix + "[" + index + "]");
generate_deserialize_field(out, &felem);
-
- indent(out) <<
- prefix << ".push_back(" << elem << ");" << endl;
}
diff --git a/compiler/cpp/src/generate/t_cpp_generator.h b/compiler/cpp/src/generate/t_cpp_generator.h
index ba19c1c..e737d30 100644
--- a/compiler/cpp/src/generate/t_cpp_generator.h
+++ b/compiler/cpp/src/generate/t_cpp_generator.h
@@ -108,7 +108,8 @@
void generate_deserialize_list_element (std::ofstream& out,
t_list* tlist,
- std::string prefix="");
+ std::string prefix,
+ std::string index);
void generate_serialize_field (std::ofstream& out,
t_field* tfield,