summaryrefslogtreecommitdiff
path: root/cpp/src/Slice/CPlusPlusUtil.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/Slice/CPlusPlusUtil.cpp')
-rw-r--r--cpp/src/Slice/CPlusPlusUtil.cpp105
1 files changed, 68 insertions, 37 deletions
diff --git a/cpp/src/Slice/CPlusPlusUtil.cpp b/cpp/src/Slice/CPlusPlusUtil.cpp
index 0ede4f80e7a..30d9f2883bc 100644
--- a/cpp/src/Slice/CPlusPlusUtil.cpp
+++ b/cpp/src/Slice/CPlusPlusUtil.cpp
@@ -120,7 +120,7 @@ Slice::printDllExportStuff(Output& out, const string& dllExport)
}
string
-Slice::typeToString(const TypePtr& type, const StringList& metaData, bool allowArray)
+Slice::typeToString(const TypePtr& type, const StringList& metaData, bool inParam)
{
static const char* builtinTable[] =
{
@@ -161,9 +161,9 @@ Slice::typeToString(const TypePtr& type, const StringList& metaData, bool allowA
string seqType = findMetaData(metaData);
if(!seqType.empty())
{
- if(seqType == "array")
+ if(seqType == "array" || seqType == "range:array")
{
- if(allowArray)
+ if(inParam)
{
TypePtr elemType = seq->type();
string s = typeToString(elemType);
@@ -174,6 +174,26 @@ Slice::typeToString(const TypePtr& type, const StringList& metaData, bool allowA
return fixKwd(seq->scoped());
}
}
+ else if(seqType.find("range") == 0)
+ {
+ if(inParam)
+ {
+ string s;
+ if(seqType.find("range:") == 0)
+ {
+ s = seqType.substr(strlen("range:"));
+ }
+ else
+ {
+ s = fixKwd(seq->scoped());
+ }
+ return "::std::pair<const " + s + "::const_iterator, " + s + "::const_iterator>";
+ }
+ else
+ {
+ return fixKwd(seq->scoped());
+ }
+ }
else
{
return seqType;
@@ -265,6 +285,19 @@ Slice::inputTypeToString(const TypePtr& type, const StringList& metaData)
string s = typeToString(elemType);
return "const ::std::pair<const " + s + "*, const " + s + "*>&";
}
+ else if(seqType.find("range") == 0)
+ {
+ string s;
+ if(seqType.find("range:") == 0)
+ {
+ s = seqType.substr(strlen("range:"));
+ }
+ else
+ {
+ s = fixKwd(seq->scoped());
+ }
+ return "const ::std::pair<const " + s + "::const_iterator, " + s + "::const_iterator>&";
+ }
else
{
return "const " + seqType + "&";
@@ -461,7 +494,7 @@ Slice::fixKwd(const string& name)
void
Slice::writeMarshalUnmarshalCode(Output& out, const TypePtr& type, const string& param, bool marshal,
- const string& str, bool pointer, const StringList& metaData, bool allowArray)
+ const string& str, bool pointer, const StringList& metaData, bool inParam)
{
string fixedParam = fixKwd(param);
@@ -537,12 +570,7 @@ Slice::writeMarshalUnmarshalCode(Output& out, const TypePtr& type, const string&
if(seq)
{
string seqType = findMetaData(metaData);
- if(seqType.empty() || !allowArray && seqType == "array")
- {
- StringList l = seq->getMetaData();
- seqType = findMetaData(l);
- }
- if(!allowArray && seqType == "array")
+ if(!inParam && seqType == "array")
{
seqType = "";
}
@@ -588,7 +616,15 @@ Slice::writeMarshalUnmarshalCode(Output& out, const TypePtr& type, const string&
}
else
{
- if(!builtin || builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindObjectProxy)
+ StringList l = seq->getMetaData();
+ seqType = findMetaData(l);
+ if(!seqType.empty() && seqType != "array")
+ {
+ 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 << "if(" << fixedParam << ".size() == 0)";
out << sb;
@@ -665,33 +701,23 @@ Slice::writeMarshalUnmarshalCode(Output& out, const TypePtr& type, const string&
}
if(!builtin || builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindObjectProxy)
{
- out << nl;
TypePtr elemType = seq->type();
- if(elemType->isVariableLength())
- {
- out << "::IceInternal::readVariableSequence";
- }
- else
- {
- out << "::IceInternal::readFixedSequence";
- }
- out << "<" << typeStr << ">(" << stream << ", " << fixedParam << ", "
- << elemType->minWireSize() << ");";
- }
- else if(builtin->kind() == Builtin::KindString)
- {
- out << nl << "::IceInternal::readStringSequence<" << typeStr << ">(" << stream << ", "
- << fixedParam << ");";
+ out << nl << "::IceInternal::readConstructedSequence<" << typeStr << ">(" << stream << ", "
+ << fixedParam << ", " << elemType->minWireSize() << ", "
+ << (elemType->isVariableLength() ? "true" : "false") << ");";
}
else
{
out << nl << "::IceInternal::readBuiltinSequence<" << typeStr << ">(" << stream << ", "
- << fixedParam << ");";
+ << fixedParam << ", " << (builtin->kind() == Builtin::KindString ? "true" : "false") << ");";
}
}
else
{
- if(!builtin || builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindObjectProxy)
+ StringList l = seq->getMetaData();
+ seqType = findMetaData(l);
+ if((!seqType.empty() && seqType != "array") || !builtin || builtin->kind() == Builtin::KindObject ||
+ builtin->kind() == Builtin::KindObjectProxy)
{
out << nl << scope << "__" << func << (pointer ? "" : "&") << stream << ", "
<< fixedParam << ", " << scope << "__U__" << fixKwd(seq->name()) << "());";
@@ -743,12 +769,12 @@ Slice::writeMarshalUnmarshalCode(Output& out, const TypePtr& type, const string&
void
Slice::writeMarshalCode(Output& out, const ParamDeclList& params, const TypePtr& ret, const StringList& metaData,
- bool allowArray)
+ bool inParam)
{
for(ParamDeclList::const_iterator p = params.begin(); p != params.end(); ++p)
{
writeMarshalUnmarshalCode(out, (*p)->type(), fixKwd((*p)->name()), true, "", true, (*p)->getMetaData(),
- allowArray);
+ inParam);
}
if(ret)
{
@@ -758,12 +784,12 @@ Slice::writeMarshalCode(Output& out, const ParamDeclList& params, const TypePtr&
void
Slice::writeUnmarshalCode(Output& out, const ParamDeclList& params, const TypePtr& ret, const StringList& metaData,
- bool allowArray)
+ bool inParam)
{
for(ParamDeclList::const_iterator p = params.begin(); p != params.end(); ++p)
{
writeMarshalUnmarshalCode(out, (*p)->type(), fixKwd((*p)->name()), false, "", true, (*p)->getMetaData(),
- allowArray);
+ inParam);
}
if(ret)
{
@@ -773,15 +799,15 @@ Slice::writeUnmarshalCode(Output& out, const ParamDeclList& params, const TypePt
void
Slice::writeAllocateCode(Output& out, const ParamDeclList& params, const TypePtr& ret, const StringList& metaData,
- bool allowArray)
+ bool inParam)
{
for(ParamDeclList::const_iterator p = params.begin(); p != params.end(); ++p)
{
- out << nl << typeToString((*p)->type(), (*p)->getMetaData(), allowArray) << ' ' << fixKwd((*p)->name()) << ';';
+ out << nl << typeToString((*p)->type(), (*p)->getMetaData(), inParam) << ' ' << fixKwd((*p)->name()) << ';';
}
if(ret)
{
- out << nl << typeToString(ret, metaData, allowArray) << " __ret;";
+ out << nl << typeToString(ret, metaData, inParam) << " __ret;";
}
}
@@ -1188,10 +1214,15 @@ Slice::findMetaData(const StringList& metaData)
string::size_type pos = str.find(':', prefix.size());
if(pos != string::npos)
{
- if(str.substr(prefix.size(), pos - prefix.size()) == "type")
+ string ss = str.substr(prefix.size(), pos - prefix.size());
+ if(ss == "type")
{
return str.substr(pos + 1);
}
+ else if(ss == "range")
+ {
+ return str.substr(prefix.size());
+ }
}
else
{