void generate_local_reflection_pointer(std::ofstream& out, t_type* ttype);
bool is_reference(t_field* tfield) {
- return tfield->annotations_.count("cpp.ref") != 0;
+ return tfield->get_reference();
}
bool is_complex_type(t_type* ttype) {
const vector<t_field*>& members = tstruct->get_members();
vector<t_field*>::const_iterator f_iter;
for (f_iter = members.begin(); f_iter != members.end(); ++f_iter) {
- if (is_reference(*f_iter)) {
- std::string type = type_name((*f_iter)->get_type());
- indent(out) << (*f_iter)->get_name() << " = new " << type << "(*" << tmp_name << "." <<
- (*f_iter)->get_name() << ");" << endl;
- } else {
- indent(out) << (*f_iter)->get_name() << " = " << tmp_name << "." <<
- (*f_iter)->get_name() << ";" << endl;
- }
+ indent(out) << (*f_iter)->get_name() << " = " << tmp_name << "." <<
+ (*f_iter)->get_name() << ";" << endl;
}
indent_down();
const vector<t_field*>& members = tstruct->get_members();
vector<t_field*>::const_iterator f_iter;
for (f_iter = members.begin(); f_iter != members.end(); ++f_iter) {
- if (is_reference(*f_iter)) {
- std::string type = type_name((*f_iter)->get_type());
- indent(out) << "if (this == &" << tmp_name << ") return *this;" << endl;
- indent(out) << "if (" << (*f_iter)->get_name() << ") {" << endl;
- indent(out) << " *" << (*f_iter)->get_name() << " = *" << tmp_name << "." <<
- (*f_iter)->get_name() << ";" << endl;
- indent(out) << "} else {" << endl;
- indent(out) << " " << (*f_iter)->get_name() << " = new " << type << "(*" << tmp_name << "." <<
- (*f_iter)->get_name() << ");" << endl;
- indent(out) << "}" << endl;
- } else {
- indent(out) << (*f_iter)->get_name() << " = " << tmp_name << "." <<
- (*f_iter)->get_name() << ";" << endl;
- }
+ indent(out) << (*f_iter)->get_name() << " = " << tmp_name << "." <<
+ (*f_iter)->get_name() << ";" << endl;
}
indent(out) << "return *this;" << endl;
// Declare all fields
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
indent(out) <<
- declare_field(*m_iter, false, (pointers && !(*m_iter)->get_type()->is_xception()) || is_reference(*m_iter), !read) << endl;
+ declare_field(*m_iter, false, (pointers && !(*m_iter)->get_type()->is_xception()), !read) << endl;
}
// Add the __isset data member if we need it, using the definition from above
if (pointers) {
continue;
}
- out <<
- endl <<
- indent() << "void __set_" << (*m_iter)->get_name() <<
+ if (is_reference((*m_iter))) {
+ out <<
+ endl <<
+ indent() << "void __set_" << (*m_iter)->get_name() <<
+ "(boost::shared_ptr<" << type_name((*m_iter)->get_type(), false, false) << ">";
+ out << " val);" << endl;
+ } else {
+ out <<
+ endl <<
+ indent() << "void __set_" << (*m_iter)->get_name() <<
"(" << type_name((*m_iter)->get_type(), false, true);
- out << " val);" << endl;
+ out << " val);" << endl;
+ }
}
out << endl;
indent() << tstruct->get_name() << "::~" << tstruct->get_name() << "() throw() {" << endl;
indent_up();
- for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
- if (is_reference(*m_iter)) {
- out << indent() <<
- "delete " << (*m_iter)->get_name() << ";" << endl;
- }
- }
-
indent_down();
out << indent() << "}" << endl << endl;
}
// Create a setter function for each field
if (setters) {
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
- out <<
- endl <<
- indent() << "void " << tstruct->get_name() << "::__set_" << (*m_iter)->get_name() <<
- "(" << type_name((*m_iter)->get_type(), false, true);
- out << " val) {" << endl;
- indent_up();
if (is_reference((*m_iter))) {
std::string type = type_name((*m_iter)->get_type());
- indent(out) << "if (" << (*m_iter)->get_name() << ") {" << endl;
- indent(out) << " *" << (*m_iter)->get_name() << " = val;" << endl;
- indent(out) << "} else {" << endl;
- indent(out) << " " << (*m_iter)->get_name() << " = new " << type << "(val);" << endl;
- indent(out) << "}" << endl;
+ out <<
+ endl <<
+ indent() << "void " << tstruct->get_name() << "::__set_" << (*m_iter)->get_name() <<
+ "(boost::shared_ptr<" << type_name((*m_iter)->get_type(), false, false) << ">";
+ out << " val) {" << endl;
} else {
- out << indent() << (*m_iter)->get_name() << " = val;" << endl;
+ out <<
+ endl <<
+ indent() << "void " << tstruct->get_name() << "::__set_" << (*m_iter)->get_name() <<
+ "(" << type_name((*m_iter)->get_type(), false, true);
+ out << " val) {" << endl;
}
+ indent_up();
+ out << indent() << (*m_iter)->get_name() << " = val;" << endl;
indent_down();
// assume all fields are required except optional fields.
out <<
indent() << "uint32_t xfer = 0;" << endl;
+ indent(out) << "oprot->incrementRecursionDepth();" << endl;
indent(out) <<
"xfer += oprot->writeStructBegin(\"" << name << "\");" << endl;
out <<
indent() << "xfer += oprot->writeFieldStop();" << endl <<
indent() << "xfer += oprot->writeStructEnd();" << endl <<
+ indent() << "oprot->decrementRecursionDepth();" << endl <<
indent() << "return xfer;" << endl;
indent_down();
bool pointer) {
if (pointer) {
indent(out) << "if (!" << prefix << ") { " << endl;
- indent(out) << " " << prefix << " = new " << type_name(tstruct) << ";" << endl;
+ indent(out) << " " << prefix << " = boost::shared_ptr<" << type_name(tstruct) << ">(new " << type_name(tstruct) << ");" << endl;
indent(out) << "}" << endl;
indent(out) <<
"xfer += " << prefix << "->read(iprot);" << endl;
result += "const ";
}
result += type_name(tfield->get_type());
+ if (is_reference(tfield)) {
+ result = "boost::shared_ptr<" + result + ">";
+ }
if (pointer) {
result += "*";
}
%token tok_required
%token tok_optional
%token tok_union
+%token tok_reference
/**
* Grammar nodes
%type<ttype> FieldType
%type<tconstv> FieldValue
%type<tstruct> FieldList
+%type<tbool> FieldReference
%type<tenum> Enum
%type<tenum> EnumDefList
}
Field:
- CaptureDocText FieldIdentifier FieldRequiredness FieldType tok_identifier FieldValue XsdOptional XsdNillable XsdAttributes TypeAnnotations CommaOrSemicolonOptional
+ CaptureDocText FieldIdentifier FieldRequiredness FieldType FieldReference tok_identifier FieldValue XsdOptional XsdNillable XsdAttributes TypeAnnotations CommaOrSemicolonOptional
{
pdebug("tok_int_constant : Field -> FieldType tok_identifier");
if ($2.auto_assigned) {
- pwarning(1, "No field key specified for %s, resulting protocol may have conflicts or not be backwards compatible!\n", $5);
+ pwarning(1, "No field key specified for %s, resulting protocol may have conflicts or not be backwards compatible!\n", $6);
if (g_strict >= 192) {
yyerror("Implicit field keys are deprecated and not allowed with -strict");
exit(1);
}
}
- validate_simple_identifier($5);
- $$ = new t_field($4, $5, $2.value);
+ validate_simple_identifier($6);
+ $$ = new t_field($4, $6, $2.value);
+ $$->set_reference($5);
$$->set_req($3);
- if ($6 != NULL) {
- g_scope->resolve_const_value($6, $4);
- validate_field_value($$, $6);
- $$->set_value($6);
+ if ($7 != NULL) {
+ g_scope->resolve_const_value($7, $4);
+ validate_field_value($$, $7);
+ $$->set_value($7);
}
- $$->set_xsd_optional($7);
- $$->set_xsd_nillable($8);
+ $$->set_xsd_optional($8);
+ $$->set_xsd_nillable($9);
if ($1 != NULL) {
$$->set_doc($1);
}
- if ($9 != NULL) {
- $$->set_xsd_attrs($9);
- }
if ($10 != NULL) {
- $$->annotations_ = $10->annotations_;
- delete $10;
+ $$->set_xsd_attrs($10);
+ }
+ if ($11 != NULL) {
+ $$->annotations_ = $11->annotations_;
+ delete $11;
}
}
$$.auto_assigned = true;
}
+FieldReference:
+ tok_reference
+ {
+ $$ = true;
+ }
+|
+ {
+ $$ = false;
+ }
+
FieldRequiredness:
tok_required
{