8#ifndef model_LoopLink_H_
9#define model_LoopLink_H_
22#define VerboseLoopLink(N,x) if(verboseLevel>=N){std::cout<<blueColor<<x<<defaultColor;}
24#define VerboseLoopLink(N,x)
29 template<
typename Derived>
48 const std::shared_ptr<LoopNodeType>& Ni,
49 const std::shared_ptr<LoopNodeType>& Nj)
51 return KeyType{
loop->sID,std::min(Ni->sID,Nj->sID),std::max(Ni->sID,Nj->sID)};
58 const std::shared_ptr<LoopNodeType>
source;
59 const std::shared_ptr<LoopNodeType>
sink;
60 const std::shared_ptr<LoopType>
loop;
63 std::shared_ptr<NetworkLinkType> _networkLink;
77 LoopLink(
const std::shared_ptr<LoopNodeType>& so,
78 const std::shared_ptr<LoopNodeType>& si,
79 const std::shared_ptr<LoopType>& pL) :
89 VerboseLoopLink(1,
"Constructing LoopLink "<<
tag()<<std::endl);
99 bool sourceAdded=
false,sinkAdded=
false,loopAdded=
false;
110 _networkLink->addLoopLink(this->
p_derived());
117 if(_networkLink && _networkLink->loopLinks().count(this->p_derived()))
119 _networkLink->removeLoopLink(this->
p_derived());
153 VerboseLoopLink(1,
"Destroying LoopLink "<<
tag()<<std::endl);
156 _networkLink->removeLoopLink(this->
p_derived());
160 source->removeLoopLink(this->
p_derived());
177 if(link->loop==
loop && link!=
this)
188 if(this->
derived().hasNetworkLink())
190 auto netLink(
loop->network().networkLinks().get(NetworkLinkType::getKey(
source->networkNode,
sink->networkNode)));
191 return netLink? netLink :
loop->network().networkLinks().create(
source->networkNode,
sink->networkNode);
203 _networkLink->removeLoopLink(this->
p_derived());
208 _networkLink->addLoopLink(this->
p_derived());
223 return source->tag() +
"->" +
sink->tag() +
" ("+std::to_string(
loop->sID)+
")";
231 os << ll.
loop->sID<<
"\t"
233 << ll.
sink->sID<<
"\t";
240 template<
typename LinkType>
Derived * p_derived()
A pointer to the derived object.
Derived & derived()
A reference to the derived object.
CRTP()
The default constructor.
static KeyType loopLinkKey(const std::shared_ptr< LoopType > &loop, const std::shared_ptr< LoopNodeType > &Ni, const std::shared_ptr< LoopNodeType > &Nj)
const std::shared_ptr< LoopNodeType > source
TypeTraits< Derived >::NetworkLinkType NetworkLinkType
const std::shared_ptr< NetworkLinkType > & networkLink() const
std::array< size_t, 3 > KeyType
const std::shared_ptr< LoopNodeType > sink
std::shared_ptr< NetworkLinkType > getNetworkLink()
TypeTraits< Derived >::LoopNodeType LoopNodeType
TypeTraits< Derived >::LoopType LoopType
TypeTraits< Derived >::LoopNetworkType LoopNetworkType
LoopLink(const std::shared_ptr< LoopNodeType > &so, const std::shared_ptr< LoopNodeType > &si, const std::shared_ptr< LoopType > &pL)
friend T & operator<<(T &os, const LoopLink< Derived > &ll)
const FlowType & flow() const
const std::shared_ptr< LoopType > loop
TypeTraits< Derived >::FlowType FlowType