You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by dr...@apache.org on 2010/08/12 23:15:05 UTC

svn commit: r984979 - /incubator/thrift/trunk/compiler/cpp/src/generate/t_cpp_generator.cc

Author: dreiss
Date: Thu Aug 12 21:15:04 2010
New Revision: 984979

URL: http://svn.apache.org/viewvc?rev=984979&view=rev
Log:
THRIFT-676. cpp: Move __isset definition for SWIG-compatibility

Modified:
    incubator/thrift/trunk/compiler/cpp/src/generate/t_cpp_generator.cc

Modified: incubator/thrift/trunk/compiler/cpp/src/generate/t_cpp_generator.cc
URL: http://svn.apache.org/viewvc/incubator/thrift/trunk/compiler/cpp/src/generate/t_cpp_generator.cc?rev=984979&r1=984978&r2=984979&view=diff
==============================================================================
--- incubator/thrift/trunk/compiler/cpp/src/generate/t_cpp_generator.cc (original)
+++ incubator/thrift/trunk/compiler/cpp/src/generate/t_cpp_generator.cc Thu Aug 12 21:15:04 2010
@@ -625,6 +625,59 @@ void t_cpp_generator::generate_struct_de
     extends = " : public ::apache::thrift::TException";
   }
 
+  // Get members
+  vector<t_field*>::const_iterator m_iter;
+  const vector<t_field*>& members = tstruct->get_members();
+
+  // Write the isset structure declaration outside the class. This makes
+  // the generated code amenable to processing by SWIG.
+  // We only declare the struct if it gets used in the class.
+
+  // Isset struct has boolean fields, but only for non-required fields.
+  bool has_nonrequired_fields = false;
+  for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
+    if ((*m_iter)->get_req() != t_field::T_REQUIRED)
+      has_nonrequired_fields = true;
+  }
+
+  if (has_nonrequired_fields && (!pointers || read)) {
+
+    out <<
+      indent() << "typedef struct _" << tstruct->get_name() << "__isset {" << endl;
+    indent_up();
+
+    indent(out) <<
+      "_" << tstruct->get_name() << "__isset() ";
+    bool first = true;
+    for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
+      if ((*m_iter)->get_req() == t_field::T_REQUIRED) {
+        continue;
+      }
+      if (first) {
+        first = false;
+        out <<
+          ": " << (*m_iter)->get_name() << "(false)";
+      } else {
+        out <<
+          ", " << (*m_iter)->get_name() << "(false)";
+      }
+    }
+    out << " {}" << endl;
+
+    for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
+      if ((*m_iter)->get_req() != t_field::T_REQUIRED) {
+        indent(out) <<
+          "bool " << (*m_iter)->get_name() << ";" << endl;
+        }
+      }
+
+      indent_down();
+      indent(out) <<
+        "} _" << tstruct->get_name() << "__isset;" << endl;
+    }
+
+  out << endl;
+
   // Open struct def
   out <<
     indent() << "class " << tstruct->get_name() << extends << " {" << endl <<
@@ -635,10 +688,6 @@ void t_cpp_generator::generate_struct_de
   // Put the fingerprint up top for all to see.
   generate_struct_fingerprint(out, tstruct, false);
 
-  // Get members
-  vector<t_field*>::const_iterator m_iter;
-  const vector<t_field*>& members = tstruct->get_members();
-
   if (!pointers) {
     // Default constructor
     indent(out) <<
@@ -703,47 +752,11 @@ void t_cpp_generator::generate_struct_de
       declare_field(*m_iter, false, pointers && !(*m_iter)->get_type()->is_xception(), !read) << endl;
   }
 
-  // Isset struct has boolean fields, but only for non-required fields.
-  bool has_nonrequired_fields = false;
-  for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-    if ((*m_iter)->get_req() != t_field::T_REQUIRED)
-      has_nonrequired_fields = true;
-  }
-
+  // Add the __isset data member if we need it, using the definition from above
   if (has_nonrequired_fields && (!pointers || read)) {
     out <<
       endl <<
-      indent() << "struct __isset {" << endl;
-    indent_up();
-
-      indent(out) <<
-        "__isset() : ";
-      bool first = true;
-      for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-        if ((*m_iter)->get_req() == t_field::T_REQUIRED) {
-          continue;
-        }
-        if (first) {
-          first = false;
-          out <<
-            (*m_iter)->get_name() << "(false)";
-        } else {
-          out <<
-            ", " << (*m_iter)->get_name() << "(false)";
-        }
-      }
-      out << " {}" << endl;
-
-      for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-        if ((*m_iter)->get_req() != t_field::T_REQUIRED) {
-          indent(out) <<
-            "bool " << (*m_iter)->get_name() << ";" << endl;
-        }
-      }
-
-    indent_down();
-    indent(out) <<
-      "} __isset;" << endl;
+      indent() << "_" << tstruct->get_name() << "__isset __isset;" << endl;
   }
 
   out << endl;