From 409c36561986fa1392a84477bc4f09af6842a40d Mon Sep 17 00:00:00 2001 From: sbaldu Date: Wed, 14 Jun 2023 08:39:23 +0200 Subject: [PATCH 1/4] Fix raw pointer overload of addEdge --- include/Graph/Graph.hpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/include/Graph/Graph.hpp b/include/Graph/Graph.hpp index 5981aa9bc..78591c0bf 100644 --- a/include/Graph/Graph.hpp +++ b/include/Graph/Graph.hpp @@ -736,8 +736,23 @@ void Graph::setEdgeSet(const T_EdgeSet &edgeSet) { template void Graph::addEdge(const Edge *edge) { - auto edge_shared = make_shared>(*edge); - this->edgeSet.insert(edge_shared); + if (edge->isDirected().has_value() && edge->isDirected().value()) { + if (edge->isWeighted().has_value() && edge->isWeighted().value()) { + auto edge_shared = make_shared>(*edge); + this->edgeSet.insert(std::static_pointer_cast>(edge_shared)); + } else { + auto edge_shared = make_shared>(*edge); + this->edgeSet.insert(std::static_pointer_cast>(edge_shared)); + } + } else { + if (edge->isWeighted().has_value() && edge->isWeighted().value()) { + auto edge_shared = make_shared>(*edge); + this->edgeSet.insert(std::static_pointer_cast>(edge_shared)); + } else { + auto edge_shared = make_shared>(*edge); + this->edgeSet.insert(std::static_pointer_cast>(edge_shared)); + } + } } template From fc71bb512dd14d05a1c8ee4df2869044aca5f8b1 Mon Sep 17 00:00:00 2001 From: sbaldu Date: Wed, 14 Jun 2023 08:51:48 +0200 Subject: [PATCH 2/4] Add tests for raw pointer overload of addEdge --- test/GraphTest.cpp | 54 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/test/GraphTest.cpp b/test/GraphTest.cpp index f035a6d0b..cdb0702a9 100644 --- a/test/GraphTest.cpp +++ b/test/GraphTest.cpp @@ -105,6 +105,60 @@ TEST(GraphTest, GetNodeSet_2) { }) != nodeSet.end()); } +TEST(GraphTest, RawAddEdge_1) { + CXXGraph::Node n1("a", 1); + CXXGraph::Node n2("b", 1); + CXXGraph::Node n3("c", 1); + + CXXGraph::DirectedEdge e1(0, n1, n2); + CXXGraph::DirectedEdge e2(1, n2, n3); + CXXGraph::DirectedEdge e3(2, n3, n1); + + CXXGraph::Graph graph; + graph.addEdge(&e1); + graph.addEdge(&e2); + graph.addEdge(&e3); + + ASSERT_TRUE(graph.isDirectedGraph()); + ASSERT_FALSE(graph.isUndirectedGraph()); +} + +TEST(GraphTest, RawAddEdge_2) { + CXXGraph::Node n1("a", 1); + CXXGraph::Node n2("b", 1); + CXXGraph::Node n3("c", 1); + + CXXGraph::UndirectedEdge e1(0, n1, n2); + CXXGraph::UndirectedEdge e2(1, n2, n3); + CXXGraph::UndirectedEdge e3(2, n3, n1); + + CXXGraph::Graph graph; + graph.addEdge(&e1); + graph.addEdge(&e2); + graph.addEdge(&e3); + + ASSERT_FALSE(graph.isDirectedGraph()); + ASSERT_TRUE(graph.isUndirectedGraph()); +} + +TEST(GraphTest, RawAddEdge_3) { + CXXGraph::Node n1("a", 1); + CXXGraph::Node n2("b", 1); + CXXGraph::Node n3("c", 1); + + CXXGraph::UndirectedEdge e1(0, n1, n2); + CXXGraph::DirectedEdge e2(1, n2, n3); + CXXGraph::UndirectedEdge e3(2, n3, n1); + + CXXGraph::Graph graph; + graph.addEdge(&e1); + graph.addEdge(&e2); + graph.addEdge(&e3); + + ASSERT_FALSE(graph.isDirectedGraph()); + ASSERT_FALSE(graph.isUndirectedGraph()); +} + TEST(GraphTest, adj_print_1) { CXXGraph::Node node1("1", 1); CXXGraph::Node node2("2", 2); From 4796cbcbb103ab57c7149a650d8cc3eaa2fe7bf9 Mon Sep 17 00:00:00 2001 From: sbaldu Date: Wed, 14 Jun 2023 08:55:04 +0200 Subject: [PATCH 3/4] Formatting --- include/Graph/Graph.hpp | 71 +++++++++++++++++++------------------ test/GraphTest.cpp | 78 +++++++++++++++++++++-------------------- 2 files changed, 76 insertions(+), 73 deletions(-) diff --git a/include/Graph/Graph.hpp b/include/Graph/Graph.hpp index 78591c0bf..e8ae487fa 100644 --- a/include/Graph/Graph.hpp +++ b/include/Graph/Graph.hpp @@ -243,33 +243,31 @@ class Graph { /** * @brief This function generate a list of adjacency matrix with every element * of the matrix contain the node where is directed the link and the Edge - * corrispondent to the link Note: No Thread Safe + * corrispondent to the link + * Note: No Thread Safe */ virtual const std::shared_ptr> getAdjMatrix() const; /** - * \brief This function generates a set of nodes linked to the provided node in a - * directed graph - * Note: No Thread Safe + * \brief This function generates a set of nodes linked to the provided node + * in a directed graph * * @param Pointer to the node * */ - virtual const std::unordered_set>, nodeHash> outNeighbors( - const Node *node) const; + virtual const std::unordered_set>, nodeHash> + outNeighbors(const Node *node) const; /** - * \brief This function generates a set of nodes linked to the provided node in a - * directed graph - * Note: No Thread Safe + * \brief This function generates a set of nodes linked to the provided node + * in a directed graph * * @param Pointer to the node * */ - virtual const std::unordered_set>, nodeHash> outNeighbors( - shared> node) const; + virtual const std::unordered_set>, nodeHash> + outNeighbors(shared> node) const; /** - * \brief This function generates a set of nodes linked to the provided node in - * any graph - * Note: No Thread Safe + * \brief This function generates a set of nodes linked to the provided node + * in any graph * * @param Pointer to the node * @@ -278,9 +276,8 @@ class Graph { inOutNeighbors(const Node *node) const; /** * \brief - * \brief This function generates a set of nodes linked to the provided node in - * any graph - * Note: No Thread Safe + * \brief This function generates a set of nodes linked to the provided node + * in any graph * * @param Pointer to the node * @@ -737,21 +734,25 @@ void Graph::setEdgeSet(const T_EdgeSet &edgeSet) { template void Graph::addEdge(const Edge *edge) { if (edge->isDirected().has_value() && edge->isDirected().value()) { - if (edge->isWeighted().has_value() && edge->isWeighted().value()) { - auto edge_shared = make_shared>(*edge); - this->edgeSet.insert(std::static_pointer_cast>(edge_shared)); - } else { - auto edge_shared = make_shared>(*edge); - this->edgeSet.insert(std::static_pointer_cast>(edge_shared)); - } + if (edge->isWeighted().has_value() && edge->isWeighted().value()) { + auto edge_shared = make_shared>(*edge); + this->edgeSet.insert( + std::static_pointer_cast>(edge_shared)); + } else { + auto edge_shared = make_shared>(*edge); + this->edgeSet.insert( + std::static_pointer_cast>(edge_shared)); + } } else { - if (edge->isWeighted().has_value() && edge->isWeighted().value()) { - auto edge_shared = make_shared>(*edge); - this->edgeSet.insert(std::static_pointer_cast>(edge_shared)); - } else { - auto edge_shared = make_shared>(*edge); - this->edgeSet.insert(std::static_pointer_cast>(edge_shared)); - } + if (edge->isWeighted().has_value() && edge->isWeighted().value()) { + auto edge_shared = make_shared>(*edge); + this->edgeSet.insert( + std::static_pointer_cast>(edge_shared)); + } else { + auto edge_shared = make_shared>(*edge); + this->edgeSet.insert( + std::static_pointer_cast>(edge_shared)); + } } } @@ -1395,16 +1396,16 @@ const std::shared_ptr> Graph::getAdjMatrix() const { } template -const std::unordered_set>, nodeHash> Graph::outNeighbors( - const Node *node) const { +const std::unordered_set>, nodeHash> +Graph::outNeighbors(const Node *node) const { auto node_shared = make_shared>(*node); return outNeighbors(node_shared); } template -const std::unordered_set>, nodeHash> Graph::outNeighbors( - shared> node) const { +const std::unordered_set>, nodeHash> +Graph::outNeighbors(shared> node) const { auto adj = getAdjMatrix(); if (adj->find(node) == adj->end()) { return std::unordered_set>, nodeHash>(); diff --git a/test/GraphTest.cpp b/test/GraphTest.cpp index cdb0702a9..fdd885563 100644 --- a/test/GraphTest.cpp +++ b/test/GraphTest.cpp @@ -106,57 +106,57 @@ TEST(GraphTest, GetNodeSet_2) { } TEST(GraphTest, RawAddEdge_1) { - CXXGraph::Node n1("a", 1); - CXXGraph::Node n2("b", 1); - CXXGraph::Node n3("c", 1); + CXXGraph::Node n1("a", 1); + CXXGraph::Node n2("b", 1); + CXXGraph::Node n3("c", 1); - CXXGraph::DirectedEdge e1(0, n1, n2); - CXXGraph::DirectedEdge e2(1, n2, n3); - CXXGraph::DirectedEdge e3(2, n3, n1); + CXXGraph::DirectedEdge e1(0, n1, n2); + CXXGraph::DirectedEdge e2(1, n2, n3); + CXXGraph::DirectedEdge e3(2, n3, n1); - CXXGraph::Graph graph; - graph.addEdge(&e1); - graph.addEdge(&e2); - graph.addEdge(&e3); + CXXGraph::Graph graph; + graph.addEdge(&e1); + graph.addEdge(&e2); + graph.addEdge(&e3); - ASSERT_TRUE(graph.isDirectedGraph()); - ASSERT_FALSE(graph.isUndirectedGraph()); + ASSERT_TRUE(graph.isDirectedGraph()); + ASSERT_FALSE(graph.isUndirectedGraph()); } TEST(GraphTest, RawAddEdge_2) { - CXXGraph::Node n1("a", 1); - CXXGraph::Node n2("b", 1); - CXXGraph::Node n3("c", 1); + CXXGraph::Node n1("a", 1); + CXXGraph::Node n2("b", 1); + CXXGraph::Node n3("c", 1); - CXXGraph::UndirectedEdge e1(0, n1, n2); - CXXGraph::UndirectedEdge e2(1, n2, n3); - CXXGraph::UndirectedEdge e3(2, n3, n1); + CXXGraph::UndirectedEdge e1(0, n1, n2); + CXXGraph::UndirectedEdge e2(1, n2, n3); + CXXGraph::UndirectedEdge e3(2, n3, n1); - CXXGraph::Graph graph; - graph.addEdge(&e1); - graph.addEdge(&e2); - graph.addEdge(&e3); + CXXGraph::Graph graph; + graph.addEdge(&e1); + graph.addEdge(&e2); + graph.addEdge(&e3); - ASSERT_FALSE(graph.isDirectedGraph()); - ASSERT_TRUE(graph.isUndirectedGraph()); + ASSERT_FALSE(graph.isDirectedGraph()); + ASSERT_TRUE(graph.isUndirectedGraph()); } TEST(GraphTest, RawAddEdge_3) { - CXXGraph::Node n1("a", 1); - CXXGraph::Node n2("b", 1); - CXXGraph::Node n3("c", 1); + CXXGraph::Node n1("a", 1); + CXXGraph::Node n2("b", 1); + CXXGraph::Node n3("c", 1); - CXXGraph::UndirectedEdge e1(0, n1, n2); - CXXGraph::DirectedEdge e2(1, n2, n3); - CXXGraph::UndirectedEdge e3(2, n3, n1); + CXXGraph::UndirectedEdge e1(0, n1, n2); + CXXGraph::DirectedEdge e2(1, n2, n3); + CXXGraph::UndirectedEdge e3(2, n3, n1); - CXXGraph::Graph graph; - graph.addEdge(&e1); - graph.addEdge(&e2); - graph.addEdge(&e3); + CXXGraph::Graph graph; + graph.addEdge(&e1); + graph.addEdge(&e2); + graph.addEdge(&e3); - ASSERT_FALSE(graph.isDirectedGraph()); - ASSERT_FALSE(graph.isUndirectedGraph()); + ASSERT_FALSE(graph.isDirectedGraph()); + ASSERT_FALSE(graph.isUndirectedGraph()); } TEST(GraphTest, adj_print_1) { @@ -392,7 +392,8 @@ TEST(GraphTest, test_outEdges_shared) { edgeSet.insert(make_shared>(edge12)); CXXGraph::Graph graph(edgeSet); - for (auto x : graph.outNeighbors(make_shared>(node1))) { + for (auto x : + graph.outNeighbors(make_shared>(node1))) { ASSERT_TRUE(x == make_shared>(node2) || x == make_shared>(node3)); } @@ -480,7 +481,8 @@ TEST(GraphTest, test_inOutEdges_shared) { edgeSet.insert(make_shared>(edge8)); CXXGraph::Graph graph(edgeSet); - for (auto x : graph.inOutNeighbors(make_shared>(node1))) { + for (auto x : + graph.inOutNeighbors(make_shared>(node1))) { ASSERT_TRUE(x == make_shared>(node2) || x == make_shared>(node3)); } From 4ab360184004de3f608c7312ac53cb774c861e71 Mon Sep 17 00:00:00 2001 From: sbaldu Date: Wed, 14 Jun 2023 10:55:57 +0200 Subject: [PATCH 4/4] Remove unnecessary static pointer cast --- include/Graph/Graph.hpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/include/Graph/Graph.hpp b/include/Graph/Graph.hpp index e8ae487fa..7dbc01243 100644 --- a/include/Graph/Graph.hpp +++ b/include/Graph/Graph.hpp @@ -736,22 +736,18 @@ void Graph::addEdge(const Edge *edge) { if (edge->isDirected().has_value() && edge->isDirected().value()) { if (edge->isWeighted().has_value() && edge->isWeighted().value()) { auto edge_shared = make_shared>(*edge); - this->edgeSet.insert( - std::static_pointer_cast>(edge_shared)); + this->edgeSet.insert(edge_shared); } else { auto edge_shared = make_shared>(*edge); - this->edgeSet.insert( - std::static_pointer_cast>(edge_shared)); + this->edgeSet.insert(edge_shared); } } else { if (edge->isWeighted().has_value() && edge->isWeighted().value()) { auto edge_shared = make_shared>(*edge); - this->edgeSet.insert( - std::static_pointer_cast>(edge_shared)); + this->edgeSet.insert(edge_shared); } else { auto edge_shared = make_shared>(*edge); - this->edgeSet.insert( - std::static_pointer_cast>(edge_shared)); + this->edgeSet.insert(edge_shared); } } }