Belle II Software development
DirectedNodeNetwork< EntryType, MetaInfoType > Class Template Reference

Network of directed nodes of the type EntryType. More...

#include <DirectedNodeNetwork.h>

Public Member Functions

 DirectedNodeNetwork ()
 ************************* CONSTRUCTOR/DESTRUCTOR *************************
 
 ~DirectedNodeNetwork ()
 destructor taking care of cleaning up the pointer-mess WARNING only needed when using classic pointers for the nodes!
 
bool addNode (NodeID nodeID, EntryType &newEntry)
 ************************* PUBLIC MEMBER FUNCTIONS *************************
 
bool addInnerToLastOuterNode (NodeID innerNodeID)
 to the last outerNode added, another innerNode will be attached
 
bool addOuterToLastInnerNode (NodeID outerNodeID)
 to the last innerNode added, another outerNode will be attached
 
bool linkNodes (NodeID outerNodeID, NodeID innerNodeID)
 takes two entry IDs and weaves them into the network
 
bool isNodeInNetwork (const NodeID nodeID) const
 Check if a given entry is already in the network.
 
void clear ()
 Clear directed node network Called to clear the directed node network if its size grows to large.
 
std::vector< Node * > getOuterEnds ()
 getters:
 
std::vector< Node * > getInnerEnds ()
 returns all nodes which have no inner nodes (but outer ones) and therefore are inner ends of the network
 
NodegetNode (NodeID toBeFound)
 Returns pointer to the node carrying the entry which is equal to given parameter.
 
std::vector< Node * > & getNodes ()
 Returns all nodes of the network.
 
std::vector< Node * >::iterator begin ()
 Returns iterator for container: begin.
 
std::vector< Node * >::iterator end ()
 Returns iterator for container: end.
 
unsigned int size () const
 Returns number of nodes to be found in the network.
 

Protected Types

using Node = DirectedNode< EntryType, MetaInfoType >
 Defining abbreviation for the used directed node type pack.
 
using NodeID = std::int64_t
 NodeID should be some unique integer.
 

Protected Member Functions

void finalize ()
 Finalizing the NodeNetwork.
 

Static Protected Member Functions

static bool createLink (Node &outerNode, Node &innerNode)
 ************************* INTERNAL MEMBER FUNCTIONS *************************
 

Protected Attributes

std::unordered_map< NodeID, Node * > m_nodeMap
 ************************* DATA MEMBERS *************************
 
NodeID m_lastOuterNodeID
 temporal storage for last outer node added, used for speed-up
 
NodeID m_lastInnerNodeID
 temporal storage for last inner node added, used for speed-up
 
bool m_isFinalized
 keeps track of the state of the network to fill the vectors m_nodes, m_outerEnds, m_innerEnds only if required
 
std::vector< Node * > m_nodes
 After the network is finalized this vector will also carry all nodes to be able to keep the old interface.
 
std::vector< Node * > m_outerEnds
 keeps track of current outerEnds (nodes which have no outerNodes) entries are the NodeIDs of the nodes which currently form an outermost node
 
std::vector< Node * > m_innerEnds
 keeps track of current innerEnds (nodes which have no innerNodes) entries are the NodeIds of the nodes which currently form an innermost node
 

Detailed Description

template<typename EntryType, typename MetaInfoType>
class Belle2::DirectedNodeNetwork< EntryType, MetaInfoType >

Network of directed nodes of the type EntryType.

Template Parameters
EntryType: type of the directe nodes
MetaInfoType: meta info type of the nodes

Definition at line 28 of file DirectedNodeNetwork.h.

Member Typedef Documentation

◆ Node

using Node = DirectedNode<EntryType, MetaInfoType>
protected

Defining abbreviation for the used directed node type pack.

Definition at line 31 of file DirectedNodeNetwork.h.

◆ NodeID

using NodeID = std::int64_t
protected

NodeID should be some unique integer.

Definition at line 33 of file DirectedNodeNetwork.h.

Constructor & Destructor Documentation

◆ DirectedNodeNetwork()

DirectedNodeNetwork ( )
inline

************************* CONSTRUCTOR/DESTRUCTOR *************************

Constructor

Definition at line 38 of file DirectedNodeNetwork.h.

38 :
41 m_isFinalized(false)
42 {
43 m_nodeMap.reserve(40000);
44 m_nodes.reserve(40000);
45 }
bool m_isFinalized
keeps track of the state of the network to fill the vectors m_nodes, m_outerEnds, m_innerEnds only if...
std::unordered_map< NodeID, Node * > m_nodeMap
************************* DATA MEMBERS *************************
NodeID m_lastInnerNodeID
temporal storage for last inner node added, used for speed-up
NodeID m_lastOuterNodeID
temporal storage for last outer node added, used for speed-up
std::vector< Node * > m_nodes
After the network is finalized this vector will also carry all nodes to be able to keep the old inter...

◆ ~DirectedNodeNetwork()

~DirectedNodeNetwork ( )
inline

destructor taking care of cleaning up the pointer-mess WARNING only needed when using classic pointers for the nodes!

Definition at line 50 of file DirectedNodeNetwork.h.

51 {
52 for (auto nodePointer : m_nodeMap) {
53 delete nodePointer.second;
54 }
55 m_nodeMap.clear();
56 }

Member Function Documentation

◆ addInnerToLastOuterNode()

bool addInnerToLastOuterNode ( NodeID  innerNodeID)
inline

to the last outerNode added, another innerNode will be attached

Definition at line 75 of file DirectedNodeNetwork.h.

76 {
77 // check if entry does not exist, constructed with ID=-1
78 if (m_lastOuterNodeID < 0) {
79 B2WARNING("Last OuterNode is not yet in this network! CurrentNetworkSize is: " << size());
80 return false;
81 }
82 // check if entries are identical (catch loops):
83 if (m_lastOuterNodeID == innerNodeID) {
84 B2WARNING("LastOuterNode and innerEntry are identical! Skipping linking-process");
85 return false;
86 }
87
88 if (linkNodes(m_lastOuterNodeID, innerNodeID)) {
89 return true;
90 }
91 B2WARNING("Last OuterNode and innerEntry were already in the network and were already connected."
92 "This is a sign for unintended behavior!");
93 return false;
94 }
unsigned int size() const
Returns number of nodes to be found in the network.
bool linkNodes(NodeID outerNodeID, NodeID innerNodeID)
takes two entry IDs and weaves them into the network

◆ addNode()

bool addNode ( NodeID  nodeID,
EntryType &  newEntry 
)
inline

************************* PUBLIC MEMBER FUNCTIONS *************************

Adding new node to nodeMap, if the nodeID is not already present in the nodeMap. Returns true if new node was added.

Definition at line 62 of file DirectedNodeNetwork.h.

63 {
64 if (m_nodeMap.count(nodeID) == 0) {
65 // cppcheck-suppress stlFindInsert
66 m_nodeMap.emplace(nodeID, new Node(newEntry));
67 m_isFinalized = false;
68 return true;
69 }
70 return false;
71 }
DirectedNode< EntryType, MetaInfoType > Node
Defining abbreviation for the used directed node type pack.

◆ addOuterToLastInnerNode()

bool addOuterToLastInnerNode ( NodeID  outerNodeID)
inline

to the last innerNode added, another outerNode will be attached

Definition at line 98 of file DirectedNodeNetwork.h.

99 {
100 // check if entry does not exist, constructed with ID=-1
101 if (m_lastInnerNodeID < 0) {
102 B2WARNING("Last InnerNode is not yet in this network! CurrentNetworkSize is: " << size());
103 return false;
104 }
105 // check if entries are identical (catch loops):
106 if (outerNodeID == m_lastInnerNodeID) {
107 B2WARNING("OuterEntry and lastInnerNode are identical! Skipping linking-process");
108 return false;
109 }
110
111 if (linkNodes(outerNodeID, m_lastInnerNodeID)) {
112 return true;
113 }
114
115 B2WARNING("Last InnerNode and outerEntry were already in the network and were already connected."
116 "This is a sign for unintended behavior!");
117 return false;
118 }

◆ begin()

std::vector< Node * >::iterator begin ( )
inline

Returns iterator for container: begin.

Definition at line 199 of file DirectedNodeNetwork.h.

200 {
201 if (!m_isFinalized) finalize();
202 return m_nodes.begin();
203 }
void finalize()
Finalizing the NodeNetwork.

◆ clear()

void clear ( )
inline

Clear directed node network Called to clear the directed node network if its size grows to large.

This is necessary to prevent to following modules from processing events with only partly filled networks.

Definition at line 153 of file DirectedNodeNetwork.h.

154 {
155 m_nodes.clear();
156 // Clearing the unordered_map is important as the following modules will process the event
157 // if it still contains entries.
158 for (auto nodePointer : m_nodeMap) {
159 delete nodePointer.second;
160 }
161 m_nodeMap.clear();
162 }

◆ createLink()

static bool createLink ( Node outerNode,
Node innerNode 
)
inlinestaticprotected

************************* INTERNAL MEMBER FUNCTIONS *************************

links nodes with each other. returns true if everything went well, returns false, if not

Definition at line 221 of file DirectedNodeNetwork.h.

222 {
223 // not successful if one of them was already added to the other one:
224 if (std::find(outerNode.getInnerNodes().begin(), outerNode.getInnerNodes().end(), &innerNode) != outerNode.getInnerNodes().end()) {
225 return false;
226 }
227 if (std::find(innerNode.getOuterNodes().begin(), innerNode.getOuterNodes().end(), &outerNode) != innerNode.getOuterNodes().end()) {
228 return false;
229 }
230
231 outerNode.addInnerNode(innerNode);
232 innerNode.addOuterNode(outerNode);
233 return true;
234 }

◆ end()

std::vector< Node * >::iterator end ( )
inline

Returns iterator for container: end.

Definition at line 207 of file DirectedNodeNetwork.h.

208 {
209 if (!m_isFinalized) finalize();
210 return m_nodes.end();
211 }

◆ finalize()

void finalize ( )
inlineprotected

Finalizing the NodeNetwork.

Definition at line 237 of file DirectedNodeNetwork.h.

238 {
239 if (m_isFinalized) return;
240 m_nodes.clear();
241 m_nodes.reserve(m_nodeMap.size());
242 m_innerEnds.clear();
243 m_outerEnds.clear();
244 for (const auto& item : m_nodeMap) {
245 m_nodes.push_back(item.second);
246 if (item.second->getInnerNodes().empty()) m_innerEnds.push_back(item.second);
247 if (item.second->getOuterNodes().empty()) m_outerEnds.push_back(item.second);
248 }
249 m_isFinalized = true;
250 }
std::vector< Node * > m_innerEnds
keeps track of current innerEnds (nodes which have no innerNodes) entries are the NodeIds of the node...
std::vector< Node * > m_outerEnds
keeps track of current outerEnds (nodes which have no outerNodes) entries are the NodeIDs of the node...

◆ getInnerEnds()

std::vector< Node * > getInnerEnds ( )
inline

returns all nodes which have no inner nodes (but outer ones) and therefore are inner ends of the network

Definition at line 175 of file DirectedNodeNetwork.h.

176 {
177 if (!m_isFinalized) finalize();
178 return m_innerEnds;
179 }

◆ getNode()

Node * getNode ( NodeID  toBeFound)
inline

Returns pointer to the node carrying the entry which is equal to given parameter.

If no fitting entry was found, nullptr is returned.

Definition at line 184 of file DirectedNodeNetwork.h.

185 {
186 if (m_nodeMap.count(toBeFound)) return m_nodeMap.at(toBeFound);
187 else return nullptr;
188 }

◆ getNodes()

std::vector< Node * > & getNodes ( )
inline

Returns all nodes of the network.

Definition at line 191 of file DirectedNodeNetwork.h.

192 {
193 if (!m_isFinalized) finalize();
194 return m_nodes;
195 }

◆ getOuterEnds()

std::vector< Node * > getOuterEnds ( )
inline

getters:

returns all nodes which have no outer nodes (but inner ones) and therefore are outer ends of the network

Definition at line 167 of file DirectedNodeNetwork.h.

168 {
169 if (!m_isFinalized) finalize();
170 return m_outerEnds;
171 }

◆ isNodeInNetwork()

bool isNodeInNetwork ( const NodeID  nodeID) const
inline

Check if a given entry is already in the network.

Definition at line 143 of file DirectedNodeNetwork.h.

144 {
145 return m_nodeMap.count(nodeID);
146 }

◆ linkNodes()

bool linkNodes ( NodeID  outerNodeID,
NodeID  innerNodeID 
)
inline

takes two entry IDs and weaves them into the network

Definition at line 122 of file DirectedNodeNetwork.h.

123 {
124 m_isFinalized = false;
125 // check if entries are identical (catch loops):
126 if (outerNodeID == innerNodeID) {
127 B2WARNING("OuterNodeID and innerNodeID are identical! Skipping linking-process");
128 return false;
129 }
130 if (m_nodeMap.count(innerNodeID) == 0 or m_nodeMap.count(outerNodeID) == 0) {
131 B2WARNING("Trying to link Nodes that are not present yet");
132 return false;
133 }
134
135 m_lastOuterNodeID = outerNodeID;
136 m_lastInnerNodeID = innerNodeID;
137
138 return createLink(*(m_nodeMap[outerNodeID]), *(m_nodeMap[innerNodeID]));
139 }
static bool createLink(Node &outerNode, Node &innerNode)
************************* INTERNAL MEMBER FUNCTIONS *************************

◆ size()

unsigned int size ( ) const
inline

Returns number of nodes to be found in the network.

Definition at line 215 of file DirectedNodeNetwork.h.

215{ return m_nodeMap.size(); }

Member Data Documentation

◆ m_innerEnds

std::vector<Node*> m_innerEnds
protected

keeps track of current innerEnds (nodes which have no innerNodes) entries are the NodeIds of the nodes which currently form an innermost node

Definition at line 276 of file DirectedNodeNetwork.h.

◆ m_isFinalized

bool m_isFinalized
protected

keeps track of the state of the network to fill the vectors m_nodes, m_outerEnds, m_innerEnds only if required

Definition at line 263 of file DirectedNodeNetwork.h.

◆ m_lastInnerNodeID

NodeID m_lastInnerNodeID
protected

temporal storage for last inner node added, used for speed-up

Definition at line 260 of file DirectedNodeNetwork.h.

◆ m_lastOuterNodeID

NodeID m_lastOuterNodeID
protected

temporal storage for last outer node added, used for speed-up

Definition at line 257 of file DirectedNodeNetwork.h.

◆ m_nodeMap

std::unordered_map<NodeID, Node*> m_nodeMap
protected

************************* DATA MEMBERS *************************

carries all nodes

Definition at line 254 of file DirectedNodeNetwork.h.

◆ m_nodes

std::vector<Node*> m_nodes
protected

After the network is finalized this vector will also carry all nodes to be able to keep the old interface.

This shouldn't affect the performance drastically in comparison to directly accessing the nodeMap.

Definition at line 268 of file DirectedNodeNetwork.h.

◆ m_outerEnds

std::vector<Node*> m_outerEnds
protected

keeps track of current outerEnds (nodes which have no outerNodes) entries are the NodeIDs of the nodes which currently form an outermost node

Definition at line 272 of file DirectedNodeNetwork.h.


The documentation for this class was generated from the following file: