void Slice::writeEndCode(Output& out, const ParamDeclList& params, const OperationPtr& op, bool prepend) { string prefix = prepend ? paramPrefix : ""; for(ParamDeclList::const_iterator p = params.begin(); p != params.end(); ++p) { writeParamEndCode(out, (*p)->type(), (*p)->optional(), fixKwd(prefix + (*p)->name()), (*p)->getMetaData()); } if(op && op->returnType()) { writeParamEndCode(out, op->returnType(), op->returnIsOptional(), "__ret", op->getMetaData()); } }
void Slice::writeAllocateCode(Output& out, const ParamDeclList& params, const OperationPtr& op, bool prepend, int typeCtx, bool cpp11) { string prefix = prepend ? paramPrefix : ""; for(ParamDeclList::const_iterator p = params.begin(); p != params.end(); ++p) { writeParamAllocateCode(out, (*p)->type(), (*p)->optional(), fixKwd(prefix + (*p)->name()), (*p)->getMetaData(), typeCtx, cpp11, getEndArg((*p)->type(),(*p)->getMetaData(), (*p)->name()) != (*p)->name()); } if(op && op->returnType()) { writeParamAllocateCode(out, op->returnType(), op->returnIsOptional(), "__ret", op->getMetaData(), typeCtx, cpp11, getEndArg(op->returnType(), op->getMetaData(), "__ret") != "__ret"); } }
string Slice::classDefToDelegateString(const ClassDefPtr& cl, int typeCtx, bool cpp11) { assert(cl->isDelegate()); // A delegate only has one operation OperationPtr op = cl->allOperations().front(); TypePtr ret = op->returnType(); string retS = returnTypeToString(ret, op->returnIsOptional(), op->getMetaData(), typeCtx, cpp11); string t = "::std::function<" + retS + " ("; if(cpp11) { // inputTypeToString usually passes local operation values by // reference. This is not the desired behavior for delegates typeCtx &= ~TypeContextLocalOperation; typeCtx |= TypeContextDelegate; } ParamDeclList paramList = cl->allOperations().front()->parameters(); for(ParamDeclList::iterator q = paramList.begin(); q != paramList.end(); ++q) { if((*q)->isOutParam()) { t += outputTypeToString((*q)->type(), (*q)->optional(), (*q)->getMetaData(), typeCtx, cpp11); } else { t += inputTypeToString((*q)->type(), (*q)->optional(), (*q)->getMetaData(), typeCtx, cpp11); } t += distance(q, paramList.end()) == 1 ? "" : ", "; } t += ")>"; return t; }