summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2010-05-12 12:36:31 -0700
committerMark Spruiell <mes@zeroc.com>2010-05-12 12:36:31 -0700
commitc428a295ed96f37c2ee4a89f94788c88e8b6e34e (patch)
treec356defeeff631c2037d7aa479676aec66e542b9 /cpp
parentbug 4737: (diff)
downloadice-c428a295ed96f37c2ee4a89f94788c88e8b6e34e.tar.bz2
ice-c428a295ed96f37c2ee4a89f94788c88e8b6e34e.tar.xz
ice-c428a295ed96f37c2ee4a89f94788c88e8b6e34e.zip
bug 4725 - generate one shot constructor for structs
Diffstat (limited to 'cpp')
-rw-r--r--cpp/src/slice2cpp/Gen.cpp82
1 files changed, 44 insertions, 38 deletions
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp
index da57ebf4d9b..02c01bcaf13 100644
--- a/cpp/src/slice2cpp/Gen.cpp
+++ b/cpp/src/slice2cpp/Gen.cpp
@@ -1049,44 +1049,6 @@ Slice::Gen::TypesVisitor::visitStructStart(const StructPtr& p)
{
H << nl << name << "() {}";
}
-
- if(!dataMembers.empty())
- {
- DataMemberList::const_iterator q;
- vector<string> paramDecls;
- vector<string> types;
- for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
- {
- string typeName = inputTypeToString((*q)->type(), (*q)->getMetaData(), _useWstring);
- types.push_back(typeName);
- paramDecls.push_back(typeName + " __ice_" + (*q)->name());
- }
-
- H << nl;
- if(paramDecls.size() == 1)
- {
- H << "explicit ";
- }
- H << name << spar << types << epar << ';';
-
- C << sp << nl << fixKwd(p->scoped()).substr(2) << "::"
- << fixKwd(p->name()) << spar << paramDecls << epar << " :";
- C.inc();
-
- for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
- {
- if(q != dataMembers.begin())
- {
- C << ',';
- }
- string memberName = fixKwd((*q)->name());
- C << nl << memberName << '(' << "__ice_" << (*q)->name() << ')';
- }
-
- C.dec();
- C << sb;
- C << eb;
- }
}
else
{
@@ -1105,6 +1067,50 @@ Slice::Gen::TypesVisitor::visitStructStart(const StructPtr& p)
}
}
+ //
+ // Generate a one-shot constructor if the struct uses the class mapping, or if at least
+ // one of its members has a default value.
+ //
+ if(!dataMembers.empty() && (findMetaData(p->getMetaData()) == "class" || p->hasDefaultValues()))
+ {
+ DataMemberList::const_iterator q;
+ vector<string> paramDecls;
+ vector<string> types;
+ for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
+ {
+ string typeName = inputTypeToString((*q)->type(), (*q)->getMetaData(), _useWstring);
+ types.push_back(typeName);
+ paramDecls.push_back(typeName + " __ice_" + (*q)->name());
+ }
+
+ H << nl;
+ if(paramDecls.size() == 1)
+ {
+ H << "explicit ";
+ }
+ H << name << spar << types << epar << ';';
+
+ C << sp << nl << fixKwd(p->scoped()).substr(2) << "::"
+ << fixKwd(p->name()) << spar << paramDecls << epar << " :";
+ C.inc();
+
+ for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
+ {
+ if(q != dataMembers.begin())
+ {
+ C << ',';
+ }
+ string memberName = fixKwd((*q)->name());
+ C << nl << memberName << '(' << "__ice_" << (*q)->name() << ')';
+ }
+
+ C.dec();
+ C << sb;
+ C << eb;
+ }
+
+ H << sp;
+
return true;
}