From: Anthony Geay Date: Fri, 2 Oct 2015 07:50:24 +0000 (+0200) Subject: std::map to std::list in InGates storage inside OutGate to always reproduce the order... X-Git-Tag: V8_0_pre~20 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=1c3ffebe3d8052af00617aa831f1841049483e8c;p=modules%2Fyacs.git std::map to std::list in InGates storage inside OutGate to always reproduce the orders of out links of nodes. --- diff --git a/src/engine/AbstractPoint.cxx b/src/engine/AbstractPoint.cxx index 2a9f98e64..e5baa1bbc 100644 --- a/src/engine/AbstractPoint.cxx +++ b/src/engine/AbstractPoint.cxx @@ -216,7 +216,7 @@ bool AbstractPoint::IsGatherB4Ext(Node *node) bool AbstractPoint::isSimplyLinkedAfter(BlocPoint *sop, Node *node) { OutGate *oug(node->getOutGate()); - std::set ings(oug->edSetInGate()); + std::list ings(oug->edSetInGate()); if(ings.size()==1) return true; if(ings.size()==0) @@ -281,7 +281,7 @@ Node *AbstractPoint::GetNodeB4(Node *node) Node *AbstractPoint::GetNodeAfter(Node *node) { OutGate *oug(node->getOutGate()); - std::set fl(oug->edSetInGate()); + std::list fl(oug->edSetInGate()); if(fl.size()>1) throw Exception("AbstractPoint::GetNodeAfter : precond not OK !"); if(fl.size()==0) @@ -318,11 +318,11 @@ bool AbstractPoint::IsCommonDirectSonOf(AbstractPoint *refFather, const std::lis return true; } -bool AbstractPoint::IsCommonDirectSonOf(AbstractPoint *refFather, const std::set& ings, AbstractPoint *&ret) +bool AbstractPoint::IsCommonDirectSonOf(AbstractPoint *refFather, const std::list& ings, AbstractPoint *&ret) { if(ings.size()<1) throw YACS::Exception("AbstractPoint::GetCommonDirectSonOf2 : not enough !"); - std::set::const_iterator it(ings.begin()); + std::list::const_iterator it(ings.begin()); InGate *ref(*(it++)); AbstractPoint *ref2(GetDirectSonOf(refFather,refFather->findPointWithNode(ref->getNode()))); for(;it!=ings.end();it++) diff --git a/src/engine/AbstractPoint.hxx b/src/engine/AbstractPoint.hxx index 1adc0839d..11ddee6c2 100644 --- a/src/engine/AbstractPoint.hxx +++ b/src/engine/AbstractPoint.hxx @@ -22,7 +22,6 @@ #include "YACSlibEngineExport.hxx" -#include #include #include #include @@ -79,7 +78,7 @@ namespace YACS static Node *GetNodeAfter(Node *node); static AbstractPoint *GetDirectSonOf(AbstractPoint *refFather, AbstractPoint *sonOrLittleSon); static bool IsCommonDirectSonOf(AbstractPoint *refFather, const std::list& outgs, AbstractPoint *&ret); - static bool IsCommonDirectSonOf(AbstractPoint *refFather, const std::set& ings, AbstractPoint *&ret); + static bool IsCommonDirectSonOf(AbstractPoint *refFather, const std::list& ings, AbstractPoint *&ret); protected: AbstractPoint *_father; }; diff --git a/src/engine/Bloc.cxx b/src/engine/Bloc.cxx index a3dcd3899..07f1e6be6 100644 --- a/src/engine/Bloc.cxx +++ b/src/engine/Bloc.cxx @@ -246,8 +246,8 @@ std::vector< std::list > Bloc::splitIntoIndependantGraph() const ll.push_back(cur); // OutGate *og(cur->getOutGate()); - set og2(og->edSetInGate()); - for(set::const_iterator it2=og2.begin();it2!=og2.end();it2++) + list og2(og->edSetInGate()); + for(list::const_iterator it2=og2.begin();it2!=og2.end();it2++) { Node *cur2((*it2)->getNode()); if(cur2->_colour==White) @@ -350,8 +350,8 @@ std::vector< std::pair > Bloc::getSetOfInternalCFLinks() co vector< pair > ret; for(list::const_iterator iter=_setOfNode.begin();iter!=_setOfNode.end();iter++) { - set outCFLinksOfCurNode=(*iter)->_outGate.edSetInGate(); - for(set::iterator iter2=outCFLinksOfCurNode.begin();iter2!=outCFLinksOfCurNode.end();iter2++) + list outCFLinksOfCurNode=(*iter)->_outGate.edSetInGate(); + for(list::iterator iter2=outCFLinksOfCurNode.begin();iter2!=outCFLinksOfCurNode.end();iter2++) ret.push_back(pair(&(*iter)->_outGate,*iter2)); } return ret; @@ -490,8 +490,8 @@ void Bloc::performCFComputations(LinkInfo& info) const for(list::const_iterator iter=_setOfNode.begin();iter!=_setOfNode.end();iter++) { Node* n1=*iter; - std::set ingates=n1->getOutGate()->edSetInGate(); - for(std::set::const_iterator it2=ingates.begin();it2!=ingates.end();it2++) + std::list ingates=n1->getOutGate()->edSetInGate(); + for(std::list::const_iterator it2=ingates.begin();it2!=ingates.end();it2++) { //CF link : n1 -> (*it2)->getNode() Node* n2=(*it2)->getNode(); @@ -856,9 +856,8 @@ void Bloc::findUselessLinksIn(const std::list< std::vector >& res , Link set searcher(iter2+1,(*whereToPeerAt).end());//to boost research for(;iter2!=((*whereToPeerAt).end()-2);iter2++) { - map::iterator iter4; - map& nexts=(*iter2)->getOutGate()->edMapInGate(); - for(iter4=nexts.begin();iter4!=nexts.end();iter4++) + list< pair >& nexts=(*iter2)->getOutGate()->edMapInGate(); + for(list< pair >::iterator iter4=nexts.begin();iter4!=nexts.end();iter4++) if((*iter4).first->getNode()!=*(iter2+1)) if(searcher.find((*iter4).first->getNode())!=searcher.end()) info.pushUselessCFLink(*iter2,(*iter4).first->getNode()); diff --git a/src/engine/Bloc.hxx b/src/engine/Bloc.hxx index 18a0dfd76..7560f7124 100644 --- a/src/engine/Bloc.hxx +++ b/src/engine/Bloc.hxx @@ -101,8 +101,8 @@ namespace YACS template<> struct CFDirectionVisTraits { - typedef std::map::iterator Iterator; - typedef std::map& Nexts; + typedef std::list< std::pair >::iterator Iterator; + typedef std::list< std::pair >& Nexts; static Nexts getNexts(Node *node) { return node->getOutGate()->edMapInGate(); } }; diff --git a/src/engine/BlocPoint.cxx b/src/engine/BlocPoint.cxx index 381d1eb71..9678e09e3 100644 --- a/src/engine/BlocPoint.cxx +++ b/src/engine/BlocPoint.cxx @@ -42,7 +42,7 @@ AbstractPoint *BlocPoint::findPointWithNode(Node *node) AbstractPoint *BlocPoint::getNodeAfter(Node *node) { OutGate *oug(node->getOutGate()); - std::set fl(oug->edSetInGate()); + std::list fl(oug->edSetInGate()); if(fl.size()>=1) { AbstractPoint *ret(0); diff --git a/src/engine/Node.cxx b/src/engine/Node.cxx index 008d3fc49..b03914f11 100644 --- a/src/engine/Node.cxx +++ b/src/engine/Node.cxx @@ -180,8 +180,8 @@ void Node::setName(const std::string& name) set Node::getOutNodes() const { set ret; - set inGates=_outGate.edSetInGate(); - for(set::iterator iter=inGates.begin();iter!=inGates.end();iter++) + list inGates=_outGate.edSetInGate(); + for(list::iterator iter=inGates.begin();iter!=inGates.end();iter++) ret.insert((*iter)->getNode()); return ret; } diff --git a/src/engine/OutGate.cxx b/src/engine/OutGate.cxx index d2efbefba..3daf4fac8 100644 --- a/src/engine/OutGate.cxx +++ b/src/engine/OutGate.cxx @@ -23,6 +23,8 @@ //#define _DEVDEBUG_ #include "YacsTrace.hxx" +#include + using namespace YACS::ENGINE; using namespace std; @@ -39,7 +41,7 @@ string OutGate::getNameOfTypeOfCurrentInstance() const void OutGate::exReset() { - for(map::iterator iter=_setOfInGate.begin();iter!=_setOfInGate.end();iter++) + for(list< pair< InGate *, bool> >::iterator iter=_setOfInGate.begin();iter!=_setOfInGate.end();iter++) (*iter).second=false; } @@ -53,7 +55,7 @@ void OutGate::exReset() void OutGate::exNotifyDone() { DEBTRACE("OutGate::exNotifyDone"); - for(map::iterator iter=_setOfInGate.begin();iter!=_setOfInGate.end();iter++) + for(list< pair >::iterator iter=_setOfInGate.begin();iter!=_setOfInGate.end();iter++) (*iter).first->exNotifyFromPrecursor(this); } @@ -63,7 +65,7 @@ void OutGate::exNotifyDone() */ void OutGate::exNotifyFailed() { - for(map::iterator iter=_setOfInGate.begin();iter!=_setOfInGate.end();iter++) + for(list< pair >::iterator iter=_setOfInGate.begin();iter!=_setOfInGate.end();iter++) (*iter).first->exNotifyFailed(); } @@ -73,23 +75,32 @@ void OutGate::exNotifyFailed() */ void OutGate::exNotifyDisabled() { - for(map::iterator iter=_setOfInGate.begin();iter!=_setOfInGate.end();iter++) + for(list< pair >::iterator iter=_setOfInGate.begin();iter!=_setOfInGate.end();iter++) (*iter).first->exNotifyDisabled(); } void OutGate::edDisconnectAllLinksFromMe() { - for(map::iterator iter=_setOfInGate.begin();iter!=_setOfInGate.end();iter++) + for(list< pair >::iterator iter=_setOfInGate.begin();iter!=_setOfInGate.end();iter++) (*iter).first->edRemovePrecursor(this); _setOfInGate.clear(); } +class ItemCmp +{ +private: + InGate *_itf; +public: + ItemCmp(InGate *itf):_itf(itf) { } + bool operator()(const std::pair& elt) const { return elt.first==_itf; } +}; + bool OutGate::edAddInGate(InGate *inGate) { if(!isAlreadyInSet(inGate)) { inGate->edAppendPrecursor(this); - _setOfInGate[inGate]=false; + _setOfInGate.push_back(std::pair(inGate,false)); modified(); inGate->modified(); return true; @@ -98,17 +109,17 @@ bool OutGate::edAddInGate(InGate *inGate) return false; } -std::set OutGate::edSetInGate() const +std::list OutGate::edSetInGate() const { - set ret; - for(map::const_iterator iter=_setOfInGate.begin();iter!=_setOfInGate.end();iter++) - ret.insert((*iter).first); + list ret; + for(list< pair >::const_iterator iter=_setOfInGate.begin();iter!=_setOfInGate.end();iter++) + ret.push_back((*iter).first); return ret; } void OutGate::edRemoveInGate(InGate *inGate, bool coherenceWithInGate) throw(YACS::Exception) { - std::map< InGate* , bool >::iterator iter=_setOfInGate.find(inGate); + std::list< pair >::iterator iter(std::find_if(_setOfInGate.begin(),_setOfInGate.end(),ItemCmp(inGate))); if(iter==_setOfInGate.end()) throw Exception("InGate not already connected to OutGate"); else @@ -125,7 +136,7 @@ void OutGate::edRemoveInGate(InGate *inGate, bool coherenceWithInGate) throw(YAC void OutGate::edRemoveInGateOneWay(InGate *inGate) { bool found=false; - for(map::iterator iter=_setOfInGate.begin();iter!=_setOfInGate.end() && !found;iter++) + for(list< pair >::iterator iter=_setOfInGate.begin();iter!=_setOfInGate.end() && !found;iter++) if((*iter).first==inGate) { _setOfInGate.erase(iter); @@ -138,7 +149,7 @@ void OutGate::edRemoveInGateOneWay(InGate *inGate) bool OutGate::isAlreadyInSet(InGate *inGate) const { - return _setOfInGate.find(inGate)!=_setOfInGate.end(); + return find_if(_setOfInGate.begin(),_setOfInGate.end(),ItemCmp(inGate))!=_setOfInGate.end(); } int OutGate::getNbOfInGatesConnected() const diff --git a/src/engine/OutGate.hxx b/src/engine/OutGate.hxx index 869125af7..af0ea241e 100644 --- a/src/engine/OutGate.hxx +++ b/src/engine/OutGate.hxx @@ -24,8 +24,7 @@ #include "Port.hxx" #include "Exception.hxx" -#include -#include +#include namespace YACS { @@ -38,7 +37,7 @@ namespace YACS { friend class ElementaryNode; protected: - std::map _setOfInGate; + std::list< std::pair< InGate *, bool > > _setOfInGate; public: static const char NAME[]; public: @@ -50,8 +49,8 @@ namespace YACS void exNotifyDisabled(); void edDisconnectAllLinksFromMe(); bool edAddInGate(InGate *inGate); - std::map& edMapInGate() { return _setOfInGate; } - std::set edSetInGate() const; + std::list< std::pair< InGate *, bool> >& edMapInGate() { return _setOfInGate; } + std::list edSetInGate() const; void edRemoveInGate(InGate *inGate, bool coherenceWithInGate=true) throw(Exception); int getNbOfInGatesConnected() const; bool isAlreadyInSet(InGate *inGate) const; diff --git a/src/engine/VisitorSaveSchema.cxx b/src/engine/VisitorSaveSchema.cxx index c6dc7c1c3..5df4abe35 100644 --- a/src/engine/VisitorSaveSchema.cxx +++ b/src/engine/VisitorSaveSchema.cxx @@ -797,8 +797,8 @@ void VisitorSaveSchema::writeControls(ComposedNode *node) for (list::iterator ic = setOfChildren.begin(); ic != setOfChildren.end(); ++ic) { // --- Control links from direct descendant to nodes inside the bloc - set setOfInGates = (*ic)->getOutGate()->edSetInGate(); - for (set::iterator ig = setOfInGates.begin(); ig != setOfInGates.end(); ++ig) + list setOfInGates = (*ic)->getOutGate()->edSetInGate(); + for (list::iterator ig = setOfInGates.begin(); ig != setOfInGates.end(); ++ig) { Node *to = (*ig)->getNode(); if (node->isInMyDescendance(to)) diff --git a/src/genericgui/SceneBlocItem.cxx b/src/genericgui/SceneBlocItem.cxx index 265ebad34..329bd38e8 100644 --- a/src/genericgui/SceneBlocItem.cxx +++ b/src/genericgui/SceneBlocItem.cxx @@ -228,8 +228,8 @@ void SceneBlocItem::getNodesInfo(YACS::ENGINE::ComposedNode *cnode) { OutGate *outGate = outNode->getOutGate(); - set setOfInGate = outGate->edSetInGate(); - set::const_iterator itin = setOfInGate.begin(); + list setOfInGate = outGate->edSetInGate(); + list::const_iterator itin = setOfInGate.begin(); for (; itin != setOfInGate.end(); ++itin) { Node *inNode = (*itin)->getNode(); diff --git a/src/hmi/guiObservers.cxx b/src/hmi/guiObservers.cxx index 786d8f4d0..84f1c5a54 100644 --- a/src/hmi/guiObservers.cxx +++ b/src/hmi/guiObservers.cxx @@ -902,7 +902,7 @@ void SubjectNode::saveLinks() Node* n2=_node; DEBTRACE(n1->getName()<< " " << n2->getName()); } - std::set::const_iterator iti; + std::list::const_iterator iti; for(iti=singate.begin();iti != singate.end();iti++) { Node* n1=_node; @@ -1076,7 +1076,7 @@ void SubjectNode::restoreLinks() } } - std::set::const_iterator it2; + std::list::const_iterator it2; for(it2=singate.begin();it2 != singate.end();it2++) { Node* n1=_node; @@ -1649,8 +1649,8 @@ void SubjectComposedNode::loadLinks() { SubjectNode* sno = GuiContext::getCurrent()->_mapOfSubjectNode[*itn]; OutGate* outgate = (*itn)->getOutGate(); - std::set setIngate = outgate->edSetInGate(); - std::set::const_iterator itg; + std::list setIngate = outgate->edSetInGate(); + std::list::const_iterator itg; for(itg = setIngate.begin(); itg != setIngate.end(); ++itg) { Node* inNode = (*itg)->getNode(); diff --git a/src/hmi/guiObservers.hxx b/src/hmi/guiObservers.hxx index acc9eb4aa..cf277eb36 100644 --- a/src/hmi/guiObservers.hxx +++ b/src/hmi/guiObservers.hxx @@ -339,7 +339,7 @@ namespace YACS std::list _listSubjectControlLink; int _execState; std::list loutgate; - std::set singate; + std::list singate; std::vector< std::pair > dataLinks; std::vector< std::pair > dataflowLinks; };