summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Reiss <dreiss@apache.org>2010-08-12 21:15:04 +0000
committerDavid Reiss <dreiss@apache.org>2010-08-12 21:15:04 +0000
commite2350512c9e2bcff8f5d3c2a3108e2573e85a1a5 (patch)
tree02b8e50b591ccc0f0b715b2aa8cf5b3f8a919e2b
parent07b2ed1df5a7438c974480c2888ec64437c1466e (diff)
downloadthrift-e2350512c9e2bcff8f5d3c2a3108e2573e85a1a5.tar.gz
THRIFT-676. cpp: Move __isset definition for SWIG-compatibility
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@984979 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--compiler/cpp/src/generate/t_cpp_generator.cc97
1 files changed, 55 insertions, 42 deletions
diff --git a/compiler/cpp/src/generate/t_cpp_generator.cc b/compiler/cpp/src/generate/t_cpp_generator.cc
index d3931daf3..4e4e48a7b 100644
--- a/compiler/cpp/src/generate/t_cpp_generator.cc
+++ b/compiler/cpp/src/generate/t_cpp_generator.cc
@@ -625,6 +625,59 @@ void t_cpp_generator::generate_struct_definition(ofstream& out,
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_definition(ofstream& out,
// 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_definition(ofstream& out,
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;