示例#1
0
void Place::merge(Place* placeToMerge) // CB copie améliorée de Transition::merge, à descendre dans PetriNetNode ?
{
    arcList mergeInGoingArcs = placeToMerge->inGoingArcsOf(); // CB vector
    arcList mergeOutGoingArcs = placeToMerge->outGoingArcsOf(); // CB vector
    
    for (arcList::iterator it = mergeInGoingArcs.begin() ; it != mergeInGoingArcs.end() ; it++) {
        Arc* newArc = getPetriNet()->createArc(dynamic_cast<Transition*>((*it)->getFrom()), this); // CB uncheck cast
        newArc->changeAbsoluteTime((*it)->getAbsoluteMinValue(), (*it)->getAbsoluteMaxValue());
        newArc->changeRelativeTime((*it)->getRelativeMinValue(), (*it)->getRelativeMaxValue());
        getPetriNet()->deleteArc((*it)->getFrom(), placeToMerge);
    } // CB Arc::Arc adds the arc in the nodes' lists
    
    for (arcList::iterator it = mergeOutGoingArcs.begin() ; it != mergeOutGoingArcs.end() ; it++) {
        Arc* newArc = getPetriNet()->createArc(this, dynamic_cast<Transition*>((*it)->getTo()));
        newArc->changeAbsoluteTime((*it)->getAbsoluteMinValue(), (*it)->getAbsoluteMaxValue());
        newArc->changeRelativeTime((*it)->getRelativeMinValue(), (*it)->getRelativeMaxValue());
        getPetriNet()->deleteArc(placeToMerge, (*it)->getTo());
    } // CB Arc::Arc adds the arc in the nodes' lists
}
示例#2
0
void Transition::merge(Transition* transitionToMerge)
{
	for (unsigned int i = 0 ; i < transitionToMerge->m_externActions.size() ; ++i) {
		m_externActions.push_back(transitionToMerge->m_externActions[i]);
	}

	arcList mergeInGoingArcs = transitionToMerge->inGoingArcsOf();
	arcList mergeOutGoingArcs = transitionToMerge->outGoingArcsOf();

	for (unsigned int i = 0; i < mergeInGoingArcs.size() ; ++i) {
		Arc* currentArc = mergeInGoingArcs[i];

		ExtendedInt relativeMinValue = currentArc->getRelativeMinValue();
		ExtendedInt relativeMaxValue = currentArc->getRelativeMaxValue();
		ExtendedInt absoluteMinValue = currentArc->getAbsoluteMinValue();
		ExtendedInt absoluteMaxValue = currentArc->getAbsoluteMaxValue();

		Place* inGoingPlace = (Place*) currentArc->getFrom();

		Arc* newArc = getPetriNet()->createArc(inGoingPlace, this);
		newArc->changeAbsoluteTime(absoluteMinValue, absoluteMaxValue);
		newArc->changeRelativeTime(relativeMinValue, relativeMaxValue);

		getPetriNet()->deleteArc(inGoingPlace, transitionToMerge);
	}

	createBitArray();

	for (unsigned int i = 0; i < mergeOutGoingArcs.size() ; ++i) {
		Arc* currentArc = mergeOutGoingArcs[i];

		Place* outGoingPlace = (Place*) currentArc->getTo();
		getPetriNet()->createArc(this, outGoingPlace);

		getPetriNet()->deleteArc(transitionToMerge, outGoingPlace);
	}
}