diff options
author | Joe George <joe@zeroc.com> | 2016-07-11 09:17:55 -0400 |
---|---|---|
committer | Joe George <joe@zeroc.com> | 2016-07-11 09:25:01 -0400 |
commit | ef64ff67e60bf1e64d15608b96fcb4591add2426 (patch) | |
tree | 71d77ee61490e0fb213128468a910d6303b5645e /cpp/src/Slice/CPlusPlusUtil.cpp | |
parent | Update to use latest Gradle Ice builder version (diff) | |
download | ice-ef64ff67e60bf1e64d15608b96fcb4591add2426.tar.bz2 ice-ef64ff67e60bf1e64d15608b96fcb4591add2426.tar.xz ice-ef64ff67e60bf1e64d15608b96fcb4591add2426.zip |
StreamReader/Writer improvements
- No longer generate StreamWriter partial template specialization for
C++ classes/structs/exceptions which have no optional members.
- Reduce generated code size for all C++11 StreamReader/Writers.
Diffstat (limited to 'cpp/src/Slice/CPlusPlusUtil.cpp')
-rw-r--r-- | cpp/src/Slice/CPlusPlusUtil.cpp | 162 |
1 files changed, 130 insertions, 32 deletions
diff --git a/cpp/src/Slice/CPlusPlusUtil.cpp b/cpp/src/Slice/CPlusPlusUtil.cpp index 1e3134c718a..2100cdedeb2 100644 --- a/cpp/src/Slice/CPlusPlusUtil.cpp +++ b/cpp/src/Slice/CPlusPlusUtil.cpp @@ -1398,63 +1398,160 @@ Slice::writeMarshalUnmarshalDataMemberInHolder(IceUtilInternal::Output& C, } void -Slice::writeStreamHelpers(Output& out, bool checkClassMetaData, const ContainedPtr& c, DataMemberList dataMembers, - DataMemberList optionalDataMembers) +Slice::writeMarshalUnmarshalAllInHolder(IceUtilInternal::Output& out, + const string& holder, + const DataMemberList& dataMembers, + bool optional, + bool marshal) { - if(!dataMembers.empty() || !optionalDataMembers.empty()) + if(dataMembers.empty()) { - string scoped = c->scoped(); - bool classMetaData = false; + return; + } - if(checkClassMetaData) - { - classMetaData = findMetaData(c->getMetaData(), false) == "%class"; - } + string stream = marshal ? "__os" : "__is"; + string streamOp = marshal ? "writeAll" : "readAll"; - string fullName = classMetaData ? fixKwd(scoped + "Ptr") : fixKwd(scoped); - string holder = classMetaData ? "v->" : "v."; + out << nl << stream << "->" << streamOp; + out << spar; - out << nl << "template<typename S>"; - out << nl << "struct StreamWriter< " << fullName << ", S>"; - out << sb; - out << nl << "static void write(S* __os, const " << fullName << "& v)"; - out << sb; + if(optional) + { + ostringstream os; + os << "{"; for(DataMemberList::const_iterator q = dataMembers.begin(); q != dataMembers.end(); ++q) { - if(!(*q)->optional()) + if(q != dataMembers.begin()) { - writeMarshalUnmarshalDataMemberInHolder(out, holder, *q, true); + os << ", "; } + os << (*q)->tag(); + } + os << "}"; + out << os.str(); + } + + for(DataMemberList::const_iterator q = dataMembers.begin(); q != dataMembers.end(); ++q) + { + out << holder + fixKwd((*q)->name()); + } + + out << epar << ";"; + +} + +void +Slice::writeStreamHelpers(Output& out, + bool checkClassMetaData, + bool cpp11, + const ContainedPtr& c, + DataMemberList dataMembers) +{ + if(dataMembers.empty()) + { + return; + } + + DataMemberList requiredMembers; + DataMemberList optionalMembers; + + for(DataMemberList::const_iterator q = dataMembers.begin(); q != dataMembers.end(); ++q) + { + if((*q)->optional()) + { + optionalMembers.push_back(*q); } - for(DataMemberList::const_iterator q = optionalDataMembers.begin(); q != optionalDataMembers.end(); ++q) + else { - writeMarshalUnmarshalDataMemberInHolder(out, holder, *q, true); + requiredMembers.push_back(*q); } - out << eb; - out << eb << ";" << nl; + } + + // Sort optional data members + class SortFn + { + public: + static bool compare(const DataMemberPtr& lhs, const DataMemberPtr& rhs) + { + return lhs->tag() < rhs->tag(); + } + }; + optionalMembers.sort(SortFn::compare); + + string scoped = c->scoped(); + bool classMetaData = checkClassMetaData ? (findMetaData(c->getMetaData(), false) == "%class") : false; + string fullName = classMetaData ? fixKwd(scoped + "Ptr") : fixKwd(scoped); + string holder = classMetaData ? "v->" : "v."; + // + // Generate StreamWriter + // + // Only generate StreamWriter specializations if we are generating for C++98 or + // we are generating for C++11 with optional data members + // + if(!cpp11 || !optionalMembers.empty()) + { out << nl << "template<typename S>"; - out << nl << "struct StreamReader< " << fullName << ", S>"; + out << nl << "struct StreamWriter" << (cpp11 ? "<" : "< ") << fullName << ", S>"; out << sb; - out << nl << "static void read(S* __is, " << fullName << "& v)"; + out << nl << "static void write(S* __os, const " << fullName << "& v)"; out << sb; - for(DataMemberList::const_iterator q = dataMembers.begin(); q != dataMembers.end(); ++q) + + if(cpp11) + { + writeMarshalUnmarshalTupleInHolder(out, holder, requiredMembers, false, true); + writeMarshalUnmarshalTupleInHolder(out, holder, optionalMembers, true, true); + } + else { - if(!(*q)->optional()) + for(DataMemberList::const_iterator q = requiredMembers.begin(); q != requiredMembers.end(); ++q) { - writeMarshalUnmarshalDataMemberInHolder(out, holder, *q, false); + writeMarshalUnmarshalDataMemberInHolder(out, holder, *q, true); + } + + for(DataMemberList::const_iterator q = optionalMembers.begin(); q != optionalMembers.end(); ++q) + { + writeMarshalUnmarshalDataMemberInHolder(out, holder, *q, true); } } - for(DataMemberList::const_iterator q = optionalDataMembers.begin(); q != optionalDataMembers.end(); ++q) + + out << eb; + out << eb << ";" << nl; + } + + // + // Generate StreamWriter + // + out << nl << "template<typename S>"; + out << nl << "struct StreamReader" << (cpp11 ? "<" : "< ") << fullName << ", S>"; + out << sb; + out << nl << "static void read(S* __is, " << fullName << "& v)"; + out << sb; + + if(cpp11) + { + writeMarshalUnmarshalTupleInHolder(out, holder, requiredMembers, false, false); + writeMarshalUnmarshalTupleInHolder(out, holder, optionalMembers, true, false); + } + else + { + for(DataMemberList::const_iterator q = requiredMembers.begin(); q != requiredMembers.end(); ++q) + { + writeMarshalUnmarshalDataMemberInHolder(out, holder, *q, false); + } + + for(DataMemberList::const_iterator q = optionalMembers.begin(); q != optionalMembers.end(); ++q) { writeMarshalUnmarshalDataMemberInHolder(out, holder, *q, false); } - out << eb; - out << eb << ";" << nl; } + + out << eb; + out << eb << ";" << nl; } + void -Slice::writeIceTuple(::IceUtilInternal::Output& out, DataMemberList dataMembers, int useWstring) +Slice::writeIceTuple(::IceUtilInternal::Output& out, DataMemberList dataMembers, int typeCtx) { out << sp << nl << "std::tuple<"; for(DataMemberList::const_iterator q = dataMembers.begin(); q != dataMembers.end(); ++q) @@ -1464,9 +1561,10 @@ Slice::writeIceTuple(::IceUtilInternal::Output& out, DataMemberList dataMembers, out << ", "; } out << "const "; - out << typeToString((*q)->type(), (*q)->optional(), (*q)->getMetaData(), useWstring | TypeContextCpp11) << "&"; + out << typeToString((*q)->type(), (*q)->optional(), (*q)->getMetaData(), typeCtx | TypeContextCpp11) << "&"; } out << "> ice_tuple() const"; + out << sb; out << nl << "return std::tie("; for(DataMemberList::const_iterator pi = dataMembers.begin(); pi != dataMembers.end(); ++pi) |