bool MpsAssign::Parallelize(const MpsTerm &receives, MpsTerm* &seqTerm, MpsTerm* &parTerm) const // {{{ { // Find used vars set<string> usedVars = myExp->FV(); usedVars.insert(myId); // Split receives using the used vars MpsTerm *pre; MpsTerm *post; receives.Split(usedVars,pre,post); bool opt1=dynamic_cast<const MpsEnd*>(post)==NULL; // Parallelize succ with post receives MpsTerm *seqSucc; MpsTerm *parSucc; bool opt2=mySucc->Parallelize(*post,seqSucc,parSucc); delete post; // Make parallelized term MpsTerm *parTmp = new MpsAssign(myId, *myExp, *myType, *parSucc); delete parSucc; parTerm = pre->Append(*parTmp); delete pre; delete parTmp; // Make sequential term seqTerm = new MpsAssign(myId, *myExp, *myType, *seqSucc); delete seqSucc; return opt1 || opt2; } // }}}
bool MpsGuiValue::Parallelize(const MpsTerm &receivers, MpsTerm* &seqTerm, MpsTerm* &parTerm) const // {{{ { // Find used vars set<string> usedVars = myValue->FV(); set<string> fv = myName->FV(); usedVars.insert(fv.begin(),fv.end()); usedVars.insert(mySession); // Split receives using the used vars MpsTerm *pre; MpsTerm *post; receivers.Split(usedVars,pre,post); bool opt1=dynamic_cast<const MpsEnd*>(post)==NULL; // Parallelize succ with post receives MpsTerm *seqSucc; MpsTerm *parSucc; bool opt2=mySucc->Parallelize(*post,seqSucc,parSucc); delete post; // Make parallelized term MpsTerm *parTmp = new MpsGuiValue(myMaxpid, mySession, myPid, *myName, *myValue, *parSucc); delete parSucc; parTerm = pre->Append(*parTmp); delete pre; delete parTmp; // Make sequential term seqTerm = new MpsGuiValue(myMaxpid, mySession, myPid, *myName, *myValue, *seqSucc); delete seqSucc; return opt1 || opt2; } // }}}