filtered_graph.hpp
来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 483 行 · 第 1/2 页
HPP
483 行
//=======================================================================// Copyright 1997, 1998, 1999, 2000 University of Notre Dame.// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek//// This file is part of the Boost Graph Library//// You should have received a copy of the License Agreement for the// Boost Graph Library along with the software; see the file LICENSE.// If not, contact Office of Research, University of Notre Dame, Notre// Dame, IN 46556.//// Permission to modify the code and to distribute modified code is// granted, provided the text of this NOTICE is retained, a notice that// the code was modified is included with the above COPYRIGHT NOTICE and// with the COPYRIGHT NOTICE in the LICENSE file, and that the LICENSE// file is distributed with the modified code.//// LICENSOR MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.// By way of example, but not limitation, Licensor MAKES NO// REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY// PARTICULAR PURPOSE OR THAT THE USE OF THE LICENSED SOFTWARE COMPONENTS// OR DOCUMENTATION WILL NOT INFRINGE ANY PATENTS, COPYRIGHTS, TRADEMARKS// OR OTHER RIGHTS.//=======================================================================#ifndef BOOST_FILTERED_GRAPH_HPP#define BOOST_FILTERED_GRAPH_HPP#include <boost/graph/graph_traits.hpp>#include <boost/graph/properties.hpp>#include <boost/graph/adjacency_iterator.hpp>#include <boost/iterator/filter_iterator.hpp>namespace boost { //========================================================================= // Some predicate classes. struct keep_all { template <typename T> bool operator()(const T&) const { return true; } }; // Keep residual edges (used in maximum-flow algorithms). template <typename ResidualCapacityEdgeMap> struct is_residual_edge { is_residual_edge() { } is_residual_edge(ResidualCapacityEdgeMap rcap) : m_rcap(rcap) { } template <typename Edge> bool operator()(const Edge& e) const { return 0 < get(m_rcap, e); } ResidualCapacityEdgeMap m_rcap; }; template <typename Set> struct is_in_subset { is_in_subset() : m_s(0) { } is_in_subset(const Set& s) : m_s(&s) { } template <typename Elt> bool operator()(const Elt& x) const { return set_contains(*m_s, x); } const Set* m_s; }; template <typename Set> struct is_not_in_subset { is_not_in_subset() : m_s(0) { } is_not_in_subset(const Set& s) : m_s(&s) { } template <typename Elt> bool operator()(const Elt& x) const { return !set_contains(*m_s, x); } const Set* m_s; }; namespace detail { template <typename EdgePredicate, typename VertexPredicate, typename Graph> struct out_edge_predicate { out_edge_predicate() { } out_edge_predicate(EdgePredicate ep, VertexPredicate vp, const Graph& g) : m_edge_pred(ep), m_vertex_pred(vp), m_g(&g) { } template <typename Edge> bool operator()(const Edge& e) const { return m_edge_pred(e) && m_vertex_pred(target(e, *m_g)); } EdgePredicate m_edge_pred; VertexPredicate m_vertex_pred; const Graph* m_g; }; template <typename EdgePredicate, typename VertexPredicate, typename Graph> struct in_edge_predicate { in_edge_predicate() { } in_edge_predicate(EdgePredicate ep, VertexPredicate vp, const Graph& g) : m_edge_pred(ep), m_vertex_pred(vp), m_g(&g) { } template <typename Edge> bool operator()(const Edge& e) const { return m_edge_pred(e) && m_vertex_pred(source(e, *m_g)); } EdgePredicate m_edge_pred; VertexPredicate m_vertex_pred; const Graph* m_g; }; template <typename EdgePredicate, typename VertexPredicate, typename Graph> struct edge_predicate { edge_predicate() { } edge_predicate(EdgePredicate ep, VertexPredicate vp, const Graph& g) : m_edge_pred(ep), m_vertex_pred(vp), m_g(&g) { } template <typename Edge> bool operator()(const Edge& e) const { return m_edge_pred(e) && m_vertex_pred(source(e, *m_g)) && m_vertex_pred(target(e, *m_g)); } EdgePredicate m_edge_pred; VertexPredicate m_vertex_pred; const Graph* m_g; }; } // namespace detail //=========================================================================== // Filtered Graph struct filtered_graph_tag { }; // This base class is a stupid hack to change overload resolution // rules for the source and target functions so that they are a // worse match than the source and target functions defined for // pairs in graph_traits.hpp. I feel dirty. -JGS template <class G> struct filtered_graph_base { typedef graph_traits<G> Traits; typedef typename Traits::vertex_descriptor vertex_descriptor; typedef typename Traits::edge_descriptor edge_descriptor; filtered_graph_base(const G& g) : m_g(g) { } //protected: const G& m_g; }; template <typename Graph, typename EdgePredicate, typename VertexPredicate = keep_all> class filtered_graph : public filtered_graph_base<Graph> { typedef filtered_graph_base<Graph> Base; typedef graph_traits<Graph> Traits; typedef filtered_graph self; public: typedef Graph graph_type; typedef detail::out_edge_predicate<EdgePredicate, VertexPredicate, self> OutEdgePred; typedef detail::in_edge_predicate<EdgePredicate, VertexPredicate, self> InEdgePred; typedef detail::edge_predicate<EdgePredicate, VertexPredicate, self> EdgePred; // Constructors filtered_graph(const Graph& g, EdgePredicate ep) : Base(g), m_edge_pred(ep) { } filtered_graph(const Graph& g, EdgePredicate ep, VertexPredicate vp) : Base(g), m_edge_pred(ep), m_vertex_pred(vp) { } // Graph requirements typedef typename Traits::vertex_descriptor vertex_descriptor; typedef typename Traits::edge_descriptor edge_descriptor; typedef typename Traits::directed_category directed_category; typedef typename Traits::edge_parallel_category edge_parallel_category; typedef typename Traits::traversal_category traversal_category; // IncidenceGraph requirements typedef filter_iterator< OutEdgePred, typename Traits::out_edge_iterator > out_edge_iterator; typedef typename Traits::degree_size_type degree_size_type; // AdjacencyGraph requirements typedef typename adjacency_iterator_generator<self, vertex_descriptor, out_edge_iterator>::type adjacency_iterator; // BidirectionalGraph requirements typedef filter_iterator< InEdgePred, typename Traits::in_edge_iterator > in_edge_iterator; // VertexListGraph requirements typedef filter_iterator< VertexPredicate, typename Traits::vertex_iterator > vertex_iterator; typedef typename Traits::vertices_size_type vertices_size_type; // EdgeListGraph requirements typedef filter_iterator< EdgePred, typename Traits::edge_iterator > edge_iterator; typedef typename Traits::edges_size_type edges_size_type; typedef typename ::boost::edge_property_type<Graph>::type edge_property_type; typedef typename ::boost::vertex_property_type<Graph>::type vertex_property_type; typedef filtered_graph_tag graph_tag; //private: EdgePredicate m_edge_pred; VertexPredicate m_vertex_pred; }; //=========================================================================== // Non-member functions for the Filtered Edge Graph // Helper functions template <typename Graph, typename EdgePredicate> inline filtered_graph<Graph, EdgePredicate> make_filtered_graph(Graph& g, EdgePredicate ep) { return filtered_graph<Graph, EdgePredicate>(g, ep); } template <typename Graph, typename EdgePredicate, typename VertexPredicate> inline filtered_graph<Graph, EdgePredicate, VertexPredicate> make_filtered_graph(Graph& g, EdgePredicate ep, VertexPredicate vp) { return filtered_graph<Graph, EdgePredicate, VertexPredicate>(g, ep, vp); } template <typename G, typename EP, typename VP> std::pair<typename filtered_graph<G, EP, VP>::vertex_iterator, typename filtered_graph<G, EP, VP>::vertex_iterator> vertices(const filtered_graph<G, EP, VP>& g) { typedef filtered_graph<G, EP, VP> Graph; typename graph_traits<G>::vertex_iterator f, l; tie(f, l) = vertices(g.m_g);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?