8#ifndef model_LoopNode_H_
9#define model_LoopNode_H_
28#define VerboseLoopNode(N,x) if(verboseLevel>=N){std::cout<<greenColor<<x<<defaultColor;}
30#define VerboseLoopNode(N,x)
36 template<
typename Derived>
56 std::shared_ptr<LoopType> _loop;
62 std::pair<LoopNodeType*,LoopLinkType*>
prev;
63 std::pair<LoopNodeType*,LoopLinkType*>
next;
73 const std::shared_ptr<LoopType>& loop_in,
74 const std::shared_ptr<NetworkNodeType>& networkNode_in) :
78 ,
prev(nullptr,nullptr)
79 ,
next(nullptr,nullptr)
81 VerboseLoopNode(1,
"Constructing LoopNode "<<
tag()<<std::endl);
89 VerboseLoopNode(1,
"Destroying LoopNode "<<
tag()<<std::endl);
91 assert(
prev.first==
nullptr &&
"~LoopNode prev.first!=nullptr");
92 assert(
prev.second==
nullptr &&
"~LoopNode prev.second!=nullptr");
93 assert(
next.first==
nullptr &&
"~LoopNode next.first!=nullptr");
94 assert(
next.second==
nullptr &&
"~LoopNode next.second!=nullptr");
105 void resetLoop(
const std::shared_ptr<LoopType>& newLoop)
107 VerboseLoopNode(1,
"LoopNode "<<
tag()<<
" resetLoop to "<<newLoop->tag()<<std::endl);
108 assert((
isIsolated() || _loop==newLoop) &&
"Trying to change loop of LoopNode connected to LoopLinks");
118 return prev.first==
nullptr &&
next.first==
nullptr;
122 const std::shared_ptr<LoopType>&
loop()
const
130 return loop()==other->loop();
138 return this->
network().globalNodeID(this->
sID);
144 VerboseLoopNode(2,
"LoopNode "<<
tag()<<
" addLoopLink "<<pL->tag()<<std::endl);
145 VerboseLoopNode(3,
"LoopNode "<<
tag()<<
" loop()= "<<
loop()->
tag()<<std::endl);
146 VerboseLoopNode(3,
"LoopLink "<<pL->tag()<<
" loop= "<<pL->loop->tag()<<std::endl);
148 assert(pL->loop==_loop &&
"LoopNode and LoopLink in different loops");
150 if(pL->source.get()==
this)
152 assert((
next.first==
nullptr ||
next.first==pL->sink.get()) &&
"LoopNode::addLoopLink wrong next node ");
153 assert((
next.second==
nullptr ||
next.second==pL) &&
"LoopNode::addLoopLink wrong next link");
154 next.first=pL->sink.get();
157 assert((pL->prev==
nullptr || pL->prev==
prev.second));
158 pL->prev=
prev.second;
161 assert(
prev.second->loop==pL->loop &&
"links in different loops");
162 prev.second->next=pL;
165 else if(pL->sink.get()==
this)
167 assert((
prev.first==
nullptr ||
prev.first==pL->source.get()) &&
"LoopNode::addLoopLink wrong prev node ");
168 assert((
prev.second==
nullptr ||
prev.second==pL) &&
"LoopNode::addLoopLink wrong prev link");
169 prev.first=pL->source.get();
172 assert((pL->next==
nullptr || pL->next==
next.second));
173 pL->next=
next.second;
176 assert(
next.second->loop==pL->loop &&
"links in different loops");
177 next.second->prev=pL;
182 assert(
false &&
"LoopLink connected to wrong node.");
189 VerboseLoopNode(2,
"LoopNode "<<
tag()<<
" removeLoopLink "<<pL->tag()<<std::endl);
190 assert(pL->loop==_loop &&
"LoopNode and LoopLink in different loops");
193 if(pL->source.get()==
this)
195 VerboseLoopNode(3,
"LoopNode "<<
tag()<<
" removeLoopLink (next) "<<pL->tag()<<std::endl);
197 assert((
next.first==
nullptr ||
next.first==pL->sink.get()) &&
"LoopNode::addLoopLink wrong next node ");
198 assert((
next.second==
nullptr ||
next.second==pL) &&
"LoopNode::addLoopLink wrong next link");
202 assert((pL->prev==
nullptr || pL->prev==
prev.second));
205 prev.second->next=
nullptr;
208 else if(pL->sink.get()==
this)
210 VerboseLoopNode(3,
"LoopNode "<<
tag()<<
" removeLoopLink (prev) "<<pL->tag()<<std::endl);
212 assert((
prev.first==
nullptr ||
prev.first==pL->source.get()) &&
"LoopNode::addLoopLink wrong prev node ");
213 assert((
prev.second==
nullptr ||
prev.second==pL) &&
"LoopNode::addLoopLink wrong prev link");
217 assert((pL->next==
nullptr || pL->next==
next.second));
220 next.second->prev=
nullptr;
225 assert(
false &&
"LoopLink connected to wrong node.");
245 template<
typename Derived>
Derived * p_derived()
A pointer to the derived object.
CRTP()
The default constructor.
LoopNode(LoopNetworkType *const loopNetwork_in, const std::shared_ptr< LoopType > &loop_in, const std::shared_ptr< NetworkNodeType > &networkNode_in)
TypeTraits< Derived >::NetworkNodeType NetworkNodeType
TypeTraits< Derived >::LoopType LoopType
void addLoopLink(LoopLinkType *const pL)
void resetLoop(const std::shared_ptr< LoopType > &newLoop)
std::shared_ptr< NetworkNodeType > networkNode
const std::shared_ptr< LoopType > & loop() const
void removeLoopLink(LoopLinkType *const pL)
std::pair< LoopNodeType *, LoopLinkType * > prev
NetworkBase< Derived, size_t > NetworkBaseType
TypeTraits< Derived >::LoopLinkType LoopLinkType
bool isContractableTo(const Derived *const other) const
std::pair< LoopNodeType *, LoopLinkType * > next
TypeTraits< Derived >::LoopNetworkType LoopNetworkType
const LoopNetworkType & network() const
NetworkBase(const NetworkBase< LoopNetworkType, KeyType > &)=delete
const size_t sID
The static ID of this.