Improve C++ vector deserialization
authorMark Slee <mcslee@apache.org>
Thu, 31 Jan 2008 00:06:29 +0000 (00:06 +0000)
committerMark Slee <mcslee@apache.org>
Thu, 31 Jan 2008 00:06:29 +0000 (00:06 +0000)
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
compiler/cpp/src/generate/t_cpp_generator.h

index 2518509..755fbb5 100644 (file)
@@ -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;
 }
 
 
index ba19c1c..e737d30 100644 (file)
@@ -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,