Graph::edges in now a free function.

master
dmatetelki 10 years ago
parent 721c81c79b
commit 7a8ad562de

@ -96,7 +96,6 @@ public:
void removeEdge(const_reference source, const_reference destination); void removeEdge(const_reference source, const_reference destination);
std::vector<value_type> vertices() const; std::vector<value_type> vertices() const;
std::vector<Edge> edges() const;
void clear() noexcept { m_vertices.clear(); } void clear() noexcept { m_vertices.clear(); }
const std::vector<value_type>& neighboursOf(const_reference data) const; const std::vector<value_type>& neighboursOf(const_reference data) const;
@ -158,26 +157,38 @@ private:
// Free functions // Free functions
template <typename V> template <typename V>
bool empty(const Graph<V>& g) { return g.vertices().empty(); } inline bool empty(const Graph<V>& g) noexcept { return g.vertices().empty(); }
template <typename V> template <typename V>
typename Graph<V>::size_type numberOfVertices(const Graph<V>& g) { return g.vertices().size(); } inline typename Graph<V>::size_type numberOfVertices(const Graph<V>& g) noexcept { return g.vertices().size(); }
template <typename V> template <typename V>
typename Graph<V>::size_type numberOfEdges(const Graph<V>& g) { return g.edges().size(); } inline typename Graph<V>::size_type numberOfEdges(const Graph<V>& g) { return edges(g).size(); }
template <typename V> template <typename V>
bool contains(const Graph<V>& g, typename Graph<V>::const_reference data) { inline bool contains(const Graph<V>& g, typename Graph<V>::const_reference data) {
const auto v = g.vertices(); const auto v = g.vertices();
return std::find(v.begin(), v.end(), data) != v.end(); return std::find(v.begin(), v.end(), data) != v.end();
} }
template <typename V> template <typename V>
bool connected(const Graph<V>& g, typename Graph<V>::const_reference source, typename Graph<V>::const_reference destination) { inline bool connected(const Graph<V>& g, typename Graph<V>::const_reference source, typename Graph<V>::const_reference destination) {
const auto n = g.neighboursOf(source); const auto n = g.neighboursOf(source);
return std::find(n.begin(), n.end(), destination) != n.end(); return std::find(n.begin(), n.end(), destination) != n.end();
} }
template <typename V>
inline std::vector<typename Graph<V>::Edge> edges(const Graph<V>& g)
{
std::vector<typename Graph<V>::Edge> retval;
for (const auto& v : g.vertices())
for (const auto& e : g.neighboursOf(v))
retval.push_back(typename Graph<V>::Edge(v, e));
return retval;
}
// Graph implementation // Graph implementation
template <typename V> template <typename V>
@ -321,17 +332,6 @@ inline std::vector<V>& Graph<V>::nonConstNeighboursOf(const_reference data)
return vertex_it->second; return vertex_it->second;
} }
template <typename V>
inline std::vector<typename Graph<V>::Edge> Graph<V>::edges() const
{
std::vector<typename Graph<V>::Edge> retval;
for (const auto& v : m_vertices)
for (const auto& e : v.second)
retval.push_back(Graph<V>::Edge(v.first, e));
return retval;
}
template <typename V> template <typename V>
inline void Graph<V>::eraseEdge(edge_container& v, const_reference data) { inline void Graph<V>::eraseEdge(edge_container& v, const_reference data) {
v.erase(std::remove_if(v.begin(), v.end(), v.erase(std::remove_if(v.begin(), v.end(),

Loading…
Cancel
Save