diff --git a/include/CXXGraph/Edge/DirectedEdge_decl.h b/include/CXXGraph/Edge/DirectedEdge_decl.h index b4611c3a..f33eabd1 100644 --- a/include/CXXGraph/Edge/DirectedEdge_decl.h +++ b/include/CXXGraph/Edge/DirectedEdge_decl.h @@ -17,8 +17,8 @@ /*** License: MPL v2.0 ***/ /***********************************************************/ -#ifndef __CXXGRAPH_DIRECTEDEDGE_DECL_H__ -#define __CXXGRAPH_DIRECTEDEDGE_DECL_H__ +#ifndef CXXGRAPH_DIRECTEDEDGE_DECL_H_ +#define CXXGRAPH_DIRECTEDEDGE_DECL_H_ #pragma once @@ -42,19 +42,21 @@ std::ostream &operator<<(std::ostream &o, const DirectedEdge &edge); template class DirectedEdge : public Edge { public: - DirectedEdge(const CXXGraph::id_t id, const Node &node1, + constexpr DirectedEdge(const CXXGraph::id_t id, const Node &node1, const Node &node2); - DirectedEdge(const CXXGraph::id_t id, shared> node1, + constexpr DirectedEdge(const CXXGraph::id_t id, shared> node1, shared> node2); - DirectedEdge(const CXXGraph::id_t id, + constexpr DirectedEdge( + const CXXGraph::id_t id, const std::pair *, const Node *> &nodepair); - DirectedEdge( + constexpr DirectedEdge( const CXXGraph::id_t id, const std::pair>, shared>> &nodepair); - DirectedEdge(const Edge &edge); + constexpr DirectedEdge(const Edge &edge); virtual ~DirectedEdge() = default; - const Node &getFrom() const; - const Node &getTo() const; + constexpr const Node &getFrom() const; + constexpr const Node &getTo() const; + // const std::optional isDirected() const override; const std::optional isWeighted() const override; // operator @@ -67,4 +69,4 @@ class DirectedEdge : public Edge { }; } // namespace CXXGraph -#endif // __CXXGRAPH_DIRECTEDEDGE_H__ +#endif // CXXGRAPH_DIRECTEDEDGE_H_ diff --git a/include/CXXGraph/Edge/DirectedEdge_impl.hpp b/include/CXXGraph/Edge/DirectedEdge_impl.hpp index 9faa1a34..9bbf50e6 100644 --- a/include/CXXGraph/Edge/DirectedEdge_impl.hpp +++ b/include/CXXGraph/Edge/DirectedEdge_impl.hpp @@ -26,44 +26,42 @@ namespace CXXGraph { -using std::make_shared; -using std::make_unique; - template -DirectedEdge::DirectedEdge(const CXXGraph::id_t id, const Node &node1, +constexpr DirectedEdge::DirectedEdge(const CXXGraph::id_t id, + const Node &node1, const Node &node2) : Edge(id, node1, node2) {} template -DirectedEdge::DirectedEdge(const CXXGraph::id_t id, +constexpr DirectedEdge::DirectedEdge(const CXXGraph::id_t id, shared> node1, shared> node2) : Edge(id, node1, node2) {} template -DirectedEdge::DirectedEdge( +constexpr DirectedEdge::DirectedEdge( const CXXGraph::id_t id, const std::pair *, const Node *> &nodepair) : Edge(id, nodepair) {} template -DirectedEdge::DirectedEdge( +constexpr DirectedEdge::DirectedEdge( const CXXGraph::id_t id, const std::pair>, shared>> &nodepair) : Edge(id, nodepair) {} template -DirectedEdge::DirectedEdge(const Edge &edge) +constexpr DirectedEdge::DirectedEdge(const Edge &edge) : DirectedEdge(edge.getId(), *(edge.getNodePair().first), *(edge.getNodePair().second)) {} template -const Node &DirectedEdge::getFrom() const { +constexpr const Node &DirectedEdge::getFrom() const { return *(Edge::getNodePair().first); } template -const Node &DirectedEdge::getTo() const { +constexpr const Node &DirectedEdge::getTo() const { return *(Edge::getNodePair().second); } diff --git a/include/CXXGraph/Edge/DirectedWeightedEdge_decl.h b/include/CXXGraph/Edge/DirectedWeightedEdge_decl.h index 4f0f981b..ef3963f3 100644 --- a/include/CXXGraph/Edge/DirectedWeightedEdge_decl.h +++ b/include/CXXGraph/Edge/DirectedWeightedEdge_decl.h @@ -45,23 +45,25 @@ std::ostream &operator<<(std::ostream &o, const DirectedWeightedEdge &edge); template class DirectedWeightedEdge : public DirectedEdge, public Weighted { public: - DirectedWeightedEdge(const CXXGraph::id_t id, const Node &node1, + constexpr DirectedWeightedEdge(const CXXGraph::id_t id, const Node &node1, const Node &node2, const double weight); - DirectedWeightedEdge(const CXXGraph::id_t id, shared> node1, + constexpr DirectedWeightedEdge(const CXXGraph::id_t id, + shared> node1, shared> node2, const double weight); - DirectedWeightedEdge( + constexpr DirectedWeightedEdge( const CXXGraph::id_t id, const std::pair *, const Node *> &nodepair, const double weight); - DirectedWeightedEdge( + constexpr DirectedWeightedEdge( const CXXGraph::id_t id, const std::pair>, shared>> &nodepair, const double weight); - DirectedWeightedEdge(const DirectedEdge &edge, const double weight); - DirectedWeightedEdge(const Edge &edge, const double weight); - DirectedWeightedEdge(const DirectedEdge &edge); - DirectedWeightedEdge(const Edge &edge); - DirectedWeightedEdge(const UndirectedWeightedEdge &edge); + constexpr DirectedWeightedEdge(const DirectedEdge &edge, + const double weight); + constexpr DirectedWeightedEdge(const Edge &edge, const double weight); + constexpr DirectedWeightedEdge(const DirectedEdge &edge); + constexpr DirectedWeightedEdge(const Edge &edge); + constexpr DirectedWeightedEdge(const UndirectedWeightedEdge &edge); virtual ~DirectedWeightedEdge() = default; const std::optional isWeighted() const override; // operator diff --git a/include/CXXGraph/Edge/DirectedWeightedEdge_impl.hpp b/include/CXXGraph/Edge/DirectedWeightedEdge_impl.hpp index d05a6d79..3ba0aa10 100644 --- a/include/CXXGraph/Edge/DirectedWeightedEdge_impl.hpp +++ b/include/CXXGraph/Edge/DirectedWeightedEdge_impl.hpp @@ -27,53 +27,56 @@ namespace CXXGraph { template -DirectedWeightedEdge::DirectedWeightedEdge(const CXXGraph::id_t id, +constexpr DirectedWeightedEdge::DirectedWeightedEdge(const CXXGraph::id_t id, const Node &node1, const Node &node2, const double weight) : DirectedEdge(id, node1, node2), Weighted(weight) {} template -DirectedWeightedEdge::DirectedWeightedEdge(const CXXGraph::id_t id, +constexpr DirectedWeightedEdge::DirectedWeightedEdge( + const CXXGraph::id_t id, shared> node1, shared> node2, const double weight) : DirectedEdge(id, node1, node2), Weighted(weight) {} template -DirectedWeightedEdge::DirectedWeightedEdge( +constexpr DirectedWeightedEdge::DirectedWeightedEdge( const CXXGraph::id_t id, const std::pair *, const Node *> &nodepair, const double weight) : DirectedEdge(id, nodepair), Weighted(weight) {} template -DirectedWeightedEdge::DirectedWeightedEdge( +constexpr DirectedWeightedEdge::DirectedWeightedEdge( const CXXGraph::id_t id, const std::pair>, shared>> &nodepair, const double weight) : DirectedEdge(id, nodepair), Weighted(weight) {} template -DirectedWeightedEdge::DirectedWeightedEdge(const DirectedEdge &edge, +constexpr DirectedWeightedEdge::DirectedWeightedEdge( + const DirectedEdge &edge, const double weight) : DirectedEdge(edge), Weighted(weight) {} template -DirectedWeightedEdge::DirectedWeightedEdge(const Edge &edge, +constexpr DirectedWeightedEdge::DirectedWeightedEdge(const Edge &edge, const double weight) : DirectedEdge(edge), Weighted(weight) {} template -DirectedWeightedEdge::DirectedWeightedEdge(const DirectedEdge &edge) +constexpr DirectedWeightedEdge::DirectedWeightedEdge( + const DirectedEdge &edge) : DirectedEdge(edge), Weighted() {} template -DirectedWeightedEdge::DirectedWeightedEdge(const Edge &edge) +constexpr DirectedWeightedEdge::DirectedWeightedEdge(const Edge &edge) : DirectedEdge(edge), Weighted() {} template -DirectedWeightedEdge::DirectedWeightedEdge( +constexpr DirectedWeightedEdge::DirectedWeightedEdge( const UndirectedWeightedEdge &edge) : DirectedEdge(edge), Weighted(edge.getWeight()) {} diff --git a/include/CXXGraph/Edge/Edge_decl.h b/include/CXXGraph/Edge/Edge_decl.h index 11d90d88..4f24053a 100644 --- a/include/CXXGraph/Edge/Edge_decl.h +++ b/include/CXXGraph/Edge/Edge_decl.h @@ -49,17 +49,18 @@ class Edge { public: typedef T Node_t; - Edge(const CXXGraph::id_t id, const Node &node1, const Node &node2); - Edge(const CXXGraph::id_t id, shared> node1, + constexpr Edge(const CXXGraph::id_t id, const Node &node1, const Node &node2); + constexpr Edge(const CXXGraph::id_t id, shared> node1, shared> node2); - Edge(const CXXGraph::id_t id, + constexpr Edge(const CXXGraph::id_t id, const std::pair *, const Node *> &nodepair); - Edge(const CXXGraph::id_t id, + constexpr Edge( + const CXXGraph::id_t id, const std::pair>, shared>> &nodepair); virtual ~Edge() = default; void setFirstNode(shared> node); void setSecondNode(shared> node); - unsigned long long getId() const; + constexpr unsigned long long getId() const; const std::pair>, shared>> &getNodePair() const; shared> getOtherNode(shared> node) const; @@ -67,7 +68,7 @@ class Edge { virtual const std::optional isWeighted() const; // operator virtual bool operator==(const Edge &b) const; - bool operator<(const Edge &b) const; + constexpr bool operator<(const Edge &b) const; friend std::ostream &operator<< <>(std::ostream &os, const Edge &edge); }; diff --git a/include/CXXGraph/Edge/Edge_impl.hpp b/include/CXXGraph/Edge/Edge_impl.hpp index 7f35228b..cd2f5b5c 100644 --- a/include/CXXGraph/Edge/Edge_impl.hpp +++ b/include/CXXGraph/Edge/Edge_impl.hpp @@ -35,36 +35,30 @@ using std::make_shared; using std::make_unique; template -Edge::Edge(const CXXGraph::id_t id, const Node &node1, - const Node &node2) { - this->nodePair.first = make_shared>(node1); - this->nodePair.second = make_shared>(node2); - this->id = id; -} +constexpr Edge::Edge(const CXXGraph::id_t otherId, const Node &node1, + const Node &node2) + : id(otherId), nodePair{std::make_shared>(node1), + std::make_shared>(node2)} + {} template -Edge::Edge(const CXXGraph::id_t id, shared> node1, - shared> node2) { - this->nodePair.first = node1; - this->nodePair.second = node2; - this->id = id; -} +constexpr Edge::Edge(const CXXGraph::id_t otherId, shared> node1, + shared> node2) + : id(otherId), nodePair(node1, node2) {} template -Edge::Edge(const CXXGraph::id_t id, - const std::pair *, const Node *> &nodepair) { - this->nodePair.first = make_shared>(*(nodepair.first)); - this->nodePair.second = make_shared>(*(nodepair.second)); - this->id = id; -} +constexpr Edge::Edge(const CXXGraph::id_t otherId, + const std::pair *, const Node *> &nodepair) + : id(otherId) + , nodePair(std::make_shared>(*(nodepair.first)), + std::make_shared>(*(nodepair.second))) +{ } template -Edge::Edge( - const CXXGraph::id_t id, +constexpr Edge::Edge( + const CXXGraph::id_t otherId, const std::pair>, shared>> &nodepair) - : nodePair(nodepair) { - this->id = id; -} + : id(otherId), nodePair(nodepair) { } template void Edge::setFirstNode(shared> node) { @@ -79,7 +73,7 @@ void Edge::setSecondNode(shared> node) { } template -unsigned long long Edge::getId() const { +constexpr unsigned long long Edge::getId() const { return id; } @@ -114,7 +108,7 @@ bool Edge::operator==(const Edge &b) const { } template -bool Edge::operator<(const Edge &b) const { +constexpr bool Edge::operator<(const Edge &b) const { return (this->id < b.id); }