void ConBranchRule::extract(LpSub *lp) { ArrayBuffer<Constraint*> newCon(1,false); newCon.push(poolSlotRef_.conVar()); lp->addCons(newCon); }
status_t MSNConnection::HandleXFR( Command * command ) { LOG(kProtocolName, liDebug, "C %lX: Processing XFR", this); command->Debug(); ServerAddress sa = ExtractServerDetails((char *)command->Param(1)); BMessage newCon(msnmsgNewConnection); newCon.AddString("host", sa.first); newCon.AddInt16("port", sa.second); newCon.AddString("type", command->Param(0)); newCon.AddInt32("trid", command->TransactionID()); if (strcmp(command->Param(0), "NS") == 0) { StopReceiver(); ClearQueues(); BMessage closeCon(msnmsgCloseConnection); closeCon.AddPointer("connection", this); fManMsgr.SendMessage(&closeCon); }; if (strcmp(command->Param(0), "SB") == 0) { newCon.AddString("authType", command->Param(2)); newCon.AddString("authString", command->Param(3)); }; fManMsgr.SendMessage(&newCon); return B_OK; }
status_t MSNConnection::HandleRNG( Command * command ) { LOG(kProtocolName, liDebug, "C %lX: Processing RNG", this); // The details are actually param 1, but param 0 will be interpretted as the // TrID LOG(kProtocolName, liDebug, "C %lX: got a chat invite from %s (%s)", this, command->Param(4), command->Param(3)); ServerAddress sa = ExtractServerDetails((char *)command->Param(0)); BMessage newCon(msnmsgNewConnection); newCon.AddString("host", sa.first); newCon.AddInt16("port", sa.second); newCon.AddString("type", "RNG"); newCon.AddString("authType", command->Param(1)); newCon.AddString("authString", command->Param(2)); newCon.AddString("inviterPassport", command->Param(3)); newCon.AddString("inviterDisplayName", command->Param(4)); BString temp; temp << command->TransactionID(); newCon.AddString("sessionID", temp.String() ); fManMsgr.SendMessage(&newCon); return B_OK; }
/* * Helper functions for parseArgs(). */ static Exp *parseStr(char *cPtr) { if(*cPtr == '\0') { return newOpn(O_Empty); } else { return newApp(newApp(newOpn(O_Cons), newCon(C_Char, *cPtr)), parseStr(cPtr + 1)); } }
void GNEDetectorE2::fixAdditionalProblem() { if (getLaneParents().size() == 1) { // obtain position and lenght double newPositionOverLane = myPositionOverLane; double newLength = myLength; // fix pos and lenght using fixE2DetectorPosition GNEAdditionalHandler::fixE2DetectorPosition(newPositionOverLane, newLength, getLaneParents().at(0)->getParentEdge().getNBEdge()->getFinalLength(), true); // set new position and length setAttribute(SUMO_ATTR_POSITION, toString(newPositionOverLane), myViewNet->getUndoList()); setAttribute(SUMO_ATTR_LENGTH, toString(myLength), myViewNet->getUndoList()); } else { if (!myE2valid) { // build connections between all consecutive lanes bool foundConnection = true; int i = 0; // iterate over all lanes, and stop if myE2valid is false while (i < ((int)getLaneParents().size() - 1)) { // change foundConnection to false foundConnection = false; // if a connection betwen "from" lane and "to" lane of connection is found, change myE2valid to true again for (auto j : getLaneParents().at(i)->getParentEdge().getGNEConnections()) { if (j->getLaneFrom() == getLaneParents().at(i) && j->getLaneTo() == getLaneParents().at(i + 1)) { foundConnection = true; } } // if connection wasn't found if (!foundConnection) { // create new connection manually NBEdge::Connection newCon(getLaneParents().at(i)->getIndex(), getLaneParents().at(i + 1)->getParentEdge().getNBEdge(), getLaneParents().at(i + 1)->getIndex()); // allow to undo creation of new lane myViewNet->getUndoList()->add(new GNEChange_Connection(&getLaneParents().at(i)->getParentEdge(), newCon, false, true), true); } // update lane iterator i++; } } else { // declare new position double newPositionOverLane = myPositionOverLane; // fix pos and lenght checkAndFixDetectorPosition GNEAdditionalHandler::checkAndFixDetectorPosition(newPositionOverLane, getLaneParents().front()->getParentEdge().getNBEdge()->getFinalLength(), true); // set new position setAttribute(SUMO_ATTR_POSITION, toString(newPositionOverLane), myViewNet->getUndoList()); // declare new end position double newEndPositionOverLane = myEndPositionOverLane; // fix pos and lenght checkAndFixDetectorPosition GNEAdditionalHandler::checkAndFixDetectorPosition(newEndPositionOverLane, getLaneParents().back()->getParentEdge().getNBEdge()->getFinalLength(), true); // set new position setAttribute(SUMO_ATTR_ENDPOS, toString(newEndPositionOverLane), myViewNet->getUndoList()); } } }
void GNEConnectorFrame::handleLaneClick(GNELane* lane, bool mayDefinitelyPass, bool allowConflict, bool toggle) { if (myCurrentLane == 0) { myCurrentLane = lane; myCurrentLane->setSpecialColor(&sourceColor); initTargets(); myNumChanges = 0; myViewNet->getUndoList()->p_begin("modify connections"); } else if (myPotentialTargets.count(lane) || allowConflict) { const int fromIndex = myCurrentLane->getIndex(); GNEEdge& srcEdge = myCurrentLane->getParentEdge(); GNEEdge& destEdge = lane->getParentEdge(); std::vector<NBEdge::Connection> connections = srcEdge.getNBEdge()->getConnectionsFromLane(fromIndex); bool changed = false; LaneStatus status = getLaneStatus(connections, lane); if (status == CONFLICTED && allowConflict) { status = UNCONNECTED; } switch (status) { case UNCONNECTED: if (toggle) { // create new connection NBEdge::Connection newCon(fromIndex, destEdge.getNBEdge(), lane->getIndex(), mayDefinitelyPass); myViewNet->getUndoList()->add(new GNEChange_Connection(&srcEdge, newCon, true), true); lane->setSpecialColor(mayDefinitelyPass ? &targetPassColor : &targetColor); srcEdge.getGNEJunctionDestiny()->invalidateTLS(myViewNet->getUndoList()); } break; case CONNECTED: case CONNECTED_PASS: { // remove connection GNEConnection* con = srcEdge.retrieveConnection(fromIndex, destEdge.getNBEdge(), lane->getIndex()); myViewNet->getNet()->deleteConnection(con, myViewNet->getUndoList()); lane->setSpecialColor(&potentialTargetColor); changed = true; break; } case CONFLICTED: myViewNet->setStatusBarText("Another lane from the same edge already connects to that lane"); break; } if (changed) { myNumChanges += 1; } } else { myViewNet->setStatusBarText("Invalid target for connection"); } updateDescription(); }
/* * Copy an expression, return a pointer to the newly allocated expression. */ Exp *copyExp(Exp *exp) { if(isApp(exp)) { return newApp(copyExp(appFun(exp)), copyExp(appArg(exp))); } else if(isAbs(exp)) { return newAbs(copyExp(absBody(exp))); } else if(isVar(exp)) { return newVar(varBind(exp)); } else if(isCon(exp)) { return newCon(conTy(exp), conVal(exp)); } else if(isOpn(exp)) { return newOpn(opnType(exp)); } else { printf("Error - unrecognised expression type in copyExp()\n"); assert(false); } }
/* * Perform at least one reduction step on the given template. */ Exp *reduceTemplate(Exp *exp) { // Conditionals if(isApp(exp) && isApp(appFun(exp)) && isApp(appFun(appFun(exp))) && isOpn(appFun(appFun(appFun(exp)))) && (opnType(appFun(appFun(appFun(exp)))) == O_Cond)) { Exp *guard = appArg(appFun(appFun(exp))); Exp *truExp = appArg(appFun(exp)); Exp *falExp = appArg(exp); // If the guard is true, return the true expression. if(isCon(guard) && (conVal(guard) == true)) { return copyExp(truExp); } // If the guard is false, return the false expression. else if(isCon(guard) && (conVal(guard) == false)) { return copyExp(falExp); } // If the guard is not reduced, reduce it. else { return newApp(newApp(newApp( newOpn(O_Cond), reduceTemplate(guard)), copyExp(truExp)), copyExp(falExp)); } } // End of conditional case // Binary operations else if(isApp(exp) && isApp(appFun(exp)) && isBinaryOpn(appFun(appFun(exp)))) { OpTy opn = opnType(appFun(appFun(exp))); Exp *arg1 = appArg(appFun(exp)); Exp *arg2 = appArg(exp); // Handle equality differently because it is polymorphic. if(opn == O_Equ) { Exp *redA1 = reduceTemplateNorm(arg1); Exp *redA2 = reduceTemplateNorm(arg2); bool same = expEqual(redA1, redA2); freeExp(redA1); freeExp(redA2); return newCon(C_Bool, same); } else if(isApp(arg1) || isAbs(arg1) || isVar(arg1) || isOpn(arg1)) { return newApp( newApp( newOpn(opn), reduceTemplate(arg1)), copyExp(arg2)); } else if(isApp(arg2) || isAbs(arg2) || isVar(arg2) || isOpn(arg2)) { return newApp( newApp( newOpn(opn), copyExp(arg1)), reduceTemplate(arg2)); } else { assert(isCon(arg1)); assert(isCon(arg2)); if(opn == O_Add) { return newCon(C_Int, conVal(arg1) + conVal(arg2)); } else if(opn == O_Sub) { return newCon(C_Int, conVal(arg1) - conVal(arg2)); } else if(opn == O_Mul) { return newCon(C_Int, conVal(arg1) * conVal(arg2)); } else if(opn == O_Div) { return newCon(C_Int, conVal(arg1) / conVal(arg2)); } else if(opn == O_Mod) { return newCon(C_Int, conVal(arg1) % conVal(arg2)); } else if(opn == O_Lss) { return newCon(C_Bool, conVal(arg1) < conVal(arg2)); } else if(opn == O_LsE) { return newCon(C_Bool, conVal(arg1) <= conVal(arg2)); } else if(opn == O_NEq) { return newCon(C_Bool, conVal(arg1) != conVal(arg2)); } else if(opn == O_Gtr) { return newCon(C_Bool, conVal(arg1) > conVal(arg2)); } else if(opn == O_GtE) { return newCon(C_Bool, conVal(arg1) >= conVal(arg2)); } else if(opn == O_Xor) { return newCon(C_Bool, (!conVal(arg1)) != (!conVal(arg2))); } else if(opn == O_And) { return newCon(C_Bool, conVal(arg1) && conVal(arg2)); } else if(opn == O_Or ) { return newCon(C_Bool, conVal(arg1) || conVal(arg2)); } else { printf("Error reducing binary operation - unrecognised " "operation\n"); assert(false); } } } // End of binary operations case // iszero & not unary operations else if(isApp(exp) && isOpn(appFun(exp)) && (opnType(appFun(exp)) == O_Not || opnType(appFun(exp)) == O_IsZ)) { OpTy opn = opnType(appFun(exp)); Exp *arg = appArg(exp); if(isApp(arg) || isAbs(arg) || isVar(arg) || isOpn(arg)) { return newApp(newOpn(opn), reduceTemplate(arg)); } else { if(opn == O_Not) { return newCon(C_Bool, !(conVal(arg))); } else { assert(opn == O_IsZ); return newCon(C_Bool, conVal(arg) == 0); } } } // End iszero & not unary operations case // Polymorphic unary operations // Null else if(isApp(exp) && isOpn(appFun(exp)) && (opnType(appFun(exp)) == O_Null)) { Exp *arg = appArg(exp); Exp *reducedArg = reduceTemplateNorm(arg); if(isOpn(reducedArg) && (opnType(reducedArg) == O_Empty)) { freeExp(reducedArg); return newCon(C_Bool, true); } else { freeExp(reducedArg); return newCon(C_Bool, false); } } // End Null // Head and Tail else if(isApp(exp) && isOpn(appFun(exp)) && ((opnType(appFun(exp)) == O_Head) || (opnType(appFun(exp)) == O_Tail))) { OpTy opn = opnType(appFun(exp)); Exp *arg = appArg(exp); if(isApp(arg) && isApp(appFun(arg)) && isOpn(appFun(appFun(arg))) && (opnType(appFun(appFun(arg)))) == O_Cons) { Exp *head = appArg(appFun(arg)); Exp *tail = appArg(arg); if(opn == O_Head) { return copyExp(head); } else { assert(opn == O_Tail); return copyExp(tail); } } else { return newApp(newOpn(opn), reduceTemplate(arg)); } } // End Head and Tail // Cons else if(isApp(exp) && isOpn(appFun(exp)) && (opnType(appFun(exp)) == O_Cons)) { Exp *consArg = appArg(exp); return newApp(newOpn(O_Cons), reduceTemplate(consArg)); } // End Cons // Sum operations else if(isApp(exp) && isOpn(appFun(exp)) && ((opnType(appFun(exp)) == O_RemL) || (opnType(appFun(exp)) == O_RemR))) { OpTy opn = opnType(appFun(exp)); Exp *arg = appArg(exp); if(isApp(arg) && isOpn(appFun(arg)) && ((opnType(appFun(arg)) == O_InjL) || (opnType(appFun(arg)) == O_InjR))) { OpTy innerOpn = opnType(appFun(arg)); Exp *innerArg = appArg(arg); if(((opn == O_RemL) && (innerOpn == O_InjL)) || ((opn == O_RemR) && (innerOpn == O_InjR))) { return copyExp(innerArg); } else { printf("Error - removed value from a non-sum expression or " "wrong side of sum expression\n"); assert(false); } } else { return newApp(newOpn(opn), reduceTemplate(arg)); } } else if(isApp(exp) && isOpn(appFun(exp)) && ((opnType(appFun(exp)) == O_InjL) || (opnType(appFun(exp)) == O_InjR))) { OpTy opn = opnType(appFun(exp)); Exp *arg = appArg(exp); return newApp(newOpn(opn), reduceTemplate(arg)); } else if(isApp(exp) && isOpn(appFun(exp)) && (opnType(appFun(exp)) == O_IsLeft)) { Exp *arg = appArg(exp); if(isApp(arg) && isOpn(appFun(arg)) && ((opnType(appFun(arg)) == O_InjL) || (opnType(appFun(arg)) == O_InjR))) { OpTy injOpn = opnType(appFun(arg)); return newCon(C_Bool, injOpn == O_InjL); } else { return newApp(newOpn(O_IsLeft), reduceTemplate(arg)); } } // End sum operations // Tuple operations else if(isApp(exp) && isOpn(appFun(exp)) && ((opnType(appFun(exp)) == O_Fst) || (opnType(appFun(exp)) == O_Snd))) { OpTy opn = opnType(appFun(exp)); Exp *arg = appArg(exp); if(isApp(arg) && isApp(appFun(arg)) && isOpn(appFun(appFun(arg))) && (opnType(appFun(appFun(arg))) == O_Tuple)) { Exp *fst = appArg(appFun(arg)); Exp *snd = appArg(arg); return copyExp((opn == O_Fst) ? fst : snd); } else { return newApp(newOpn(opn), reduceTemplate(arg)); } } else if(isApp(exp) && isOpn(appFun(exp)) && (opnType(appFun(exp)) == O_Tuple)) { Exp *arg = appArg(exp); return newApp(newOpn(O_Tuple), reduceTemplate(arg)); } // End Tuple operations // Fixed point combinator else if(isApp(exp) && isOpn(appFun(exp)) && (opnType(appFun(exp)) == O_Fix)) { return newApp(copyExp(appArg(exp)), copyExp(exp)); } // End fixed point combinator // End polymorphic unary operations // Lambda abstractions else if(isApp(exp) && isAbs(appFun(exp))) { Exp *abs = appFun(exp); Exp *arg = appArg(exp); return replace(absBody(abs), 0, arg); } // End lambda abstractions // Function calls else if(isApp(exp) && isVar(appFun(exp))) { Exp *var = appFun(exp); Exp *arg = appArg(exp); int bind = varBind(var); if(hasFunc(bind)) { return newApp(instantiate(bind), copyExp(arg)); } else { return newApp(copyExp(var), reduceTemplate(arg)); } } else if(isVar(exp) && hasFunc(varBind(exp))) { return instantiate(varBind(exp)); } // End function calls // Catch-all application case else if(isApp(exp)) { Exp *fun = appFun(exp); Exp *arg = appArg(exp); return newApp(reduceTemplate(fun), reduceTemplate(arg)); } // End catch-all application case // If there are no reductions to make, return a copy of the given template. else { return copyExp(exp); } }