summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDwayne Boone <dwayne@zeroc.com>2006-01-27 18:02:48 +0000
committerDwayne Boone <dwayne@zeroc.com>2006-01-27 18:02:48 +0000
commit2185e2445a2f3779bd5a59c103a10239bd64989b (patch)
treebfebd0bfe19709aea0554127d4d7dcccd86547b0
parentAdded debugging info (bug 394) (diff)
downloadice-2185e2445a2f3779bd5a59c103a10239bd64989b.tar.bz2
ice-2185e2445a2f3779bd5a59c103a10239bd64989b.tar.xz
ice-2185e2445a2f3779bd5a59c103a10239bd64989b.zip
More change for alternate C++ sequence mappings
-rw-r--r--cpp/include/Slice/CPlusPlusUtil.h16
-rw-r--r--cpp/src/Slice/CPlusPlusUtil.cpp291
-rw-r--r--cpp/src/slice2cpp/Gen.cpp86
-rw-r--r--cpp/src/slice2cppe/Gen.cpp214
-rw-r--r--cpp/src/slice2cppe/Gen.h4
5 files changed, 376 insertions, 235 deletions
diff --git a/cpp/include/Slice/CPlusPlusUtil.h b/cpp/include/Slice/CPlusPlusUtil.h
index e4f33fced2c..b2eda46edb6 100644
--- a/cpp/include/Slice/CPlusPlusUtil.h
+++ b/cpp/include/Slice/CPlusPlusUtil.h
@@ -28,21 +28,21 @@ SLICE_API void printVersionCheck(::IceUtil::Output&);
SLICE_API void printDllExportStuff(::IceUtil::Output&, const std::string&);
SLICE_API std::string typeToString(const TypePtr&, const StringList& = StringList());
-SLICE_API std::string returnTypeToString(const TypePtr&);
+SLICE_API std::string returnTypeToString(const TypePtr&, const StringList& = StringList());
SLICE_API std::string inputTypeToString(const TypePtr&, const StringList& = StringList());
-SLICE_API std::string outputTypeToString(const TypePtr&);
+SLICE_API std::string outputTypeToString(const TypePtr&, const StringList& = StringList());
SLICE_API std::string operationModeToString(Operation::Mode);
SLICE_API std::string fixKwd(const std::string&);
SLICE_API void writeMarshalUnmarshalCode(::IceUtil::Output&, const TypePtr&, const std::string&, bool,
const std::string& = "", bool = true, const StringList& = StringList());
-SLICE_API void writeMarshalCode(::IceUtil::Output&, const std::list<std::pair<TypePtr, std::string> >&,
- const TypePtr&);
-SLICE_API void writeUnmarshalCode(::IceUtil::Output&, const std::list<std::pair<TypePtr, std::string> >&,
- const TypePtr&);
-SLICE_API void writeAllocateCode(::IceUtil::Output&, const std::list<std::pair<TypePtr, std::string> >&,
- const TypePtr&);
+SLICE_API void writeMarshalCode(::IceUtil::Output&, const ParamDeclList&, const TypePtr&,
+ const StringList& = StringList());
+SLICE_API void writeUnmarshalCode(::IceUtil::Output&, const ParamDeclList&, const TypePtr&,
+ const StringList& = StringList());
+SLICE_API void writeAllocateCode(::IceUtil::Output&, const ParamDeclList&, const TypePtr&,
+ const StringList& = StringList());
SLICE_API void writeStreamMarshalUnmarshalCode(::IceUtil::Output&, const TypePtr&, const std::string&, bool,
const std::string& = "");
SLICE_API void writeStreamMarshalCode(::IceUtil::Output&, const std::list<std::pair<TypePtr, std::string> >&,
diff --git a/cpp/src/Slice/CPlusPlusUtil.cpp b/cpp/src/Slice/CPlusPlusUtil.cpp
index 0b437c0e5b1..044ede63821 100644
--- a/cpp/src/Slice/CPlusPlusUtil.cpp
+++ b/cpp/src/Slice/CPlusPlusUtil.cpp
@@ -159,11 +159,27 @@ Slice::typeToString(const TypePtr& type, const StringList& metaData)
if(seq)
{
string seqType = findMetaData(metaData);
- if(seqType == "array")
+ if(seqType.empty())
{
- TypePtr seqType = seq->type();
- string s = typeToString(seqType);
- return "::std::pair<const " + s + "*, const " + s + "*>";
+ StringList l = seq->getMetaData();
+ seqType = findMetaData(l);
+ }
+ if(!seqType.empty())
+ {
+ TypePtr elemType = seq->type();
+ string s = typeToString(elemType);
+ if(seqType == "array")
+ {
+ return "::std::pair<const " + s + "*, const " + s + "*>";
+ }
+ else
+ {
+ return seqType + "<" + (s[0] == ':' ? " " : "") + s + ">";
+ }
+ }
+ else
+ {
+ return fixKwd(seq->scoped());
}
}
@@ -183,14 +199,14 @@ Slice::typeToString(const TypePtr& type, const StringList& metaData)
}
string
-Slice::returnTypeToString(const TypePtr& type)
+Slice::returnTypeToString(const TypePtr& type, const StringList& metaData)
{
if(!type)
{
return "void";
}
- return typeToString(type);
+ return typeToString(type, metaData);
}
string
@@ -239,12 +255,28 @@ Slice::inputTypeToString(const TypePtr& type, const StringList& metaData)
if(seq)
{
string seqType = findMetaData(metaData);
- if(seqType == "array")
- {
- TypePtr seqType = seq->type();
- string s = typeToString(seqType);
- return "const ::std::pair<const " + s + "*, const " + s + "*>&";
- }
+ if(seqType.empty())
+ {
+ StringList l = seq->getMetaData();
+ seqType = findMetaData(l);
+ }
+ if(!seqType.empty())
+ {
+ TypePtr elemType = seq->type();
+ string s = typeToString(elemType);
+ if(seqType == "array")
+ {
+ return "const ::std::pair<const " + s + "*, const " + s + "*>&";
+ }
+ else
+ {
+ return "const " + seqType + "<" + (s[0] == ':' ? " " : "") + s + ">&";
+ }
+ }
+ else
+ {
+ return "const " + fixKwd(seq->scoped()) + "&";
+ }
}
ContainedPtr contained = ContainedPtr::dynamicCast(type);
@@ -257,7 +289,7 @@ Slice::inputTypeToString(const TypePtr& type, const StringList& metaData)
}
string
-Slice::outputTypeToString(const TypePtr& type)
+Slice::outputTypeToString(const TypePtr& type, const StringList& metaData)
{
static const char* outputBuiltinTable[] =
{
@@ -292,6 +324,26 @@ Slice::outputTypeToString(const TypePtr& type)
return fixKwd(proxy->_class()->scoped() + "Prx") + "&";
}
+ SequencePtr seq = SequencePtr::dynamicCast(type);
+ if(seq)
+ {
+ string seqType = findMetaData(metaData);
+ if(seqType.empty())
+ {
+ StringList l = seq->getMetaData();
+ seqType = findMetaData(l);
+ }
+ if(!seqType.empty() && seqType != "array")
+ {
+ TypePtr elemType = seq->type();
+ string s = typeToString(elemType);
+ return seqType + "<" + (s[0] == ':' ? " " : "") + s + ">&";
+ }
+ else
+ {
+ return fixKwd(seq->scoped()) + "&";
+ }
+ }
ContainedPtr contained = ContainedPtr::dynamicCast(type);
if(contained)
{
@@ -495,48 +547,69 @@ Slice::writeMarshalUnmarshalCode(Output& out, const TypePtr& type, const string&
if(seq)
{
string seqType = findMetaData(metaData);
+ if(seqType.empty())
+ {
+ StringList l = seq->getMetaData();
+ seqType = findMetaData(l);
+ }
builtin = BuiltinPtr::dynamicCast(seq->type());
if(marshal)
{
string scope = fixKwd(seq->scope());
- if(!builtin || builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindObjectProxy)
+ if(seqType == "array")
{
- if(seqType == "array")
+ if(!builtin || builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindObjectProxy)
{
- out << nl << scope << "__" << func << (pointer ? "" : "&") << stream << ", "
+ out << nl << scope << "__" << func << (pointer ? "" : "&") << stream << ", "
<< fixedParam << ".first, " << fixedParam << ".second, " << scope
- << "__U__" << fixKwd(seq->name()) << "());";
+ << "__U__" << fixKwd(seq->name()) << "());";
}
else
{
- out << nl << "if(" << fixedParam << ".size() == 0)";
- out << sb;
- out << nl << stream << deref << "writeSize(0);";
- out << eb;
- out << nl << "else";
- out << sb;
- out << nl << scope << "__" << func << (pointer ? "" : "&") << stream << ", &"
- << fixedParam << "[0], &" << fixedParam << "[0] + " << fixedParam << ".size(), " << scope
- << "__U__" << fixKwd(seq->name()) << "());";
- out << eb;
+ out << nl << stream << deref << func << fixedParam << ".first, " << fixedParam << ".second);";
}
+
}
- else if(builtin->kind() == Builtin::KindBool)
+ else if(!seqType.empty())
{
- if(seqType == "array")
+ string typeStr = typeToString(type, metaData);
+ if(typeStr[0] == ':')
+ {
+ typeStr = " " + typeStr;
+ }
+ if(typeStr[typeStr.size() - 1] == '>')
+ {
+ typeStr += " ";
+ }
+ if(!builtin || builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindObjectProxy)
{
- out << nl << stream << deref << func << fixedParam << ".first, " << fixedParam << ".second);";
+ out << nl << "::IceInternal::writeConstructedSequence<" << typeStr << ">(" << stream << ", "
+ << fixedParam << ");";
}
else
{
- out << nl << stream << deref << func << fixedParam << ");";
+ out << nl << "::IceInternal::writeBuiltinSequence<" << typeStr << ">(" << stream << ", "
+ << fixedParam << ");";
}
}
else
{
- if(seqType == "array")
+ if(!builtin || builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindObjectProxy)
{
- out << nl << stream << deref << func << fixedParam << ".first, " << fixedParam << ".second);";
+ out << nl << "if(" << fixedParam << ".size() == 0)";
+ out << sb;
+ out << nl << stream << deref << "writeSize(0);";
+ out << eb;
+ out << nl << "else";
+ out << sb;
+ out << nl << scope << "__" << func << (pointer ? "" : "&") << stream << ", &"
+ << fixedParam << "[0], &" << fixedParam << "[0] + " << fixedParam << ".size(), " << scope
+ << "__U__" << fixKwd(seq->name()) << "());";
+ out << eb;
+ }
+ else if(builtin->kind() == Builtin::KindBool)
+ {
+ out << nl << stream << deref << func << fixedParam << ");";
}
else
{
@@ -554,66 +627,100 @@ Slice::writeMarshalUnmarshalCode(Output& out, const TypePtr& type, const string&
}
else
{
- if(builtin && builtin->kind() != Builtin::KindObject && builtin->kind() != Builtin::KindObjectProxy)
+ string scope = fixKwd(seq->scope());
+ if(seqType == "array")
{
- if(seqType == "array")
+ if(!builtin || builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindObjectProxy)
{
- if(builtin->kind() == Builtin::KindByte)
- {
- out << nl << stream << deref << func << fixedParam << ");";
- }
- else if(builtin->kind() == Builtin::KindBool)
+ out << nl << typeToString(type) << " __" << fixedParam << ";";
+ out << nl << scope << "__" << func << (pointer ? "" : "&") << stream << ", __"
+ << fixedParam << ", " << scope << "__U__" << fixKwd(seq->name()) << "());";
+ }
+ else if(builtin->kind() == Builtin::KindByte)
+ {
+ out << nl << stream << deref << func << fixedParam << ");";
+ }
+ else if(builtin->kind() == Builtin::KindBool)
+ {
+ out << nl << "::IceUtil::auto_array<bool> __" << fixedParam << ";";
+ out << nl << stream << deref << func << fixedParam << ", __" << fixedParam << ");";
+ }
+ else
+ {
+ out << nl << typeToString(type) << " __" << fixedParam << ";";
+ out << nl << stream << deref << func << "__" << fixedParam << ");";
+ }
+
+ if(!builtin || (builtin->kind() != Builtin::KindByte && builtin->kind() != Builtin::KindBool))
+ {
+ out << nl << fixedParam << ".first" << " = &__" << fixedParam << "[0];";
+ out << nl << fixedParam << ".second" << " = " << fixedParam << ".first + " << "__"
+ << fixedParam << ".size();";
+ }
+ }
+ else if(!seqType.empty())
+ {
+ string typeStr = typeToString(type, metaData);
+ if(typeStr[0] == ':')
+ {
+ typeStr = " " + typeStr;
+ }
+ if(typeStr[typeStr.size() - 1] == '>')
+ {
+ typeStr += " ";
+ }
+ if(!builtin || builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindObjectProxy)
+ {
+ out << nl;
+ TypePtr elemType = seq->type();
+ if(elemType->isVariableLength())
{
- out << nl << "IceUtil::auto_array<bool> __" << fixedParam << ";";
- out << nl << stream << deref << func << fixedParam << ", __" << fixedParam << ");";
+ out << "::IceInternal::readVariableSequence";
}
else
{
- out << nl << typeToString(type) << " __" << fixedParam << ";";
- out << nl << stream << deref << func << "__" << fixedParam << ");";
+ out << "::IceInternal::readFixedSequence";
}
- }
- else if(builtin->kind() == Builtin::KindByte)
- {
- StringList md;
- md.push_back("cpp:array");
- string tmpParam = "__" + fixedParam;
- string::size_type pos = tmpParam.find("[i]");
- if(pos != string::npos)
- {
- tmpParam = tmpParam.substr(0, pos);
- }
- out << nl << typeToString(type, md) << " " << tmpParam << ";";
- out << nl << stream << deref << func << tmpParam << ");";
- out << nl << "::std::vector< ::Ice::Byte>(" << tmpParam << ".first, " << tmpParam
- << ".second).swap(" << fixedParam << ");";
+ out << "<" << typeStr << ">(" << stream << ", " << fixedParam << ", "
+ << elemType->minWireSize() << ");";
+ }
+ else if(builtin->kind() == Builtin::KindString)
+ {
+ out << nl << "::IceInternal::readStringSequence<" << typeStr << ">(" << stream << ", "
+ << fixedParam << ");";
}
else
{
- out << nl << stream << deref << func << fixedParam << ");";
- }
+ out << nl << "::IceInternal::readBuiltinSequence<" << typeStr << ">(" << stream << ", "
+ << fixedParam << ");";
+ }
}
else
{
- string scope = fixKwd(seq->scope());
- if(seqType == "array")
- {
- out << nl << typeToString(type) << " __" << fixedParam << ";";
- out << nl << scope << "__" << func << (pointer ? "" : "&") << stream << ", __"
- << fixedParam << ", " << scope << "__U__" << fixKwd(seq->name()) << "());";
- }
- else
- {
+ if(!builtin || builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindObjectProxy)
+ {
out << nl << scope << "__" << func << (pointer ? "" : "&") << stream << ", "
<< fixedParam << ", " << scope << "__U__" << fixKwd(seq->name()) << "());";
- }
- }
- if(seqType == "array" &&
- (!builtin || (builtin->kind() != Builtin::KindByte && builtin->kind() != Builtin::KindBool)))
- {
- out << nl << fixedParam << ".first" << " = &__" << fixedParam << "[0];";
- out << nl << fixedParam << ".second" << " = " << fixedParam << ".first + " << "__"
- << fixedParam << ".size();";
+ }
+ else if(builtin->kind() == Builtin::KindByte)
+ {
+ StringList md;
+ md.push_back("cpp:array");
+ string tmpParam = "__" + fixedParam;
+ string::size_type pos = tmpParam.find("[i]");
+ if(pos != string::npos)
+ {
+ tmpParam = tmpParam.substr(0, pos);
+ }
+ out << nl << typeToString(type, md) << " " << tmpParam << ";";
+ out << nl << stream << deref << func << tmpParam << ");";
+ out << nl << "::std::vector< ::Ice::Byte>(" << tmpParam << ".first, " << tmpParam
+ << ".second).swap(" << fixedParam << ");";
+ }
+ else
+ {
+ out << nl << stream << deref << func << fixedParam << ");";
+ }
}
}
return;
@@ -641,43 +748,41 @@ Slice::writeMarshalUnmarshalCode(Output& out, const TypePtr& type, const string&
}
void
-Slice::writeMarshalCode(Output& out, const list<pair<TypePtr, string> >& params, const TypePtr& ret)
+Slice::writeMarshalCode(Output& out, const ParamDeclList& params, const TypePtr& ret, const StringList& metaData)
{
- for(list<pair<TypePtr, string> >::const_iterator p = params.begin(); p != params.end(); ++p)
+ for(ParamDeclList::const_iterator p = params.begin(); p != params.end(); ++p)
{
- writeMarshalUnmarshalCode(out, p->first, p->second, true, "", true);
+ writeMarshalUnmarshalCode(out, (*p)->type(), fixKwd((*p)->name()), true, "", true, (*p)->getMetaData());
}
if(ret)
{
- writeMarshalUnmarshalCode(out, ret, "__ret", true, "", true);
+ writeMarshalUnmarshalCode(out, ret, "__ret", true, "", true, metaData);
}
}
void
-Slice::writeUnmarshalCode(Output& out, const list<pair<TypePtr, string> >& params, const TypePtr& ret)
+Slice::writeUnmarshalCode(Output& out, const ParamDeclList& params, const TypePtr& ret, const StringList& metaData)
{
- for(list<pair<TypePtr, string> >::const_iterator p = params.begin(); p != params.end(); ++p)
+ for(ParamDeclList::const_iterator p = params.begin(); p != params.end(); ++p)
{
- writeMarshalUnmarshalCode(out, p->first, p->second, false, "", true);
+ writeMarshalUnmarshalCode(out, (*p)->type(), fixKwd((*p)->name()), false, "", true, (*p)->getMetaData());
}
if(ret)
{
- writeMarshalUnmarshalCode(out, ret, "__ret", false, "", true);
+ writeMarshalUnmarshalCode(out, ret, "__ret", false, "", true, metaData);
}
}
void
-Slice::writeAllocateCode(Output& out, const list<pair<TypePtr, string> >& params, const TypePtr& ret)
+Slice::writeAllocateCode(Output& out, const ParamDeclList& params, const TypePtr& ret, const StringList& metaData)
{
- list<pair<TypePtr, string> > ps = params;
- if(ret)
+ for(ParamDeclList::const_iterator p = params.begin(); p != params.end(); ++p)
{
- ps.push_back(make_pair(ret, string("__ret")));
+ out << nl << typeToString((*p)->type(), (*p)->getMetaData()) << ' ' << fixKwd((*p)->name()) << ';';
}
-
- for(list<pair<TypePtr, string> >::const_iterator p = ps.begin(); p != ps.end(); ++p)
+ if(ret)
{
- out << nl << typeToString(p->first) << ' ' << fixKwd(p->second) << ';';
+ out << nl << typeToString(ret, metaData) << " __ret;";
}
}
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp
index f8fa60402ed..486c2ae42dd 100644
--- a/cpp/src/slice2cpp/Gen.cpp
+++ b/cpp/src/slice2cpp/Gen.cpp
@@ -609,16 +609,19 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p)
H << sp << nl << "virtual void __write(const ::Ice::OutputStreamPtr&) const;";
H << nl << "virtual void __read(const ::Ice::InputStreamPtr&, bool);";
- TypeStringList memberList;
- for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
- {
- memberList.push_back(make_pair((*q)->type(), (*q)->name()));
- }
+ TypeStringList memberList;
+ for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
+ {
+ memberList.push_back(make_pair((*q)->type(), (*q)->name()));
+ }
C << sp << nl << "void" << nl << scoped.substr(2) << "::__write(::IceInternal::BasicStream* __os) const";
C << sb;
C << nl << "__os->write(::std::string(\"" << p->scoped() << "\"));";
C << nl << "__os->startWriteSlice();";
- writeMarshalCode(C, memberList, 0);
+ for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
+ {
+ writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), true, "", true);
+ }
C << nl << "__os->endWriteSlice();";
if(base)
{
@@ -634,7 +637,10 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p)
C << nl << "__is->read(myId);";
C << eb;
C << nl << "__is->startReadSlice();";
- writeUnmarshalCode(C, memberList, 0);
+ for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
+ {
+ writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), false, "", true);
+ }
C << nl << "__is->endReadSlice();";
if(base)
{
@@ -852,24 +858,31 @@ Slice::Gen::TypesVisitor::visitStructEnd(const StructPtr& p)
H << nl << _dllExport << "void __read(const ::Ice::InputStreamPtr&);";
}
- TypeStringList memberList;
- for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
- {
- memberList.push_back(make_pair((*q)->type(), (*q)->name()));
- }
+ TypeStringList memberList;
+ for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
+ {
+ memberList.push_back(make_pair((*q)->type(), (*q)->name()));
+ }
C << sp << nl << "void" << nl << scoped.substr(2) << "::__write(::IceInternal::BasicStream* __os) const";
C << sb;
- writeMarshalCode(C, memberList, 0);
+ for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
+ {
+ writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), true, "", true);
+ }
C << eb;
C << sp << nl << "void" << nl << scoped.substr(2) << "::__read(::IceInternal::BasicStream* __is)";
C << sb;
- writeUnmarshalCode(C, memberList, 0);
+ for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
+ {
+ writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), false, "", true);
+ }
C << eb;
if(_stream)
{
- C << sp << nl << "void" << nl << scoped.substr(2) << "::__write(const ::Ice::OutputStreamPtr& __outS) const";
+ C << sp << nl << "void" << nl << scoped.substr(2)
+ << "::__write(const ::Ice::OutputStreamPtr& __outS) const";
C << sb;
writeStreamMarshalCode(C, memberList, 0);
C << eb;
@@ -1880,8 +1893,8 @@ Slice::Gen::DelegateMVisitor::visitOperation(const OperationPtr& p)
vector<string> params;
vector<string> paramsDecl;
- TypeStringList inParams;
- TypeStringList outParams;
+ ParamDeclList inParams;
+ ParamDeclList outParams;
ParamDeclList paramList = p->parameters();
for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q)
{
@@ -1891,12 +1904,12 @@ Slice::Gen::DelegateMVisitor::visitOperation(const OperationPtr& p)
string typeString;
if(isOutParam)
{
- outParams.push_back(make_pair(type, paramName));
+ outParams.push_back(*q);
typeString = outputTypeToString(type);
}
else
{
- inParams.push_back(make_pair(type, paramName));
+ inParams.push_back(*q);
typeString = inputTypeToString(type);
}
@@ -1986,7 +1999,7 @@ Slice::Gen::DelegateMVisitor::visitOperation(const OperationPtr& p)
C << eb;
C << eb;
- writeAllocateCode(C, TypeStringList(), ret);
+ writeAllocateCode(C, ParamDeclList(), ret);
writeUnmarshalCode(C, outParams, ret);
if(p->returnsClasses())
{
@@ -2698,7 +2711,8 @@ Slice::Gen::ObjectVisitor::visitClassDefEnd(const ClassDefPtr& p)
TypeStringList memberList;
DataMemberList dataMembers = p->dataMembers();
- for(DataMemberList::const_iterator q = dataMembers.begin(); q != dataMembers.end(); ++q)
+ DataMemberList::const_iterator q;
+ for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
{
memberList.push_back(make_pair((*q)->type(), (*q)->name()));
}
@@ -2708,7 +2722,10 @@ Slice::Gen::ObjectVisitor::visitClassDefEnd(const ClassDefPtr& p)
C << sb;
C << nl << "__os->writeTypeId(ice_staticId());";
C << nl << "__os->startWriteSlice();";
- writeMarshalCode(C, memberList, 0);
+ for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
+ {
+ writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), true, "", true);
+ }
C << nl << "__os->endWriteSlice();";
emitUpcall(base, "::__write(__os);");
C << eb;
@@ -2721,7 +2738,10 @@ Slice::Gen::ObjectVisitor::visitClassDefEnd(const ClassDefPtr& p)
C << nl << "__is->readTypeId(myId);";
C << eb;
C << nl << "__is->startReadSlice();";
- writeUnmarshalCode(C, memberList, 0);
+ for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
+ {
+ writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), false, "", true);
+ }
C << nl << "__is->endReadSlice();";
emitUpcall(base, "::__read(__is, true);");
C << eb;
@@ -2941,8 +2961,8 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
string paramsDeclAMD = "(const " + classScopedAMD + '_' + name + "Ptr& __cb, ";
string argsAMD = "(__cb, ";
- TypeStringList inParams;
- TypeStringList outParams;
+ ParamDeclList inParams;
+ ParamDeclList outParams;
ParamDeclList paramList = p->parameters();
for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q)
{
@@ -2952,12 +2972,12 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
string typeString;
if(isOutParam)
{
- outParams.push_back(make_pair(type, paramName));
+ outParams.push_back(*q);
typeString = outputTypeToString(type);
}
else
{
- inParams.push_back(make_pair(type, paramName));
+ inParams.push_back(*q);
typeString = inputTypeToString((*q)->type());
}
@@ -4116,8 +4136,8 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
args.push_back("__ret");
}
- TypeStringList inParams;
- TypeStringList outParams;
+ ParamDeclList inParams;
+ ParamDeclList outParams;
ParamDeclList paramList = p->parameters();
for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q)
{
@@ -4131,14 +4151,14 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
paramsDecl.push_back(typeString + ' ' + paramName);
args.push_back(paramName);
- outParams.push_back(make_pair(type, paramName));
+ outParams.push_back(*q);
}
else
{
paramsInvoke.push_back(typeString);
paramsDeclInvoke.push_back(typeString + ' ' + paramName);
- inParams.push_back(make_pair(type, paramName));
+ inParams.push_back(*q);
}
}
@@ -4359,7 +4379,7 @@ Slice::Gen::AsyncImplVisitor::visitOperation(const OperationPtr& p)
args += "__ret";
}
- TypeStringList outParams;
+ ParamDeclList outParams;
ParamDeclList paramList = p->parameters();
for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q)
{
@@ -4382,7 +4402,7 @@ Slice::Gen::AsyncImplVisitor::visitOperation(const OperationPtr& p)
paramsDecl += paramName;
args += paramName;
- outParams.push_back(make_pair(type, paramName));
+ outParams.push_back(*q);
}
}
diff --git a/cpp/src/slice2cppe/Gen.cpp b/cpp/src/slice2cppe/Gen.cpp
index ddc010cd38c..69a8279a9fe 100644
--- a/cpp/src/slice2cppe/Gen.cpp
+++ b/cpp/src/slice2cppe/Gen.cpp
@@ -389,7 +389,7 @@ Slice::Gen::TypesVisitor::visitExceptionStart(const ExceptionPtr& p)
for(q = allDataMembers.begin(); q != allDataMembers.end(); ++q)
{
string paramName = fixKwd((*q)->name());
- string typeName = inputTypeToString((*q)->type());
+ string typeName = inputTypeToString((*q)->type(), (*q)->getMetaData());
allTypes.push_back(typeName);
allParamDecls.push_back(typeName + " __ice_" + paramName);
}
@@ -567,17 +567,14 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p)
H << sp << nl << "virtual void __write(::IceInternal::BasicStream*) const;";
H << nl << "virtual void __read(::IceInternal::BasicStream*, bool);";
-
- TypeStringList memberList;
- for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
- {
- memberList.push_back(make_pair((*q)->type(), (*q)->name()));
- }
C << sp << nl << "void" << nl << scoped.substr(2) << "::__write(::IceInternal::BasicStream* __os) const";
C << sb;
C << nl << "__os->write(::std::string(\"" << p->scoped() << "\"));";
C << nl << "__os->startWriteSlice();";
- writeMarshalCode(C, memberList, 0);
+ for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
+ {
+ writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), true, "", true, (*q)->getMetaData());
+ }
C << nl << "__os->endWriteSlice();";
if(base)
{
@@ -593,7 +590,10 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p)
C << nl << "__is->read(myId);";
C << eb;
C << nl << "__is->startReadSlice();";
- writeUnmarshalCode(C, memberList, 0);
+ for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
+ {
+ writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), false, "", true, (*q)->getMetaData());
+ }
C << nl << "__is->endReadSlice();";
if(base)
{
@@ -741,19 +741,20 @@ Slice::Gen::TypesVisitor::visitStructEnd(const StructPtr& p)
H << sp << nl << _dllExport << "void __write(::IceInternal::BasicStream*) const;";
H << nl << _dllExport << "void __read(::IceInternal::BasicStream*);";
- TypeStringList memberList;
+ C << sp << nl << "void" << nl << scoped.substr(2) << "::__write(::IceInternal::BasicStream* __os) const";
+ C << sb;
for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
{
- memberList.push_back(make_pair((*q)->type(), (*q)->name()));
+ writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), true, "", true, (*q)->getMetaData());
}
- C << sp << nl << "void" << nl << scoped.substr(2) << "::__write(::IceInternal::BasicStream* __os) const";
- C << sb;
- writeMarshalCode(C, memberList, 0);
C << eb;
C << sp << nl << "void" << nl << scoped.substr(2) << "::__read(::IceInternal::BasicStream* __is)";
C << sb;
- writeUnmarshalCode(C, memberList, 0);
+ for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
+ {
+ writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), false, "", true, (*q)->getMetaData());
+ }
C << eb;
}
@@ -764,7 +765,7 @@ void
Slice::Gen::TypesVisitor::visitDataMember(const DataMemberPtr& p)
{
string name = fixKwd(p->name());
- string s = typeToString(p->type());
+ string s = typeToString(p->type(), p->getMetaData());
H << nl << s << ' ' << name << ';';
}
@@ -774,6 +775,13 @@ Slice::Gen::TypesVisitor::visitSequence(const SequencePtr& p)
string name = fixKwd(p->name());
TypePtr type = p->type();
string s = typeToString(type);
+ StringList metaData = p->getMetaData();
+ string seqType = findMetaData(metaData);
+ if(!seqType.empty())
+ {
+ return;
+ }
+
H << sp << nl << "typedef ::std::vector<" << (s[0] == ':' ? " " : "") << s << "> " << name << ';';
BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
@@ -1264,7 +1272,7 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p)
string scope = fixKwd(p->scope());
TypePtr ret = p->returnType();
- string retS = returnTypeToString(ret);
+ string retS = returnTypeToString(ret, p->getMetaData());
vector<string> params;
vector<string> paramsDecl;
@@ -1283,7 +1291,7 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p)
string typeString;
if((*q)->isOutParam())
{
- typeString = outputTypeToString((*q)->type());
+ typeString = outputTypeToString((*q)->type(), metaData);
}
else
{
@@ -1291,7 +1299,7 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p)
}
#else
string typeString = (*q)->isOutParam() ?
- outputTypeToString((*q)->type()) : inputTypeToString((*q)->type(), metaData);
+ outputTypeToString((*q)->type(), metaData) : inputTypeToString((*q)->type(), metaData);
#endif
params.push_back(typeString);
@@ -1467,13 +1475,13 @@ Slice::Gen::DelegateVisitor::visitOperation(const OperationPtr& p)
string scoped = fixKwd(p->scoped());
TypePtr ret = p->returnType();
- string retS = returnTypeToString(ret);
+ string retS = returnTypeToString(ret, p->getMetaData());
vector<string> params;
vector<string> paramsDecl;
ParamDeclList inParams;
- TypeStringList outParams;
+ ParamDeclList outParams;
ParamDeclList paramList = p->parameters();
for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q)
{
@@ -1485,8 +1493,8 @@ Slice::Gen::DelegateVisitor::visitOperation(const OperationPtr& p)
string typeString;
if(isOutParam)
{
- outParams.push_back(make_pair(type, paramName));
- typeString = outputTypeToString(type);
+ outParams.push_back(*q);
+ typeString = outputTypeToString(type, metaData);
}
else
{
@@ -1512,12 +1520,7 @@ Slice::Gen::DelegateVisitor::visitOperation(const OperationPtr& p)
C << nl << "try";
C << sb;
C << nl << "::IceInternal::BasicStream* __os = __out.os();";
- ParamDeclList::const_iterator pli;
- for(pli = inParams.begin(); pli != inParams.end(); ++pli)
- {
- writeMarshalUnmarshalCode(C, (*pli)->type(), fixKwd((*pli)->name()), true, "", true,
- (*pli)->getMetaData());
- }
+ writeMarshalCode(C, inParams, 0);
C << eb;
C << nl << "catch(const ::Ice::LocalException& __ex)";
C << sb;
@@ -1581,8 +1584,8 @@ Slice::Gen::DelegateVisitor::visitOperation(const OperationPtr& p)
C << eb;
C << eb;
- writeAllocateCode(C, TypeStringList(), ret);
- writeUnmarshalCode(C, outParams, ret);
+ writeAllocateCode(C, ParamDeclList(), ret, p->getMetaData());
+ writeUnmarshalCode(C, outParams, ret, p->getMetaData());
if(ret)
{
C << nl << "return __ret;";
@@ -2159,7 +2162,7 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
string scope = fixKwd(p->scope());
TypePtr ret = p->returnType();
- string retS = returnTypeToString(ret);
+ string retS = returnTypeToString(ret, p->getMetaData());
string params = "(";
string paramsDecl = "(";
@@ -2170,7 +2173,7 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
ParamDeclList inParams;
- TypeStringList outParams;
+ ParamDeclList outParams;
ParamDeclList paramList = p->parameters();
for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q)
{
@@ -2182,8 +2185,8 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
string typeString;
if(isOutParam)
{
- outParams.push_back(make_pair(type, paramName));
- typeString = outputTypeToString(type);
+ outParams.push_back(*q);
+ typeString = outputTypeToString(type, metaData);
}
else
{
@@ -2268,16 +2271,8 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
C << nl << "::IceInternal::BasicStream* __os = __in.os();";
}
- ParamDeclList::const_iterator pli;
- for(pli = inParams.begin(); pli != inParams.end(); ++pli)
- {
- C << nl << typeToString((*pli)->type(), (*pli)->getMetaData()) << ' ' << fixKwd((*pli)->name()) << ';';
- }
- for(pli = inParams.begin(); pli != inParams.end(); ++pli)
- {
- writeMarshalUnmarshalCode(C, (*pli)->type(), fixKwd((*pli)->name()), false, "", true,
- (*pli)->getMetaData());
- }
+ writeAllocateCode(C, inParams, 0);
+ writeUnmarshalCode(C, inParams, 0);
writeAllocateCode(C, outParams, 0);
if(!throws.empty())
{
@@ -2290,7 +2285,7 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
C << retS << " __ret = ";
}
C << fixKwd(name) << args << ';';
- writeMarshalCode(C, outParams, ret);
+ writeMarshalCode(C, outParams, ret, p->getMetaData());
if(!throws.empty())
{
C << eb;
@@ -2313,7 +2308,7 @@ void
Slice::Gen::ObjectVisitor::visitDataMember(const DataMemberPtr& p)
{
string name = fixKwd(p->name());
- string s = typeToString(p->type());
+ string s = typeToString(p->type(), p->getMetaData());
H << nl << s << ' ' << name << ';';
}
@@ -2586,7 +2581,7 @@ Slice::Gen::ImplVisitor::writeDecl(Output& out, const string& name, const TypePt
}
void
-Slice::Gen::ImplVisitor::writeReturn(Output& out, const TypePtr& type)
+Slice::Gen::ImplVisitor::writeReturn(Output& out, const TypePtr& type, const StringList& metaData)
{
BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
if(builtin)
@@ -2660,7 +2655,7 @@ Slice::Gen::ImplVisitor::writeReturn(Output& out, const TypePtr& type)
SequencePtr seq = SequencePtr::dynamicCast(type);
if(seq)
{
- out << nl << "return " << fixKwd(seq->scoped()) << "();";
+ out << nl << "return " << typeToString(seq, metaData) << "();";
}
else
{
@@ -2748,7 +2743,7 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p)
string opName = op->name();
TypePtr ret = op->returnType();
- string retS = returnTypeToString(ret);
+ string retS = returnTypeToString(ret, op->getMetaData());
H << sp << nl << "virtual " << retS << ' ' << fixKwd(opName) << '(';
H.useCurrentPosAsIndent();
@@ -2769,7 +2764,7 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p)
string typeString;
if((*q)->isOutParam())
{
- typeString = outputTypeToString((*q)->type());
+ typeString = outputTypeToString((*q)->type(), metaData);
}
else
{
@@ -2777,7 +2772,7 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p)
}
#else
string typeString = (*q)->isOutParam() ?
- outputTypeToString((*q)->type()) : inputTypeToString((*q)->type(), metaData);
+ outputTypeToString((*q)->type(), metaData) : inputTypeToString((*q)->type(), metaData);
#endif
H << typeString;
}
@@ -2813,7 +2808,7 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p)
string typeString;
if((*q)->isOutParam())
{
- typeString = outputTypeToString((*q)->type());
+ typeString = outputTypeToString((*q)->type(), metaData);
}
else
{
@@ -2821,7 +2816,7 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p)
}
#else
string typeString = (*q)->isOutParam() ?
- outputTypeToString((*q)->type()) : inputTypeToString((*q)->type(), metaData);
+ outputTypeToString((*q)->type(), metaData) : inputTypeToString((*q)->type(), metaData);
#endif
C << typeString << ' ' << fixKwd((*q)->name());
}
@@ -2840,7 +2835,7 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p)
if(ret)
{
- writeReturn(C, ret);
+ writeReturn(C, ret, op->getMetaData());
}
C << eb;
@@ -2854,7 +2849,28 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p)
bool
Slice::Gen::MetaDataVisitor::visitModuleStart(const ModulePtr& p)
{
- validate(p);
+ //
+ // Validate global metadata.
+ //
+ DefinitionContextPtr dc = p->definitionContext();
+ assert(dc);
+ StringList globalMetaData = dc->getMetaData();
+ string file = dc->filename();
+ static const string prefix = "cpp:";
+ for(StringList::const_iterator q = globalMetaData.begin(); q != globalMetaData.end(); ++q)
+ {
+ string s = *q;
+ if(_history.count(s) == 0)
+ {
+ if(s.find(prefix) == 0)
+ {
+ cout << file << ": warning: ignoring invalid global metadata `" << s << "'" << endl;
+ }
+ _history.insert(s);
+ }
+ }
+
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
return true;
}
@@ -2866,13 +2882,13 @@ Slice::Gen::MetaDataVisitor::visitModuleEnd(const ModulePtr&)
void
Slice::Gen::MetaDataVisitor::visitClassDecl(const ClassDeclPtr& p)
{
- validate(p);
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
}
bool
Slice::Gen::MetaDataVisitor::visitClassDefStart(const ClassDefPtr& p)
{
- validate(p);
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
return true;
}
@@ -2884,7 +2900,7 @@ Slice::Gen::MetaDataVisitor::visitClassDefEnd(const ClassDefPtr&)
bool
Slice::Gen::MetaDataVisitor::visitExceptionStart(const ExceptionPtr& p)
{
- validate(p);
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
return true;
}
@@ -2896,7 +2912,7 @@ Slice::Gen::MetaDataVisitor::visitExceptionEnd(const ExceptionPtr&)
bool
Slice::Gen::MetaDataVisitor::visitStructStart(const StructPtr& p)
{
- validate(p);
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
return true;
}
@@ -2908,72 +2924,78 @@ Slice::Gen::MetaDataVisitor::visitStructEnd(const StructPtr&)
void
Slice::Gen::MetaDataVisitor::visitOperation(const OperationPtr& p)
{
- validate(p);
+ StringList metaData = p->getMetaData();
+ TypePtr returnType = p->returnType();
+ if(!metaData.empty())
+ {
+ if(!returnType)
+ {
+ for(StringList::const_iterator q = metaData.begin(); q != metaData.end(); ++q)
+ {
+ if(q->find("cpp:type:", 0) == 0)
+ {
+ cout << p->definitionContext()->filename() << ":" << p->line()
+ << ": warning: invalid metadata for operation" << endl;
+ break;
+ }
+ }
+ }
+ else
+ {
+ validate(returnType, metaData, p->definitionContext()->filename(), p->line());
+ }
+ }
+
+ ParamDeclList params = p->parameters();
+ for(ParamDeclList::iterator q = params.begin(); q != params.end(); ++q)
+ {
+ validate((*q)->type(), (*q)->getMetaData(), p->definitionContext()->filename(), (*q)->line());
+ }
}
void
Slice::Gen::MetaDataVisitor::visitParamDecl(const ParamDeclPtr& p)
{
- validate(p);
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
}
void
Slice::Gen::MetaDataVisitor::visitDataMember(const DataMemberPtr& p)
{
- validate(p);
+ validate(p->type(), p->getMetaData(), p->definitionContext()->filename(), p->line());
}
void
Slice::Gen::MetaDataVisitor::visitSequence(const SequencePtr& p)
{
- validate(p);
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
}
void
Slice::Gen::MetaDataVisitor::visitDictionary(const DictionaryPtr& p)
{
- validate(p);
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
}
void
Slice::Gen::MetaDataVisitor::visitEnum(const EnumPtr& p)
{
- validate(p);
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
}
void
Slice::Gen::MetaDataVisitor::visitConst(const ConstPtr& p)
{
- validate(p);
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
}
void
-Slice::Gen::MetaDataVisitor::validate(const ContainedPtr& cont)
+Slice::Gen::MetaDataVisitor::validate(const SyntaxTreeBasePtr& cont, const StringList& metaData,
+ const string& file, const string& line)
{
- DefinitionContextPtr dc = cont->definitionContext();
- assert(dc);
- StringList globalMetaData = dc->getMetaData();
- string file = dc->filename();
-
- StringList localMetaData = cont->getMetaData();
- StringList::const_iterator p;
static const string prefix = "cpp:";
-
- for(p = globalMetaData.begin(); p != globalMetaData.end(); ++p)
- {
- string s = *p;
- if(_history.count(s) == 0)
- {
- if(s.find(prefix) == 0)
- {
- cout << file << ": warning: ignoring invalid global metadata `" << s << "'" << endl;
- }
- _history.insert(s);
- }
- }
-
- for(p = localMetaData.begin(); p != localMetaData.end(); ++p)
+ for(StringList::const_iterator p = metaData.begin(); p != metaData.end(); ++p)
{
string s = *p;
if(_history.count(s) == 0)
@@ -2982,19 +3004,13 @@ Slice::Gen::MetaDataVisitor::validate(const ContainedPtr& cont)
{
if(SequencePtr::dynamicCast(cont))
{
- if(s.substr(prefix.size()) == "collection")
- {
- continue;
- }
- }
- if(StructPtr::dynamicCast(cont))
- {
- if(s.substr(prefix.size()) == "class")
+ string ss = s.substr(prefix.size());
+ if(ss.find("type:") == 0)
{
continue;
}
}
- cout << file << ": warning: ignoring invalid metadata `" << s << "'" << endl;
+ cout << file << ":" << line << ": warning: ignoring invalid metadata `" << s << "'" << endl;
}
_history.insert(s);
}
diff --git a/cpp/src/slice2cppe/Gen.h b/cpp/src/slice2cppe/Gen.h
index f1fe0778070..0fb3c5b1d94 100644
--- a/cpp/src/slice2cppe/Gen.h
+++ b/cpp/src/slice2cppe/Gen.h
@@ -262,7 +262,7 @@ private:
//
// Generate code to return a dummy value
//
- void writeReturn(::IceUtil::Output&, const TypePtr&);
+ void writeReturn(::IceUtil::Output&, const TypePtr&, const StringList&);
};
class MetaDataVisitor : public ParserVisitor
@@ -288,7 +288,7 @@ private:
private:
- void validate(const ContainedPtr&);
+ void validate(const SyntaxTreeBasePtr&, const StringList&, const std::string&, const std::string&);
StringSet _history;
};