summaryrefslogtreecommitdiff
path: root/flowgraphnode.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2019-04-12 14:51:42 -0400
committerRusty Wagner <rusty@vector35.com>2019-04-12 14:51:42 -0400
commit8f7901c4709826acc0e53aeea4442b1fb9a25876 (patch)
tree42575d8b2ef5c35a5546154f866c038ceff7b065 /flowgraphnode.cpp
parent1eee7293d9a171ba6c2e1e3d33be6d693ac66aee (diff)
Add incoming edges for flow graph nodes
Diffstat (limited to 'flowgraphnode.cpp')
-rw-r--r--flowgraphnode.cpp31
1 files changed, 30 insertions, 1 deletions
diff --git a/flowgraphnode.cpp b/flowgraphnode.cpp
index 0101d716..37128cd8 100644
--- a/flowgraphnode.cpp
+++ b/flowgraphnode.cpp
@@ -29,6 +29,7 @@ FlowGraphNode::FlowGraphNode(FlowGraph* graph)
m_object = BNCreateFlowGraphNode(graph->GetObject());
m_cachedLinesValid = false;
m_cachedEdgesValid = false;
+ m_cachedIncomingEdgesValid = false;
}
@@ -37,6 +38,7 @@ FlowGraphNode::FlowGraphNode(BNFlowGraphNode* node)
m_object = node;
m_cachedLinesValid = false;
m_cachedEdgesValid = false;
+ m_cachedIncomingEdgesValid = false;
}
@@ -154,13 +156,40 @@ const vector<FlowGraphEdge>& FlowGraphNode::GetOutgoingEdges()
result.push_back(edge);
}
- BNFreeFlowGraphNodeOutgoingEdgeList(edges, count);
+ BNFreeFlowGraphNodeEdgeList(edges, count);
m_cachedEdges = result;
m_cachedEdgesValid = true;
return m_cachedEdges;
}
+const vector<FlowGraphEdge>& FlowGraphNode::GetIncomingEdges()
+{
+ if (m_cachedIncomingEdgesValid)
+ return m_cachedIncomingEdges;
+
+ size_t count;
+ BNFlowGraphEdge* edges = BNGetFlowGraphNodeIncomingEdges(m_object, &count);
+
+ vector<FlowGraphEdge> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ {
+ FlowGraphEdge edge;
+ edge.type = edges[i].type;
+ edge.target = edges[i].target ? new FlowGraphNode(BNNewFlowGraphNodeReference(edges[i].target)) : nullptr;
+ edge.points.insert(edge.points.begin(), &edges[i].points[0], &edges[i].points[edges[i].pointCount]);
+ edge.backEdge = edges[i].backEdge;
+ result.push_back(edge);
+ }
+
+ BNFreeFlowGraphNodeEdgeList(edges, count);
+ m_cachedIncomingEdges = result;
+ m_cachedIncomingEdgesValid = true;
+ return m_cachedIncomingEdges;
+}
+
+
void FlowGraphNode::AddOutgoingEdge(BNBranchType type, FlowGraphNode* target)
{
BNAddFlowGraphNodeOutgoingEdge(m_object, type, target->GetObject());