diff options
| author | Rusty Wagner <rusty@vector35.com> | 2019-04-12 14:51:42 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2019-04-12 14:51:42 -0400 |
| commit | 8f7901c4709826acc0e53aeea4442b1fb9a25876 (patch) | |
| tree | 42575d8b2ef5c35a5546154f866c038ceff7b065 /flowgraphnode.cpp | |
| parent | 1eee7293d9a171ba6c2e1e3d33be6d693ac66aee (diff) | |
Add incoming edges for flow graph nodes
Diffstat (limited to 'flowgraphnode.cpp')
| -rw-r--r-- | flowgraphnode.cpp | 31 |
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()); |
