19 template<
typename ITEM>
25 using ItemList = std::vector<typename ITEM::Type>;
56 for (
typename ITEM::Type
object : objectList)
57 if (getOrCreateItemNode(creationFunction(
object)) ==
nullptr)
69 for (
auto& kvp : mNodes)
71 kvp.second->mIncomingEdges.clear();
72 kvp.second->mOutgoingEdges.clear();
75 for (
auto& kvp : mNodes)
77 std::vector<ITEM> pointees;
78 if (!kvp.second->mItem.getPointees(pointees, errorState))
81 for (ITEM& pointee_node : pointees)
84 edge->
mSource = kvp.second.get();
85 edge->
mDest = getOrCreateItemNode(pointee_node);
88 mEdges.push_back(std::unique_ptr<Edge>(edge));
93 std::vector<Node*> root_nodes;
94 for (
auto& kvp : mNodes)
96 Node* node = kvp.second.get();
99 root_nodes.push_back(node);
102 for (
Node* root_node : root_nodes)
103 assignDepthRecursive(root_node, 0);
115 std::vector<Node*> result;
116 for (
auto& kvp : mNodes)
117 visitor(*kvp.second);
125 typename NodeMap::const_iterator iter = mNodes.find(ID);
126 if (iter == mNodes.end())
129 return iter->second.get();
137 std::vector<Node*> sorted_nodes;
138 sorted_nodes.reserve(mNodes.size());
139 for (
auto& kvp : mNodes)
140 sorted_nodes.push_back(kvp.second.get());
142 std::sort(sorted_nodes.begin(), sorted_nodes.end(), [](
Node* nodeA,
Node* nodeB) { return nodeA->mDepth > nodeB->mDepth; });
155 if (incomingObjects.find(node) != incomingObjects.end())
158 incomingObjects.insert(node);
184 void assignDepthRecursive(Node* node,
int depth)
187 if (node->mDepth >= depth)
190 for (Edge* outgoing_edge : node->mOutgoingEdges)
191 assignDepthRecursive(outgoing_edge->mDest, depth + 1);
193 node->mDepth = depth;
197 Node* getOrCreateItemNode(
const ITEM& item)
199 Node* result =
nullptr;
200 typename NodeMap::iterator iter = mNodes.find(item.getID());
201 if (iter == mNodes.end())
203 auto node = std::make_unique<Node>();
206 mNodes.insert(std::make_pair(item.getID(), std::move(node)));
210 result = iter->second.get();
217 using NodeMap = std::map<std::string, std::unique_ptr<Node>>;
219 std::vector<std::unique_ptr<Edge>> mEdges;