diff --git a/src/app/qt/view/QtGraphView.cpp b/src/app/qt/view/QtGraphView.cpp index 4ab36208..efd2b6e7 100644 --- a/src/app/qt/view/QtGraphView.cpp +++ b/src/app/qt/view/QtGraphView.cpp @@ -6,6 +6,7 @@ #include #include "qt/utility/utilityQt.h" + #include "qt/view/QtViewWidgetWrapper.h" #include "qt/view/graphElements/QtGraphEdge.h" #include "qt/view/graphElements/QtGraphNode.h" diff --git a/src/app/qt/view/QtGraphView.h b/src/app/qt/view/QtGraphView.h index eb1b586c..429f6751 100644 --- a/src/app/qt/view/QtGraphView.h +++ b/src/app/qt/view/QtGraphView.h @@ -1,11 +1,12 @@ #ifndef QT_GRAPH_VIEW_H #define QT_GRAPH_VIEW_H -#include "component/view/GraphView.h" #include "qt/utility/QtThreadedFunctor.h" #include "utility/math/Vector4.h" #include "utility/types.h" +#include "component/view/GraphView.h" + struct DummyEdge; struct DummyNode; class QGraphicsView; diff --git a/src/app/qt/view/graphElements/QtGraphEdge.cpp b/src/app/qt/view/graphElements/QtGraphEdge.cpp index 98b6f13a..d014204e 100644 --- a/src/app/qt/view/graphElements/QtGraphEdge.cpp +++ b/src/app/qt/view/graphElements/QtGraphEdge.cpp @@ -28,6 +28,7 @@ QtGraphEdge::QtGraphEdge(const std::weak_ptr& owner, const std::weak_ blackPen.setWidth(2); this->setPen(blackPen); + this->setZValue(1); // Used to draw edges always on top of nodes. } QtGraphEdge::~QtGraphEdge() diff --git a/src/app/qt/view/graphElements/QtGraphEdge.h b/src/app/qt/view/graphElements/QtGraphEdge.h index ca34a1c2..eabb7413 100644 --- a/src/app/qt/view/graphElements/QtGraphEdge.h +++ b/src/app/qt/view/graphElements/QtGraphEdge.h @@ -5,9 +5,10 @@ #include -#include "component/view/graphElements/GraphEdge.h" #include "utility/messaging/type/MessageActivateToken.h" +#include "component/view/graphElements/GraphEdge.h" + class GraphNode; class QtGraphEdge diff --git a/src/app/qt/view/graphElements/QtGraphNode.cpp b/src/app/qt/view/graphElements/QtGraphNode.cpp index 32fed627..c554e2c2 100644 --- a/src/app/qt/view/graphElements/QtGraphNode.cpp +++ b/src/app/qt/view/graphElements/QtGraphNode.cpp @@ -73,7 +73,7 @@ bool QtGraphNode::addOutEdge(const std::shared_ptr& edge) bool QtGraphNode::addInEdge(const std::weak_ptr& edge) { - for (std::list >::iterator it = m_inEdges.begin(); it != m_inEdges.end(); it++) + for (std::list>::iterator it = m_inEdges.begin(); it != m_inEdges.end(); it++) { std::shared_ptr existingEdge = it->lock(); if (existingEdge != NULL) @@ -92,7 +92,7 @@ bool QtGraphNode::addInEdge(const std::weak_ptr& edge) void QtGraphNode::removeOutEdge(GraphEdge* edge) { - std::list >::iterator it = m_outEdges.begin(); + std::list>::iterator it = m_outEdges.begin(); while (it != m_outEdges.end()) { if ((*it).get() == edge) @@ -105,7 +105,7 @@ void QtGraphNode::removeOutEdge(GraphEdge* edge) } } -std::list > QtGraphNode::getSubNodes() const +std::list> QtGraphNode::getSubNodes() const { return m_subNodes; } @@ -128,12 +128,12 @@ void QtGraphNode::notifyParentMoved() void QtGraphNode::notifyEdgesAfterMove() { - for (std::list >::iterator it = m_outEdges.begin(); it != m_outEdges.end(); it++) + for (std::list>::iterator it = m_outEdges.begin(); it != m_outEdges.end(); it++) { (*it)->ownerMoved(); } - std::list >::iterator it2 = m_inEdges.begin(); + std::list>::iterator it2 = m_inEdges.begin(); while (it2 != m_inEdges.end()) { std::shared_ptr edge = it2->lock(); @@ -148,7 +148,7 @@ void QtGraphNode::notifyEdgesAfterMove() } } - for (std::list >::iterator it3 = m_subNodes.begin(); it3 != m_subNodes.end(); it3++) + for (std::list>::iterator it3 = m_subNodes.begin(); it3 != m_subNodes.end(); it3++) { (*it3)->notifyParentMoved(); } diff --git a/src/app/qt/view/graphElements/QtGraphNode.h b/src/app/qt/view/graphElements/QtGraphNode.h index af37f340..59bb0a92 100644 --- a/src/app/qt/view/graphElements/QtGraphNode.h +++ b/src/app/qt/view/graphElements/QtGraphNode.h @@ -3,9 +3,10 @@ #include -#include "component/view/graphElements/GraphNode.h" -#include "utility/messaging/type/MessageActivateToken.h" #include "utility/math/Vector2.h" +#include "utility/messaging/type/MessageActivateToken.h" + +#include "component/view/graphElements/GraphNode.h" class QtGraphEdge; @@ -26,7 +27,7 @@ public: virtual void removeOutEdge(GraphEdge* edge); - virtual std::list > getSubNodes() const; + virtual std::list> getSubNodes() const; virtual void addSubNode(const std::shared_ptr& node); void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event); @@ -36,13 +37,13 @@ public: protected: void notifyEdgesAfterMove(); - std::list > m_outEdges; - std::list > m_inEdges; + std::list> m_outEdges; + std::list> m_inEdges; private: QGraphicsTextItem* m_text; - std::list > m_subNodes; + std::list> m_subNodes; }; #endif // QT_GRAPH_NODE_H diff --git a/src/lib/component/controller/GraphController.cpp b/src/lib/component/controller/GraphController.cpp index 76a04873..4d01a3a2 100644 --- a/src/lib/component/controller/GraphController.cpp +++ b/src/lib/component/controller/GraphController.cpp @@ -1,12 +1,13 @@ #include "component/controller/GraphController.h" -#include +#include + +#include "utility/logging/logging.h" #include "component/view/graphElements/GraphEdge.h" #include "component/view/graphElements/GraphNode.h" #include "component/view/GraphView.h" #include "data/access/GraphAccess.h" -#include "utility/logging/logging.h" GraphController::GraphController(GraphAccess* graphAccess) : m_graphAccess(graphAccess) @@ -19,12 +20,12 @@ GraphController::~GraphController() void GraphController::handleMessage(MessageActivateToken* message) { - createDummyGraph(message->tokenId, &GraphLayouter::layoutSimpleRing); + createDummyGraphForTokenId(message->tokenId, &GraphLayouter::layoutSimpleRing); } void GraphController::handleMessage(MessageActivateTokens* message) { - createDummyGraph(message->tokenIds[0], &GraphLayouter::layoutSimpleRing); + createDummyGraphForTokenId(message->tokenIds[0], &GraphLayouter::layoutSimpleRing); } GraphView* GraphController::getView() @@ -32,250 +33,76 @@ GraphView* GraphController::getView() return Controller::getView(); } -void GraphController::createDummyGraph(const Id activeId, const LayoutFunction layoutFunction) +void GraphController::createDummyGraphForTokenId(Id tokenId, const GraphLayouter::LayoutFunction layoutFunction) { GraphView* view = getView(); - if (view != NULL) + if (!view) { - std::vector nodes; + LOG_ERROR("GraphController has no associated GraphView"); + return; + } - if (m_graphAccess->checkTokenIsNode(activeId)) + std::vector activeTokenIds; + activeTokenIds.push_back(tokenId); + std::shared_ptr graph = m_graphAccess->getGraphForActiveTokenIds(activeTokenIds); + + std::vector dummyNodes; + std::vector dummyEdges; + std::set addedNodes; + + graph->forEachNode( + [&dummyNodes, &dummyEdges, &addedNodes, this](Node* node) { - nodes.push_back(createDummyNode(activeId)); - std::vector neighbours = createNeighbourNodes(nodes[0]); - nodes.insert(nodes.end(), neighbours.begin(), neighbours.end()); - } - else - { - std::pair nodeIds = m_graphAccess->getNodesOfEdge(activeId); - nodes.push_back(createDummyNode(nodeIds.first)); - nodes.push_back(createDummyNode(nodeIds.second)); - } - - layoutFunction(nodes); - - std::vector edges; - edges = createEdges(nodes); - - view->rebuildGraph(nodes, edges); - } -} - -DummyNode GraphController::createDummyNode(const Id nodeId) -{ - DummyNode result("invalid", 0, Vec2i()); - - Id topLevelId = findTopLevelNode(nodeId); - - result = buildNodeTopDown(topLevelId); - - return result; -} - -Id GraphController::findTopLevelNode(const Id nodeId) -{ - std::vector> memberEdges = m_graphAccess->getMemberEdgesOfNode(nodeId); - - for (unsigned int i = 0; i < memberEdges.size(); i++) - { - if (std::get<0>(memberEdges[i]) != nodeId) - { - return findTopLevelNode(std::get<0>(memberEdges[i])); - } - } - - return nodeId; -} - -DummyNode GraphController::buildNodeTopDown(const Id nodeId) -{ - DummyNode result("invalid", 0, Vec2i()); - - result.name = m_graphAccess->getNameForNodeWithId(nodeId); - result.tokenId = nodeId; - - std::vector> memberEdges = m_graphAccess->getMemberEdgesOfNode(nodeId); - for (unsigned int i = 0; i < memberEdges.size(); i++) - { - if (std::get<1>(memberEdges[i]) != nodeId) - { - result.subNodes.push_back(buildNodeTopDown(std::get<1>(memberEdges[i]))); - } - } - - return result; -} - -std::vector GraphController::createNeighbourNodes(const Id nodeId) -{ - std::vector result; - - std::vector> edges; - std::vector> callEdges = m_graphAccess->getCallEdgesOfNode(nodeId); - std::vector> usageEdges = m_graphAccess->getUsageEdgesOfNode(nodeId); - std::vector> typeOfEdges = m_graphAccess->getTypeOfEdgesOfNode(nodeId); - std::vector> returnTypeEdges = m_graphAccess->getReturnTypeOfEdgesOfNode(nodeId); - std::vector> parameterEdges = m_graphAccess->getParameterOfEdgesOfNode(nodeId); - std::vector> inheritanceEdges = m_graphAccess->getInheritanceEdgesOfNode(nodeId); - - if (callEdges.size() > 0) - { - edges.insert(edges.end(), callEdges.begin(), callEdges.end()); - } - if (usageEdges.size() > 0) - { - edges.insert(edges.end(), usageEdges.begin(), usageEdges.end()); - } - if (typeOfEdges.size() > 0) - { - edges.insert(edges.end(), typeOfEdges.begin(), typeOfEdges.end()); - } - if (returnTypeEdges.size() > 0) - { - edges.insert(edges.end(), returnTypeEdges.begin(), returnTypeEdges.end()); - } - if (parameterEdges.size() > 0) - { - edges.insert(edges.end(), parameterEdges.begin(), parameterEdges.end()); - } - if (inheritanceEdges.size() > 0) - { - edges.insert(edges.end(), inheritanceEdges.begin(), inheritanceEdges.end()); - } - - for (unsigned int i = 0; i < edges.size(); i++) - { - if (std::get<0>(edges[i]) == nodeId) - { - result.push_back(createDummyNode(std::get<1>(edges[i]))); - } - else - { - result.push_back(createDummyNode(std::get<0>(edges[i]))); - } - } - - return result; -} - -std::vector GraphController::createNeighbourNodes(const DummyNode& node) -{ - std::vector result; - - std::set tmpNodes; // to make it easier to keep the nodes unique - - result = createNeighbourNodes(node.tokenId); - for (unsigned int i = 0; i < result.size(); i++) - { - tmpNodes.insert(result[i]); - } - - for (unsigned int i = 0; i < node.subNodes.size(); i++) - { - std::vector tmpNeighbours = createNeighbourNodes(node.subNodes[i].tokenId); - for (unsigned int j = 0; j < tmpNeighbours.size(); j++) - { - tmpNodes.insert(tmpNeighbours[j]); - } - } - - result.clear(); - - for (std::set::iterator it = tmpNodes.begin(); it != tmpNodes.end(); it++) - { - result.push_back(*it); - } - - return result; -} - -std::vector GraphController::createEdges(const std::vector& nodes) -{ - std::vector result; - - std::unordered_set nodeIds; // to help discard edges that point to non-existing nodes in the sub-graph - std::queue nodeQueue; - for (unsigned int i = 0; i < nodes.size(); i++) - { - nodeQueue.push(nodes[i]); - } - - while (nodeQueue.size() > 0) - { - DummyNode n = nodeQueue.front(); - nodeQueue.pop(); - - for (unsigned int i = 0; i < n.subNodes.size(); i++) - { - nodeQueue.push(n.subNodes[i]); - } - - nodeIds.insert(n.tokenId); - } - - std::set tmpEdges; // to make it easier to keep the edges unique - for (unsigned int i = 0; i < nodes.size(); i++) - { - std::set tmp = getNeighbourEdgesOfNode(nodes[i]); - - for (std::set::iterator it = tmp.begin(); it != tmp.end(); it++) - { - if (nodeIds.find(it->ownerId) != nodeIds.end() && nodeIds.find(it->targetId) != nodeIds.end()) + Node* parent = node->getLastParentNode(); + Id id = parent->getId(); + if (addedNodes.find(id) != addedNodes.end()) { - tmpEdges.insert(tmp.begin(), tmp.end()); + return; } + addedNodes.insert(id); + + dummyNodes.push_back(createDummyNodeTopDown(parent, &dummyEdges)); } - } + ); - for (std::set::iterator it = tmpEdges.begin(); it != tmpEdges.end(); it++) - { - result.push_back(*it); - } - - return result; + layoutFunction(dummyNodes); + view->rebuildGraph(dummyNodes, dummyEdges); } -std::set GraphController::getNeighbourEdgesOfNode(const DummyNode& node) +DummyNode GraphController::createDummyNodeTopDown(Node* node, std::vector* dummyEdges) const { - std::set result; + DummyNode result("invalid", 0, Vec2i()); - std::vector> callEdges = m_graphAccess->getCallEdgesOfNode(node.tokenId); - std::vector> usageEdges = m_graphAccess->getUsageEdgesOfNode(node.tokenId); - std::vector> typeOfEdges = m_graphAccess->getTypeOfEdgesOfNode(node.tokenId); - std::vector> returnTypeEdges = m_graphAccess->getReturnTypeOfEdgesOfNode(node.tokenId); - std::vector> parameterEdges = m_graphAccess->getParameterOfEdgesOfNode(node.tokenId); - std::vector> inheritanceEdges = m_graphAccess->getInheritanceEdgesOfNode(node.tokenId); + result.name = node->getName(); + result.tokenId = node->getId(); - for (unsigned int i = 0; i < callEdges.size(); i++) - { - result.insert(DummyEdge(std::get<0>(callEdges[i]), std::get<1>(callEdges[i]), std::get<2>(callEdges[i]), Edge::EDGE_CALL)); - } - for (unsigned int i = 0; i < usageEdges.size(); i++) - { - result.insert(DummyEdge(std::get<0>(usageEdges[i]), std::get<1>(usageEdges[i]), std::get<2>(usageEdges[i]), Edge::EDGE_USAGE)); - } - for (unsigned int i = 0; i < typeOfEdges.size(); i++) - { - result.insert(DummyEdge(std::get<0>(typeOfEdges[i]), std::get<1>(typeOfEdges[i]), std::get<2>(typeOfEdges[i]), Edge::EDGE_TYPE_OF)); - } - for (unsigned int i = 0; i < returnTypeEdges.size(); i++) - { - result.insert(DummyEdge(std::get<0>(returnTypeEdges[i]), std::get<1>(returnTypeEdges[i]), std::get<2>(returnTypeEdges[i]), Edge::EDGE_RETURN_TYPE_OF)); - } - for (unsigned int i = 0; i < parameterEdges.size(); i++) - { - result.insert(DummyEdge(std::get<0>(parameterEdges[i]), std::get<1>(parameterEdges[i]), std::get<2>(parameterEdges[i]), Edge::EDGE_PARAMETER_TYPE_OF)); - } - for (unsigned int i = 0; i < inheritanceEdges.size(); i++) - { - result.insert(DummyEdge(std::get<0>(inheritanceEdges[i]), std::get<1>(inheritanceEdges[i]), std::get<2>(inheritanceEdges[i]), Edge::EDGE_INHERITANCE)); - } + node->forEachChildNode( + [&result, dummyEdges, this](Node* child) + { + result.subNodes.push_back(createDummyNodeTopDown(child, dummyEdges)); + } + ); - for (unsigned int i = 0; i < node.subNodes.size(); i++) - { - std::set tmpNeighbours = getNeighbourEdgesOfNode(node.subNodes[i]); - result.insert(tmpNeighbours.begin(), tmpNeighbours.end()); - } + node->forEachEdge( + [&result, node, dummyEdges](Edge* edge) + { + if (edge->isType(Edge::EDGE_MEMBER)) + { + return; + } + + for (const DummyEdge& dummy : *dummyEdges) + { + if (dummy.tokenId == edge->getId()) + { + return; + } + } + + dummyEdges->push_back( + DummyEdge(edge->getFrom()->getId(), edge->getTo()->getId(), edge->getId(), edge->getType())); + } + ); return result; } diff --git a/src/lib/component/controller/GraphController.h b/src/lib/component/controller/GraphController.h index 911879a1..1d5e1db1 100644 --- a/src/lib/component/controller/GraphController.h +++ b/src/lib/component/controller/GraphController.h @@ -1,19 +1,20 @@ #ifndef GRAPH_CONTROLLER_H #define GRAPH_CONTROLLER_H -#include #include -#include "component/controller/Controller.h" -#include "component/controller/GraphLayouter.h" #include "utility/messaging/MessageListener.h" #include "utility/messaging/type/MessageActivateToken.h" #include "utility/messaging/type/MessageActivateTokens.h" +#include "component/controller/Controller.h" +#include "component/controller/GraphLayouter.h" + struct DummyNode; struct DummyEdge; class GraphView; class GraphAccess; +class Node; class GraphController : public Controller @@ -29,17 +30,9 @@ private: virtual void handleMessage(MessageActivateTokens* message); GraphView* getView(); - void createDummyGraph(const Id activeId, const LayoutFunction layoutFunction); - DummyNode createDummyNode(const Id nodeId); - Id findTopLevelNode(const Id nodeId); - DummyNode buildNodeTopDown(const Id nodeId); - - std::vector createNeighbourNodes(const Id nodeId); - std::vector createNeighbourNodes(const DummyNode& node); - - std::vector createEdges(const std::vector& nodes); - std::set getNeighbourEdgesOfNode(const DummyNode& node); + void createDummyGraphForTokenId(Id tokenId, const GraphLayouter::LayoutFunction layoutFunction); + DummyNode createDummyNodeTopDown(Node* node, std::vector* dummyEdges) const; GraphAccess* m_graphAccess; }; diff --git a/src/lib/component/controller/GraphLayouter.h b/src/lib/component/controller/GraphLayouter.h index 9fa3be30..7fe06526 100644 --- a/src/lib/component/controller/GraphLayouter.h +++ b/src/lib/component/controller/GraphLayouter.h @@ -5,11 +5,11 @@ struct DummyNode; -typedef void (*LayoutFunction)(std::vector&); - class GraphLayouter { public: + typedef void (*LayoutFunction)(std::vector&); + static void layoutSimpleRaster(std::vector& nodes); static void layoutSimpleRing(std::vector& nodes); }; diff --git a/src/lib/data/Storage.cpp b/src/lib/data/Storage.cpp index 05543395..daa7fef7 100644 --- a/src/lib/data/Storage.cpp +++ b/src/lib/data/Storage.cpp @@ -347,127 +347,39 @@ std::vector Storage::getNamesForNodesWithNamePrefix(const std::stri return names; } -std::vector Storage::getIdsOfNeighbours(const Id id) const +std::shared_ptr Storage::getGraphForActiveTokenIds(const std::vector& tokenIds) const { - std::vector result; + std::shared_ptr graph = std::make_shared(); - Node* node = m_graph.findNode([&](Node* node){ - return node->getId() == id; - }); - - if (node != NULL) + for (Id tokenId : tokenIds) { - std::map addedIds; - addedIds[id] = true; + Token* token = m_graph.getTokenById(tokenId); + if (!token) + { + LOG_ERROR_STREAM(<< "Token with id " << tokenId << " was not found"); + continue; + } - node->forEachEdge( - [&result, &addedIds](Edge* e) + if (token->isNode()) + { + Node* node = dynamic_cast(token); + graph->addNodeAndAllChildrenAsPlainCopy(node->getLastParentNode()); + + node->forEachEdge( + [graph](Edge* edge) { - Id fromId = e->getFrom()->getId(); - if (addedIds.find(fromId) == addedIds.end()) - { - result.push_back(fromId); - addedIds[fromId] = true; - } - - Id toId = e->getTo()->getId(); - if (addedIds.find(toId) == addedIds.end()) - { - result.push_back(toId); - addedIds[toId] = true; - } + graph->addEdgeAndAllChildrenAsPlainCopy(edge); } ); + } + else + { + Edge* edge = dynamic_cast(token); + graph->addEdgeAndAllChildrenAsPlainCopy(edge); + } } - return result; -} - -std::vector> Storage::getNeighbourEdgesOfNode(const Id id) const -{ - std::vector> result; - - Node* node = m_graph.findNode([&](Node* node){ - return node->getId() == id; - }); - - if (node != NULL) - { - node->forEachEdge( - [&result](Edge* e) - { - result.push_back(std::tuple(e->getFrom()->getId(), e->getTo()->getId(), e->getId())); - } - ); - } - - return result; -} - -std::vector> Storage::getMemberEdgesOfNode(const Id id) const -{ - return getEdgesOfTypeOfNode(id, Edge::EdgeType::EDGE_MEMBER); -} - -std::vector> Storage::getUsageEdgesOfNode(const Id id) const -{ - return getEdgesOfTypeOfNode(id, Edge::EdgeType::EDGE_USAGE); -} - -std::vector> Storage::getCallEdgesOfNode(const Id id) const -{ - return getEdgesOfTypeOfNode(id, Edge::EdgeType::EDGE_CALL); -} - -std::vector> Storage::getTypeOfEdgesOfNode(const Id id) const -{ - return getEdgesOfTypeOfNode(id, Edge::EdgeType::EDGE_TYPE_OF); -} - -std::vector> Storage::getReturnTypeOfEdgesOfNode(const Id id) const -{ - return getEdgesOfTypeOfNode(id, Edge::EdgeType::EDGE_RETURN_TYPE_OF); -} - -std::vector> Storage::getParameterOfEdgesOfNode(const Id id) const -{ - return getEdgesOfTypeOfNode(id, Edge::EdgeType::EDGE_PARAMETER_TYPE_OF); -} - -std::vector> Storage::getInheritanceEdgesOfNode(const Id id) const -{ - return getEdgesOfTypeOfNode(id, Edge::EdgeType::EDGE_INHERITANCE); -} - -std::pair Storage::getNodesOfEdge(const Id id) const -{ - std::pair result; - - Edge* edge = m_graph.findEdge([&](Edge* edge){ - return edge->getId() == id; - }); - - if(edge != NULL) - { - result.first = edge->getFrom()->getId(); - result.second = edge->getTo()->getId(); - } - - return result; -} - -bool Storage::checkTokenIsNode(const Id id) const -{ - Token* token = m_graph.findToken([&](Token* token){ - return token->getId() == id; - }); - - if(token != NULL) - { - return token->isNode(); - } - - return false; + return graph; } std::vector Storage::getActiveTokenIdsForId(Id tokenId) const @@ -790,27 +702,3 @@ void Storage::log(std::string type, std::string str, const ParseLocation& locati << location.endLineNumber << ":" << location.endColumnNumber << ">" ); } - -std::vector> Storage::getEdgesOfTypeOfNode(const Id id, const Edge::EdgeType type) const -{ - std::vector> result; - - Node* node = m_graph.findNode([&](Node* node){ - return node->getId() == id; - }); - - if (node != NULL) - { - node->forEachEdge( - [&result, &type](Edge* e) - { - if(e->getType() == type) - { - result.push_back(std::tuple(e->getFrom()->getId(), e->getTo()->getId(), e->getId())); - } - } - ); - } - - return result; -} diff --git a/src/lib/data/Storage.h b/src/lib/data/Storage.h index 0307ebfa..eb3033c2 100644 --- a/src/lib/data/Storage.h +++ b/src/lib/data/Storage.h @@ -68,19 +68,8 @@ public: virtual Id getIdForNodeWithName(const std::string& fullName) const; virtual std::string getNameForNodeWithId(Id id) const; virtual std::vector getNamesForNodesWithNamePrefix(const std::string& prefix) const; - virtual std::vector getIdsOfNeighbours(const Id id) const; - virtual std::vector> getNeighbourEdgesOfNode(const Id id) const; - virtual std::vector> getMemberEdgesOfNode(const Id id) const; - virtual std::vector> getUsageEdgesOfNode(const Id id) const; - virtual std::vector> getCallEdgesOfNode(const Id id) const; - virtual std::vector> getTypeOfEdgesOfNode(const Id id) const; - virtual std::vector> getReturnTypeOfEdgesOfNode(const Id id) const; - virtual std::vector> getParameterOfEdgesOfNode(const Id id) const; - virtual std::vector> getInheritanceEdgesOfNode(const Id id) const; - virtual std::pair getNodesOfEdge(const Id id) const; - - virtual bool checkTokenIsNode(const Id id) const; + virtual std::shared_ptr getGraphForActiveTokenIds(const std::vector& tokenIds) const; virtual std::vector getActiveTokenIdsForId(Id tokenId) const; virtual std::vector getLocationIdsForTokenIds(const std::vector& tokenIds) const; @@ -117,8 +106,6 @@ private: void log(std::string type, std::string str, const ParseLocation& location) const; - std::vector> getEdgesOfTypeOfNode(const Id id, const Edge::EdgeType type) const; - StorageGraph m_graph; TokenLocationCollection m_locationCollection; SearchIndex m_index; diff --git a/src/lib/data/access/GraphAccess.h b/src/lib/data/access/GraphAccess.h index cea69920..fa0210c6 100644 --- a/src/lib/data/access/GraphAccess.h +++ b/src/lib/data/access/GraphAccess.h @@ -1,14 +1,13 @@ #ifndef GRAPH_ACCESS_H #define GRAPH_ACCESS_H +#include #include #include +#include "data/graph/Graph.h" #include "utility/types.h" -class Edge; -class Token; - class GraphAccess { public: @@ -17,19 +16,8 @@ public: virtual Id getIdForNodeWithName(const std::string& name) const = 0; virtual std::string getNameForNodeWithId(Id id) const = 0; virtual std::vector getNamesForNodesWithNamePrefix(const std::string& prefix) const = 0; - virtual std::vector getIdsOfNeighbours(const Id id) const = 0; - virtual std::vector> getNeighbourEdgesOfNode(const Id id) const = 0; - virtual std::vector> getMemberEdgesOfNode(const Id id) const = 0; - virtual std::vector> getUsageEdgesOfNode(const Id id) const = 0; - virtual std::vector> getCallEdgesOfNode(const Id id) const = 0; - virtual std::vector> getTypeOfEdgesOfNode(const Id id) const = 0; - virtual std::vector> getReturnTypeOfEdgesOfNode(const Id id) const = 0; - virtual std::vector> getParameterOfEdgesOfNode(const Id id) const = 0; - virtual std::vector> getInheritanceEdgesOfNode(const Id id) const = 0; - virtual std::pair getNodesOfEdge(const Id id) const = 0; - - virtual bool checkTokenIsNode(const Id id) const = 0; + virtual std::shared_ptr getGraphForActiveTokenIds(const std::vector& tokenIds) const = 0; virtual std::vector getActiveTokenIdsForId(Id tokenId) const = 0; virtual std::vector getLocationIdsForTokenIds(const std::vector& tokenIds) const = 0; diff --git a/src/lib/data/access/GraphAccessProxy.cpp b/src/lib/data/access/GraphAccessProxy.cpp index 102ba168..3fd1405e 100644 --- a/src/lib/data/access/GraphAccessProxy.cpp +++ b/src/lib/data/access/GraphAccessProxy.cpp @@ -57,114 +57,14 @@ std::vector GraphAccessProxy::getNamesForNodesWithNamePrefix(const return std::vector(); } -std::vector GraphAccessProxy::getIdsOfNeighbours(const Id id) const +std::shared_ptr GraphAccessProxy::getGraphForActiveTokenIds(const std::vector& tokenIds) const { if (hasSubject()) { - return m_subject->getIdsOfNeighbours(id); + return m_subject->getGraphForActiveTokenIds(tokenIds); } - return std::vector(); -} - -std::vector> GraphAccessProxy::getNeighbourEdgesOfNode(const Id id) const -{ - if (hasSubject()) - { - return m_subject->getNeighbourEdgesOfNode(id); - } - - return std::vector>(); -} - -std::vector> GraphAccessProxy::getMemberEdgesOfNode(const Id id) const -{ - if (hasSubject()) - { - return m_subject->getMemberEdgesOfNode(id); - } - - return std::vector>(); -} - -std::vector> GraphAccessProxy::getUsageEdgesOfNode(const Id id) const -{ - if (hasSubject()) - { - return m_subject->getUsageEdgesOfNode(id); - } - - return std::vector>(); -} - -std::vector> GraphAccessProxy::getCallEdgesOfNode(const Id id) const -{ - if (hasSubject()) - { - return m_subject->getCallEdgesOfNode(id); - } - - return std::vector>(); -} - -std::vector> GraphAccessProxy::getTypeOfEdgesOfNode(const Id id) const -{ - if (hasSubject()) - { - return m_subject->getTypeOfEdgesOfNode(id); - } - - return std::vector>(); -} - -std::vector> GraphAccessProxy::getReturnTypeOfEdgesOfNode(const Id id) const -{ - if (hasSubject()) - { - return m_subject->getReturnTypeOfEdgesOfNode(id); - } - - return std::vector>(); -} - -std::vector> GraphAccessProxy::getParameterOfEdgesOfNode(const Id id) const -{ - if (hasSubject()) - { - return m_subject->getParameterOfEdgesOfNode(id); - } - - return std::vector>(); -} - -std::vector> GraphAccessProxy::getInheritanceEdgesOfNode(const Id id) const -{ - if (hasSubject()) - { - return m_subject->getInheritanceEdgesOfNode(id); - } - - return std::vector>(); -} - -std::pair GraphAccessProxy::getNodesOfEdge(const Id id) const -{ - if (hasSubject()) - { - return m_subject->getNodesOfEdge(id); - } - - return std::pair(); -} - -bool GraphAccessProxy::checkTokenIsNode(const Id id) const -{ - if (hasSubject()) - { - return m_subject->checkTokenIsNode(id); - } - - return false; + return std::make_shared(); } std::vector GraphAccessProxy::getActiveTokenIdsForId(Id tokenId) const diff --git a/src/lib/data/access/GraphAccessProxy.h b/src/lib/data/access/GraphAccessProxy.h index fe5e20e5..98fcd4f4 100644 --- a/src/lib/data/access/GraphAccessProxy.h +++ b/src/lib/data/access/GraphAccessProxy.h @@ -16,19 +16,8 @@ public: virtual Id getIdForNodeWithName(const std::string& name) const; virtual std::string getNameForNodeWithId(Id id) const; virtual std::vector getNamesForNodesWithNamePrefix(const std::string& prefix) const; - virtual std::vector getIdsOfNeighbours(const Id id) const; - virtual std::vector> getNeighbourEdgesOfNode(const Id id) const; - virtual std::vector> getMemberEdgesOfNode(const Id id) const; - virtual std::vector> getUsageEdgesOfNode(const Id id) const; - virtual std::vector> getCallEdgesOfNode(const Id id) const; - virtual std::vector> getTypeOfEdgesOfNode(const Id id) const; - virtual std::vector> getReturnTypeOfEdgesOfNode(const Id id) const; - virtual std::vector> getParameterOfEdgesOfNode(const Id id) const; - virtual std::vector> getInheritanceEdgesOfNode(const Id id) const; - virtual std::pair getNodesOfEdge(const Id id) const; - - virtual bool checkTokenIsNode(const Id id) const; + virtual std::shared_ptr getGraphForActiveTokenIds(const std::vector& tokenIds) const; virtual std::vector getActiveTokenIdsForId(Id tokenId) const; virtual std::vector getLocationIdsForTokenIds(const std::vector& tokenIds) const; diff --git a/src/lib/data/graph/Graph.cpp b/src/lib/data/graph/Graph.cpp index abfd3aef..b4f85831 100644 --- a/src/lib/data/graph/Graph.cpp +++ b/src/lib/data/graph/Graph.cpp @@ -244,6 +244,32 @@ Edge* Graph::addEdgeAsPlainCopy(Edge* edge) return copy.get(); } +Node* Graph::addNodeAndAllChildrenAsPlainCopy(Node* node) +{ + Node* n = addNodeAsPlainCopy(node); + + node->forEachEdgeOfType(Edge::EDGE_MEMBER, + [node, this](Edge* edge) + { + if (edge->getFrom() == node) + { + addEdgeAsPlainCopy(edge); + addNodeAndAllChildrenAsPlainCopy(edge->getTo()); + } + } + ); + + return n; +} + +Edge* Graph::addEdgeAndAllChildrenAsPlainCopy(Edge* edge) +{ + addNodeAndAllChildrenAsPlainCopy(edge->getFrom()->getLastParentNode()); + addNodeAndAllChildrenAsPlainCopy(edge->getTo()->getLastParentNode()); + + return addEdgeAsPlainCopy(edge); +} + void Graph::removeEdgeInternal(Edge* edge) { std::map >::const_iterator it = m_edges.find(edge->getId()); diff --git a/src/lib/data/graph/Graph.h b/src/lib/data/graph/Graph.h index ac8363f9..147a8fc6 100644 --- a/src/lib/data/graph/Graph.h +++ b/src/lib/data/graph/Graph.h @@ -49,6 +49,9 @@ public: Node* addNodeAsPlainCopy(Node* node); Edge* addEdgeAsPlainCopy(Edge* edge); + Node* addNodeAndAllChildrenAsPlainCopy(Node* node); + Edge* addEdgeAndAllChildrenAsPlainCopy(Edge* edge); + protected: std::map> m_nodes; std::map> m_edges; diff --git a/src/lib/data/graph/Node.cpp b/src/lib/data/graph/Node.cpp index f6b82ddc..c9c23932 100644 --- a/src/lib/data/graph/Node.cpp +++ b/src/lib/data/graph/Node.cpp @@ -89,6 +89,16 @@ Node* Node::getParentNode() const return nullptr; } +Node* Node::getLastParentNode() +{ + Node* parent = getParentNode(); + if (parent) + { + return parent->getLastParentNode(); + } + return this; +} + Edge* Node::getMemberEdge() const { return findEdgeOfType(Edge::EDGE_MEMBER, @@ -179,9 +189,12 @@ void Node::forEachEdgeOfType(Edge::EdgeType type, std::function fun void Node::forEachChildNode(std::function func) const { forEachEdgeOfType(Edge::EDGE_MEMBER, - [func](Edge* e) + [func, this](Edge* e) { - func(e->getTo()); + if (this != e->getTo()) + { + func(e->getTo()); + } } ); } diff --git a/src/lib/data/graph/Node.h b/src/lib/data/graph/Node.h index 890c1fc1..d6a1abb5 100644 --- a/src/lib/data/graph/Node.h +++ b/src/lib/data/graph/Node.h @@ -54,6 +54,7 @@ public: void removeEdge(Edge* edge); Node* getParentNode() const; + Node* getLastParentNode(); Edge* getMemberEdge() const; Edge* findEdge(std::function func) const;