diff options
author | Mark Spruiell <mes@zeroc.com> | 2010-05-12 12:36:31 -0700 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2010-05-12 12:36:31 -0700 |
commit | c428a295ed96f37c2ee4a89f94788c88e8b6e34e (patch) | |
tree | c356defeeff631c2037d7aa479676aec66e542b9 /cpp | |
parent | bug 4737: (diff) | |
download | ice-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.cpp | 82 |
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; } |