From 8d4b1cc3ab706c8116e279782a1773f5b011860a Mon Sep 17 00:00:00 2001 From: Mark Slee Date: Thu, 31 Jan 2008 00:06:29 +0000 Subject: [PATCH] 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 --- compiler/cpp/src/generate/t_cpp_generator.cc | 18 ++++++------------ compiler/cpp/src/generate/t_cpp_generator.h | 3 ++- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/compiler/cpp/src/generate/t_cpp_generator.cc b/compiler/cpp/src/generate/t_cpp_generator.cc index 2518509e..755fbb59 100644 --- a/compiler/cpp/src/generate/t_cpp_generator.cc +++ b/compiler/cpp/src/generate/t_cpp_generator.cc @@ -2261,7 +2261,8 @@ void t_cpp_generator::generate_deserialize_container(ofstream& out, 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 @@ 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); + generate_deserialize_list_element(out, (t_list*)ttype, prefix, i); } scope_down(out); @@ -2335,17 +2336,10 @@ 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) { - 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 ba19c1cf..e737d305 100644 --- a/compiler/cpp/src/generate/t_cpp_generator.h +++ b/compiler/cpp/src/generate/t_cpp_generator.h @@ -108,7 +108,8 @@ class t_cpp_generator : public t_oop_generator { 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, -- 2.17.1