From 391082160c12daf477ef23fc24f69a03bafa2df0 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Wed, 23 Sep 2015 12:45:58 +0200 Subject: [PATCH] data: saving NameHierarchy directly to Node without TokenComponentName --- src/lib/CMakeLists.txt | 2 - src/lib/data/Storage.cpp | 3 +- src/lib/data/graph/Graph.cpp | 4 +- src/lib/data/graph/Graph.h | 2 +- src/lib/data/graph/Node.cpp | 21 ++--- src/lib/data/graph/Node.h | 9 +- .../token_component/TokenComponentName.cpp | 85 ------------------- .../token_component/TokenComponentName.h | 64 -------------- src/lib/data/name/NameElement.cpp | 2 +- src/lib/data/name/NameElement.h | 2 +- src/lib/data/name/NameHierarchy.cpp | 15 ++++ src/lib/data/name/NameHierarchy.h | 2 + src/test/GraphTestSuite.h | 77 +++++++++-------- 13 files changed, 69 insertions(+), 219 deletions(-) delete mode 100644 src/lib/data/graph/token_component/TokenComponentName.cpp delete mode 100644 src/lib/data/graph/token_component/TokenComponentName.h diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 331c0f03..5707b0c8 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -113,8 +113,6 @@ add_files( data/graph/token_component/TokenComponentConst.h data/graph/token_component/TokenComponentFilePath.cpp data/graph/token_component/TokenComponentFilePath.h - data/graph/token_component/TokenComponentName.cpp - data/graph/token_component/TokenComponentName.h data/graph/token_component/TokenComponentStatic.cpp data/graph/token_component/TokenComponentStatic.h diff --git a/src/lib/data/Storage.cpp b/src/lib/data/Storage.cpp index 465e4fb7..b517b2c2 100644 --- a/src/lib/data/Storage.cpp +++ b/src/lib/data/Storage.cpp @@ -9,7 +9,6 @@ #include "utility/utilityString.h" #include "data/graph/token_component/TokenComponentAggregation.h" -#include "data/graph/token_component/TokenComponentName.h" #include "data/graph/Graph.h" #include "data/location/TokenLocation.h" #include "data/location/TokenLocationFile.h" @@ -1442,7 +1441,7 @@ Node* Storage::addNodeToGraph(const Id nodeId, Graph* graph) const node = graph->createNode( storageNode.id, Node::intToType(storageNode.type), - std::make_shared(m_tokenIndex.getNameHierarchyForTokenId(nodeId)) + m_tokenIndex.getNameHierarchyForTokenId(nodeId) ); } diff --git a/src/lib/data/graph/Graph.cpp b/src/lib/data/graph/Graph.cpp index 2b8c24a0..8477052e 100644 --- a/src/lib/data/graph/Graph.cpp +++ b/src/lib/data/graph/Graph.cpp @@ -40,7 +40,7 @@ void Graph::forEachToken(std::function func) const forEachEdge(func); } -Node* Graph::createNode(Id id, Node::NodeType type, std::shared_ptr nameComponent) +Node* Graph::createNode(Id id, Node::NodeType type, NameHierarchy nameHierarchy) { Node* n = getNodeById(id); if (n) @@ -48,7 +48,7 @@ Node* Graph::createNode(Id id, Node::NodeType type, std::shared_ptr node = std::make_shared(id, type, nameComponent); + std::shared_ptr node = std::make_shared(id, type, nameHierarchy); m_nodes.emplace(node->getId(), node); return node.get(); } diff --git a/src/lib/data/graph/Graph.h b/src/lib/data/graph/Graph.h index e4ca0647..504744cf 100644 --- a/src/lib/data/graph/Graph.h +++ b/src/lib/data/graph/Graph.h @@ -20,7 +20,7 @@ public: void forEachEdge(std::function func) const; void forEachToken(std::function func) const; - Node* createNode(Id id, Node::NodeType type, std::shared_ptr nameComponent); + Node* createNode(Id id, Node::NodeType type, NameHierarchy nameHierarchy); Edge* createEdge(Id id, Edge::EdgeType type, Node* from, Node* to); size_t getNodeCount() const; diff --git a/src/lib/data/graph/Node.cpp b/src/lib/data/graph/Node.cpp index 99d18b8c..cce1a625 100644 --- a/src/lib/data/graph/Node.cpp +++ b/src/lib/data/graph/Node.cpp @@ -6,7 +6,6 @@ #include "data/graph/token_component/TokenComponentAbstraction.h" #include "data/graph/token_component/TokenComponentConst.h" -#include "data/graph/token_component/TokenComponentName.h" #include "data/graph/token_component/TokenComponentStatic.h" #include "data/graph/token_component/TokenComponentFilePath.h" @@ -97,17 +96,17 @@ Node::NodeType Node::intToType(int value) return NODE_UNDEFINED; } -Node::Node(Id id, NodeType type, std::shared_ptr nameComponent) +Node::Node(Id id, NodeType type, NameHierarchy nameHierarchy) : Token(id) , m_type(type) - , m_nameComponent(nameComponent) + , m_nameHierarchy(nameHierarchy) { } Node::Node(const Node& other) : Token(other) , m_type(other.m_type) - , m_nameComponent(other.m_nameComponent->copyComponentName()) + , m_nameHierarchy(other.m_nameHierarchy) { } @@ -139,22 +138,12 @@ bool Node::isType(NodeTypeMask mask) const std::string Node::getName() const { - return m_nameComponent->getName(); + return m_nameHierarchy.getName(); } std::string Node::getFullName() const { - return m_nameComponent->getFullName(); -} - -const TokenComponentName* Node::getTokenComponentName() const -{ - if (m_nameComponent) - { - return m_nameComponent.get(); - } - - return nullptr; + return m_nameHierarchy.getFullName(); } const std::vector& Node::getEdges() const diff --git a/src/lib/data/graph/Node.h b/src/lib/data/graph/Node.h index 1987045a..cfaa16f6 100644 --- a/src/lib/data/graph/Node.h +++ b/src/lib/data/graph/Node.h @@ -8,12 +8,11 @@ #include "data/graph/Edge.h" #include "data/graph/Token.h" +#include "data/name/NameHierarchy.h" class TokenComponentAbstraction; class TokenComponentConst; -class TokenComponentName; class TokenComponentStatic; -class TokenComponentSignature; class TokenComponentFilePath; class Node @@ -50,7 +49,7 @@ public: static const NodeTypeMask NODE_NOT_VISIBLE; - Node(Id id, NodeType type, std::shared_ptr nameComponent); + Node(Id id, NodeType type, NameHierarchy nameHierarchy); Node(const Node& other); virtual ~Node(); @@ -60,7 +59,6 @@ public: std::string getName() const; std::string getFullName() const; - const TokenComponentName* getTokenComponentName() const; const std::vector& getEdges() const; @@ -90,7 +88,6 @@ public: void addComponentAbstraction(std::shared_ptr component); void addComponentConst(std::shared_ptr component); void addComponentStatic(std::shared_ptr component); - void addComponentSignature(std::shared_ptr component); void addComponentFilePath(std::shared_ptr component); // Logging. @@ -103,7 +100,7 @@ private: std::vector m_edges; NodeType m_type; - std::shared_ptr m_nameComponent; + NameHierarchy m_nameHierarchy; }; std::ostream& operator<<(std::ostream& ostream, const Node& node); diff --git a/src/lib/data/graph/token_component/TokenComponentName.cpp b/src/lib/data/graph/token_component/TokenComponentName.cpp deleted file mode 100644 index 4fec71d9..00000000 --- a/src/lib/data/graph/token_component/TokenComponentName.cpp +++ /dev/null @@ -1,85 +0,0 @@ -#include "data/graph/token_component/TokenComponentName.h" - -#include "utility/utilityString.h" - -#include "data/search/SearchIndex.h" - -TokenComponentName::TokenComponentName() -{ -} - -TokenComponentName::~TokenComponentName() -{ -} - -std::shared_ptr TokenComponentName::copyComponentName() const -{ - return std::dynamic_pointer_cast(copy()); -} - - -TokenComponentNameReferenced::TokenComponentNameReferenced(const SearchNode* searchNode) - : m_searchNode(searchNode) -{ -} - -TokenComponentNameReferenced::~TokenComponentNameReferenced() -{ -} - -std::shared_ptr TokenComponentNameReferenced::copy() const -{ - return std::make_shared(m_searchNode->getNameHierarchy()); -} - -std::string TokenComponentNameReferenced::getName() const -{ - return m_searchNode->getName(); -} - -std::string TokenComponentNameReferenced::getFullName() const -{ - return m_searchNode->getFullName(); -} - -const SearchNode* TokenComponentNameReferenced::getSearchNode() const -{ - return m_searchNode; -} - -TokenComponentNameCached::TokenComponentNameCached(const std::vector& nameHierarchy) - : m_nameHierarchy(nameHierarchy) -{ -} - -TokenComponentNameCached::TokenComponentNameCached(const NameHierarchy& nameHierarchy) -{ - for (size_t i = 0; i < nameHierarchy.size(); i++) - { - m_nameHierarchy.push_back(nameHierarchy[i]->getFullName()); - } -} - -TokenComponentNameCached::~TokenComponentNameCached() -{ -} - -std::shared_ptr TokenComponentNameCached::copy() const -{ - return std::make_shared(m_nameHierarchy); -} - -std::string TokenComponentNameCached::getName() const -{ - return m_nameHierarchy.back(); -} - -std::string TokenComponentNameCached::getFullName() const -{ - return utility::join(m_nameHierarchy, "::"); -} - -const SearchNode* TokenComponentNameCached::getSearchNode() const -{ - return nullptr; -} diff --git a/src/lib/data/graph/token_component/TokenComponentName.h b/src/lib/data/graph/token_component/TokenComponentName.h deleted file mode 100644 index ada0b878..00000000 --- a/src/lib/data/graph/token_component/TokenComponentName.h +++ /dev/null @@ -1,64 +0,0 @@ -#ifndef TOKEN_COMPONENT_NAME_H -#define TOKEN_COMPONENT_NAME_H - -#include - -#include "data/graph/token_component/TokenComponent.h" -#include "data/name/NameHierarchy.h" -#include "data/search/SearchNode.h" - -class TokenComponentName - : public TokenComponent -{ -public: - TokenComponentName(); - virtual ~TokenComponentName(); - - std::shared_ptr copyComponentName() const; - - virtual std::string getName() const = 0; - virtual std::string getFullName() const = 0; - - virtual const SearchNode* getSearchNode() const = 0; -}; - - -class TokenComponentNameReferenced - : public TokenComponentName -{ -public: - TokenComponentNameReferenced(const SearchNode* searchNode); - virtual ~TokenComponentNameReferenced(); - - virtual std::shared_ptr copy() const; - - virtual std::string getName() const; - virtual std::string getFullName() const; - - virtual const SearchNode* getSearchNode() const; - -private: - const SearchNode* m_searchNode; -}; - - -class TokenComponentNameCached - : public TokenComponentName -{ -public: - TokenComponentNameCached(const std::vector& nameHierarchy); - TokenComponentNameCached(const NameHierarchy& nameHierarchy); - virtual ~TokenComponentNameCached(); - - virtual std::shared_ptr copy() const; - - virtual std::string getName() const; - virtual std::string getFullName() const; - - virtual const SearchNode* getSearchNode() const; - -private: - std::vector m_nameHierarchy; // TODO: use const NameHierarchy here -}; - -#endif // TOKEN_COMPONENT_NAME_H diff --git a/src/lib/data/name/NameElement.cpp b/src/lib/data/name/NameElement.cpp index d37fa833..482f664d 100644 --- a/src/lib/data/name/NameElement.cpp +++ b/src/lib/data/name/NameElement.cpp @@ -1,6 +1,6 @@ #include "data/name/NameElement.h" -NameElement::NameElement(std::string name) +NameElement::NameElement(const std::string& name) : m_name(name) { } diff --git a/src/lib/data/name/NameElement.h b/src/lib/data/name/NameElement.h index a633dded..c4acb46d 100644 --- a/src/lib/data/name/NameElement.h +++ b/src/lib/data/name/NameElement.h @@ -6,7 +6,7 @@ class NameElement { public: - NameElement(std::string name); + NameElement(const std::string& name); ~NameElement(); std::string getFullName() const; diff --git a/src/lib/data/name/NameHierarchy.cpp b/src/lib/data/name/NameHierarchy.cpp index 957f7a70..011d6036 100644 --- a/src/lib/data/name/NameHierarchy.cpp +++ b/src/lib/data/name/NameHierarchy.cpp @@ -4,6 +4,11 @@ NameHierarchy::NameHierarchy() { } +NameHierarchy::NameHierarchy(const std::string& name) +{ + push(std::make_shared(name)); +} + NameHierarchy::~NameHierarchy() { } @@ -46,3 +51,13 @@ std::string NameHierarchy::getFullName() const } return name; } + +std::string NameHierarchy::getName() const +{ + if (m_elements.size()) + { + return m_elements.back()->getFullName(); + } + + return ""; +} diff --git a/src/lib/data/name/NameHierarchy.h b/src/lib/data/name/NameHierarchy.h index f3d77a09..72a96e89 100644 --- a/src/lib/data/name/NameHierarchy.h +++ b/src/lib/data/name/NameHierarchy.h @@ -11,6 +11,7 @@ class NameHierarchy { public: NameHierarchy(); + NameHierarchy(const std::string& name); ~NameHierarchy(); void push(std::shared_ptr element); @@ -20,6 +21,7 @@ public: size_t size() const; std::string getFullName() const; + std::string getName() const; private: std::vector> m_elements; diff --git a/src/test/GraphTestSuite.h b/src/test/GraphTestSuite.h index 15c2ccb3..33313d36 100644 --- a/src/test/GraphTestSuite.h +++ b/src/test/GraphTestSuite.h @@ -3,7 +3,6 @@ #include "utility/utilityString.h" #include "data/graph/Graph.h" -#include "data/graph/token_component/TokenComponentName.h" class GraphTestSuite : public CxxTest::TestSuite { @@ -93,7 +92,7 @@ public: void test_nodes_are_nodes() { - Node a(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); + Node a(1, Node::NODE_UNDEFINED, NameHierarchy("A")); TS_ASSERT(a.isNode()); TS_ASSERT(!a.isEdge()); @@ -101,8 +100,8 @@ public: void test_edges_are_edges() { - Node a(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node b(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); + Node a(1, Node::NODE_UNDEFINED, NameHierarchy("A")); + Node b(2, Node::NODE_UNDEFINED, NameHierarchy("B")); Edge e(3, Edge::EDGE_TYPE_OF, &a, &b); TS_ASSERT(!e.isNode()); @@ -111,27 +110,27 @@ public: void test_set_type_of_node_from_constructor() { - Node n(1, Node::NODE_FUNCTION, std::make_shared(utility::splitToVector("A", "::"))); + Node n(1, Node::NODE_FUNCTION, NameHierarchy("A")); TS_ASSERT_EQUALS(Node::NODE_FUNCTION, n.getType()); } void test_set_type_of_node_from_undefined() { - Node n(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); + Node n(2, Node::NODE_UNDEFINED, NameHierarchy("A")); n.setType(Node::NODE_CLASS); TS_ASSERT_EQUALS(Node::NODE_CLASS, n.getType()); } void test_can_not_change_type_of_node_after_it_was_set() { - Node n(3, Node::NODE_NAMESPACE, std::make_shared(utility::splitToVector("A", "::"))); + Node n(3, Node::NODE_NAMESPACE, NameHierarchy("A")); n.setType(Node::NODE_CLASS); TS_ASSERT_DIFFERS(Node::NODE_CLASS, n.getType()); } void test_node_can_be_copied_and_keeps_same_id() { - Node n(4, Node::NODE_NAMESPACE, std::make_shared(utility::splitToVector("A", "::"))); + Node n(4, Node::NODE_NAMESPACE, NameHierarchy("A")); Node n2(n); TS_ASSERT_DIFFERS(&n, &n2); @@ -142,15 +141,15 @@ public: void test_node_type_bit_masking() { - Node n(1, Node::NODE_NAMESPACE, std::make_shared(utility::splitToVector("A", "::"))); + Node n(1, Node::NODE_NAMESPACE, NameHierarchy("A")); TS_ASSERT(n.isType(Node::NODE_FUNCTION | Node::NODE_NAMESPACE | Node::NODE_CLASS)); TS_ASSERT(!n.isType(Node::NODE_FUNCTION | Node::NODE_METHOD | Node::NODE_CLASS)); } void test_get_type_of_edges() { - Node a(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node b(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); + Node a(1, Node::NODE_UNDEFINED, NameHierarchy("A")); + Node b(2, Node::NODE_UNDEFINED, NameHierarchy("B")); Edge e(3, Edge::EDGE_TYPE_OF, &a, &b); TS_ASSERT_EQUALS(Edge::EDGE_TYPE_OF, e.getType()); @@ -158,8 +157,8 @@ public: void test_edge_can_be_copied_and_keeps_same_id() { - Node a(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node b(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); + Node a(1, Node::NODE_UNDEFINED, NameHierarchy("A")); + Node b(2, Node::NODE_UNDEFINED, NameHierarchy("B")); Edge e(3, Edge::EDGE_TYPE_OF, &a, &b); Edge e2(e, &a, &b); @@ -170,8 +169,8 @@ public: void test_edge_type_bit_masking() { - Node a(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node b(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); + Node a(1, Node::NODE_UNDEFINED, NameHierarchy("A")); + Node b(2, Node::NODE_UNDEFINED, NameHierarchy("B")); Edge e(3, Edge::EDGE_TYPE_OF, &a, &b); TS_ASSERT(e.isType(Edge::EDGE_MEMBER | Edge::EDGE_CALL | Edge::EDGE_TYPE_OF)); @@ -180,9 +179,9 @@ public: void test_node_finds_child_node() { - Node a(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node b(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); - Node c(3, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("C", "::"))); + Node a(1, Node::NODE_UNDEFINED, NameHierarchy("A")); + Node b(2, Node::NODE_UNDEFINED, NameHierarchy("B")); + Node c(3, Node::NODE_UNDEFINED, NameHierarchy("C")); Edge e(4, Edge::EDGE_MEMBER, &a, &b); Edge e2(5, Edge::EDGE_MEMBER, &a, &c); @@ -199,9 +198,9 @@ public: void test_node_can_not_find_child_node() { - Node a(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node b(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); - Node c(3, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("C", "::"))); + Node a(1, Node::NODE_UNDEFINED, NameHierarchy("A")); + Node b(2, Node::NODE_UNDEFINED, NameHierarchy("B")); + Node c(3, Node::NODE_UNDEFINED, NameHierarchy("C")); Edge e(4, Edge::EDGE_MEMBER, &a, &b); Edge e2(5, Edge::EDGE_MEMBER, &a, &c); @@ -217,9 +216,9 @@ public: void test_node_visits_child_nodes() { - Node a(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node b(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); - Node c(3, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("C", "::"))); + Node a(1, Node::NODE_UNDEFINED, NameHierarchy("A")); + Node b(2, Node::NODE_UNDEFINED, NameHierarchy("B")); + Node c(3, Node::NODE_UNDEFINED, NameHierarchy("C")); Edge e(4, Edge::EDGE_MEMBER, &a, &b); Edge e2(5, Edge::EDGE_MEMBER, &a, &c); @@ -238,10 +237,10 @@ public: void test_node_has_references() { - Node a(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node b(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); - Node c(3, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("C", "::"))); - Node d(4, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("D", "::"))); + Node a(1, Node::NODE_UNDEFINED, NameHierarchy("A")); + Node b(2, Node::NODE_UNDEFINED, NameHierarchy("B")); + Node c(3, Node::NODE_UNDEFINED, NameHierarchy("C")); + Node d(4, Node::NODE_UNDEFINED, NameHierarchy("D")); Edge e(5, Edge::EDGE_MEMBER, &a, &b); Edge e2(6, Edge::EDGE_MEMBER, &a, &c); Edge e3(7, Edge::EDGE_USAGE, &c, &d); @@ -254,8 +253,8 @@ public: void test_graph_saves_nodes() { Graph graph; - Node* a = graph.createNode(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node* b = graph.createNode(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); + Node* a = graph.createNode(1, Node::NODE_UNDEFINED, NameHierarchy("A")); + Node* b = graph.createNode(2, Node::NODE_UNDEFINED, NameHierarchy("B")); TS_ASSERT_EQUALS(2, graph.getNodeCount()); TS_ASSERT_EQUALS(0, graph.getEdgeCount()); @@ -273,8 +272,8 @@ public: { Graph graph; - Node* a = graph.createNode(1, Node::NODE_FUNCTION, std::make_shared(utility::splitToVector("A", "::"))); - Node* b = graph.createNode(2, Node::NODE_FUNCTION, std::make_shared(utility::splitToVector("B", "::"))); + Node* a = graph.createNode(1, Node::NODE_FUNCTION, NameHierarchy("A")); + Node* b = graph.createNode(2, Node::NODE_FUNCTION, NameHierarchy("B")); Edge* e = graph.createEdge(3, Edge::EDGE_CALL, a, b); @@ -289,8 +288,8 @@ public: { Graph graph; - Node* a = graph.createNode(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - graph.createNode(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); + Node* a = graph.createNode(1, Node::NODE_UNDEFINED, NameHierarchy("A")); + graph.createNode(2, Node::NODE_UNDEFINED, NameHierarchy("B")); TS_ASSERT_EQUALS(2, graph.getNodeCount()); TS_ASSERT_EQUALS(0, graph.getEdgeCount()); @@ -304,11 +303,11 @@ public: { Graph graph; - Node* a = graph.createNode(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node* b = graph.createNode(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); - Node* c = graph.createNode(3, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("C", "::"))); - Node* d = graph.createNode(4, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("D", "::"))); - Node* e = graph.createNode(5, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("E", "::"))); + Node* a = graph.createNode(1, Node::NODE_UNDEFINED, NameHierarchy("A")); + Node* b = graph.createNode(2, Node::NODE_UNDEFINED, NameHierarchy("B")); + Node* c = graph.createNode(3, Node::NODE_UNDEFINED, NameHierarchy("C")); + Node* d = graph.createNode(4, Node::NODE_UNDEFINED, NameHierarchy("D")); + Node* e = graph.createNode(5, Node::NODE_UNDEFINED, NameHierarchy("E")); graph.createEdge(6, Edge::EDGE_MEMBER, a, b); graph.createEdge(7, Edge::EDGE_MEMBER, a, c);