williamr@2: //======================================================================= williamr@2: // Copyright 1997, 1998, 1999, 2000 University of Notre Dame. williamr@2: // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek williamr@2: // williamr@2: // Distributed under the Boost Software License, Version 1.0. (See williamr@2: // accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: //======================================================================= williamr@2: williamr@2: #ifndef BOOST_GRAPH_NAMED_FUNCTION_PARAMS_HPP williamr@2: #define BOOST_GRAPH_NAMED_FUNCTION_PARAMS_HPP williamr@2: williamr@2: #include williamr@2: williamr@2: namespace boost { williamr@2: williamr@2: struct distance_compare_t { }; williamr@2: struct distance_combine_t { }; williamr@2: struct distance_inf_t { }; williamr@2: struct distance_zero_t { }; williamr@2: struct buffer_param_t { }; williamr@2: struct edge_copy_t { }; williamr@2: struct vertex_copy_t { }; williamr@2: struct vertex_isomorphism_t { }; williamr@2: struct vertex_invariant_t { }; williamr@2: struct vertex_invariant1_t { }; williamr@2: struct vertex_invariant2_t { }; williamr@2: struct edge_compare_t { }; williamr@2: struct vertex_max_invariant_t { }; williamr@2: struct orig_to_copy_t { }; williamr@2: struct root_vertex_t { }; williamr@2: struct attractive_force_t { }; williamr@2: struct repulsive_force_t { }; williamr@2: struct force_pairs_t { }; williamr@2: struct cooling_t { }; williamr@2: struct vertex_displacement_t { }; williamr@2: struct iterations_t { }; williamr@2: struct diameter_range_t { }; williamr@2: struct learning_constant_range_t { }; williamr@2: williamr@2: namespace detail { williamr@2: template williamr@2: struct wrap_ref { williamr@2: wrap_ref(T& r) : ref(r) {} williamr@2: T& ref; williamr@2: }; williamr@2: } williamr@2: williamr@2: template williamr@2: struct bgl_named_params : public Base williamr@2: { williamr@2: typedef bgl_named_params self; williamr@2: typedef Base next_type; williamr@2: typedef Tag tag_type; williamr@2: typedef T value_type; williamr@2: bgl_named_params(T v) : m_value(v) { } williamr@2: bgl_named_params(T v, const Base& b) : Base(b), m_value(v) { } williamr@2: T m_value; williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: weight_map(const WeightMap& pmap) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: weight_map2(const WeightMap& pmap) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: distance_map(const DistanceMap& pmap) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: predecessor_map(const PredecessorMap& pmap) const { williamr@2: typedef bgl_named_params williamr@2: Params; williamr@2: return Params(pmap, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: rank_map(const RankMap& pmap) const { williamr@2: typedef bgl_named_params williamr@2: Params; williamr@2: return Params(pmap, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: root_map(const RootMap& pmap) const { williamr@2: typedef bgl_named_params williamr@2: Params; williamr@2: return Params(pmap, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: root_vertex(const Vertex& r) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(r, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: edge_centrality_map(const EdgeCentralityMap& r) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(r, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: centrality_map(const CentralityMap& r) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(r, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: color_map(const ColorMap& pmap) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: vertex_color_map(const ColorMap& pmap) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: edge_color_map(const ColorMap& pmap) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: capacity_map(CapacityMap pmap) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: residual_capacity_map(Residual_CapacityMap pmap) { williamr@2: typedef bgl_named_params williamr@2: Params; williamr@2: return Params(pmap, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: reverse_edge_map(ReverseMap pmap) { williamr@2: typedef bgl_named_params williamr@2: Params; williamr@2: return Params(pmap, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: discover_time_map(const DiscoverTimeMap& pmap) const { williamr@2: typedef bgl_named_params williamr@2: Params; williamr@2: return Params(pmap, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: lowpoint_map(const LowPointMap& pmap) const { williamr@2: typedef bgl_named_params williamr@2: Params; williamr@2: return Params(pmap, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: vertex_index_map(const IndexMap& pmap) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: vertex_index1_map(const IndexMap& pmap) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: vertex_index2_map(const IndexMap& pmap) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: visitor(const Visitor& vis) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(vis, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: distance_compare(Compare cmp) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(cmp, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: distance_combine(Combine cmb) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(cmb, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: distance_inf(Init init) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(init, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: distance_zero(Init init) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(init, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params, buffer_param_t, self> williamr@2: buffer(Buffer& b) const { williamr@2: typedef bgl_named_params, buffer_param_t, self> williamr@2: Params; williamr@2: return Params(detail::wrap_ref(b), *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: edge_copy(const Copier& c) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: vertex_copy(const Copier& c) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: orig_to_copy(const Orig2CopyMap& c) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: isomorphism_map(const IsoMap& c) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: vertex_invariant(const VertexInvar& c) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: displacement_map(const VertexDisplacement& c) const { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: attractive_force(const AttractiveForce& c) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: repulsive_force(const RepulsiveForce& c) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: force_pairs(const ForcePairs& c) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: cooling(const Cooling& c) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: iterations(const TP& c) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params, diameter_range_t, self> williamr@2: diameter_range(const std::pair& c) { williamr@2: typedef bgl_named_params, diameter_range_t, self> Params; williamr@2: return Params(c, *this); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params, learning_constant_range_t, self> williamr@2: learning_constant_range(const std::pair& c) { williamr@2: typedef bgl_named_params, learning_constant_range_t, self> williamr@2: Params; williamr@2: return Params(c, *this); williamr@2: } williamr@2: }; williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: weight_map(WeightMap pmap) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: weight_map2(WeightMap pmap) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: distance_map(DistanceMap pmap) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: predecessor_map(PredecessorMap pmap) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: rank_map(RankMap pmap) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: root_map(RootMap pmap) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: root_vertex(const Vertex& r) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(r); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: edge_centrality_map(const EdgeCentralityMap& r) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(r); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: centrality_map(const CentralityMap& r) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(r); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: color_map(ColorMap pmap) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: capacity_map(CapacityMap pmap) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: residual_capacity_map(Residual_CapacityMap pmap) { williamr@2: typedef bgl_named_params williamr@2: Params; williamr@2: return Params(pmap); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: reverse_edge_map(ReverseMap pmap) { williamr@2: typedef bgl_named_params williamr@2: Params; williamr@2: return Params(pmap); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: discover_time_map(DiscoverTimeMap pmap) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: lowpoint_map(LowPointMap pmap) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: vertex_index_map(IndexMap pmap) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: vertex_index1_map(const IndexMap& pmap) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: vertex_index2_map(const IndexMap& pmap) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(pmap); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: visitor(const Visitor& vis) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(vis); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: distance_compare(Compare cmp) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(cmp); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: distance_combine(Combine cmb) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(cmb); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: distance_inf(Init init) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(init); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: distance_zero(Init init) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(init); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params, buffer_param_t> williamr@2: buffer(Buffer& b) { williamr@2: typedef bgl_named_params, buffer_param_t> Params; williamr@2: return Params(detail::wrap_ref(b)); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: edge_copy(const Copier& c) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: vertex_copy(const Copier& c) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: orig_to_copy(const Orig2CopyMap& c) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: isomorphism_map(const IsoMap& c) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: vertex_invariant(const VertexInvar& c) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: displacement_map(const VertexDisplacement& c) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: attractive_force(const AttractiveForce& c) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: repulsive_force(const RepulsiveForce& c) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: force_pairs(const ForcePairs& c) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: cooling(const Cooling& c) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params williamr@2: iterations(const T& c) { williamr@2: typedef bgl_named_params Params; williamr@2: return Params(c); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params, diameter_range_t> williamr@2: diameter_range(const std::pair& c) { williamr@2: typedef bgl_named_params, diameter_range_t> Params; williamr@2: return Params(c); williamr@2: } williamr@2: williamr@2: template williamr@2: bgl_named_params, learning_constant_range_t> williamr@2: learning_constant_range(const std::pair& c) { williamr@2: typedef bgl_named_params, learning_constant_range_t> williamr@2: Params; williamr@2: return Params(c); williamr@2: } williamr@2: williamr@2: //=========================================================================== williamr@2: // Functions for extracting parameters from bgl_named_params williamr@2: williamr@2: template williamr@2: inline williamr@2: typename property_value< bgl_named_params, Tag2>::type williamr@2: get_param(const bgl_named_params& p, Tag2 tag2) williamr@2: { williamr@2: enum { match = detail::same_property::value }; williamr@2: typedef typename williamr@2: property_value< bgl_named_params, Tag2>::type T2; williamr@2: T2* t2 = 0; williamr@2: typedef detail::property_value_dispatch Dispatcher; williamr@2: return Dispatcher::const_get_value(p, t2, tag2); williamr@2: } williamr@2: williamr@2: williamr@2: namespace detail { williamr@2: // MSVC++ workaround williamr@2: template williamr@2: struct choose_param_helper { williamr@2: template struct result { typedef Param type; }; williamr@2: template williamr@2: static const Param& apply(const Param& p, const Default&) { return p; } williamr@2: }; williamr@2: template <> williamr@2: struct choose_param_helper { williamr@2: template struct result { typedef Default type; }; williamr@2: template williamr@2: static const Default& apply(const error_property_not_found&, const Default& d) williamr@2: { return d; } williamr@2: }; williamr@2: } // namespace detail williamr@2: williamr@2: template williamr@2: const typename detail::choose_param_helper

::template result::type& williamr@2: choose_param(const P& param, const Default& d) { williamr@2: return detail::choose_param_helper

::apply(param, d); williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool is_default_param(const T&) { return false; } williamr@2: williamr@2: inline bool is_default_param(const detail::error_property_not_found&) williamr@2: { return true; } williamr@2: williamr@2: namespace detail { williamr@2: williamr@2: struct choose_parameter { williamr@2: template williamr@2: struct bind_ { williamr@2: typedef const P& const_result_type; williamr@2: typedef const P& result_type; williamr@2: typedef P type; williamr@2: }; williamr@2: williamr@2: template williamr@2: static typename bind_::const_result_type williamr@2: const_apply(const P& p, const Graph&, Tag&) williamr@2: { return p; } williamr@2: williamr@2: template williamr@2: static typename bind_::result_type williamr@2: apply(const P& p, Graph&, Tag&) williamr@2: { return p; } williamr@2: }; williamr@2: williamr@2: struct choose_default_param { williamr@2: template williamr@2: struct bind_ { williamr@2: typedef typename property_map::type williamr@2: result_type; williamr@2: typedef typename property_map::const_type williamr@2: const_result_type; williamr@2: typedef typename property_map::const_type williamr@2: type; williamr@2: }; williamr@2: williamr@2: template williamr@2: static typename bind_::const_result_type williamr@2: const_apply(const P&, const Graph& g, Tag tag) { williamr@2: return get(tag, g); williamr@2: } williamr@2: template williamr@2: static typename bind_::result_type williamr@2: apply(const P&, Graph& g, Tag tag) { williamr@2: return get(tag, g); williamr@2: } williamr@2: }; williamr@2: williamr@2: template williamr@2: struct choose_property_map { williamr@2: typedef choose_parameter type; williamr@2: }; williamr@2: template <> williamr@2: struct choose_property_map { williamr@2: typedef choose_default_param type; williamr@2: }; williamr@2: williamr@2: template williamr@2: struct choose_pmap_helper { williamr@2: typedef typename choose_property_map::type Selector; williamr@2: typedef typename Selector:: template bind_ Bind; williamr@2: typedef Bind type; williamr@2: typedef typename Bind::result_type result_type; williamr@2: typedef typename Bind::const_result_type const_result_type; williamr@2: typedef typename Bind::type result; williamr@2: }; williamr@2: williamr@2: // used in the max-flow algorithms williamr@2: template williamr@2: struct edge_capacity_value williamr@2: { williamr@2: typedef bgl_named_params Params; williamr@2: typedef typename property_value< Params, edge_capacity_t>::type Param; williamr@2: typedef typename detail::choose_pmap_helper::result CapacityEdgeMap; williamr@2: typedef typename property_traits::value_type type; williamr@2: }; williamr@2: williamr@2: } // namespace detail williamr@2: williamr@2: williamr@2: // Use this function instead of choose_param() when you want williamr@2: // to avoid requiring get(tag, g) when it is not used. williamr@2: template williamr@2: typename williamr@2: detail::choose_pmap_helper::const_result_type williamr@2: choose_const_pmap(const Param& p, const Graph& g, PropertyTag tag) williamr@2: { williamr@2: typedef typename williamr@2: detail::choose_pmap_helper::Selector Choice; williamr@2: return Choice::const_apply(p, g, tag); williamr@2: } williamr@2: williamr@2: template williamr@2: typename detail::choose_pmap_helper::result_type williamr@2: choose_pmap(const Param& p, Graph& g, PropertyTag tag) williamr@2: { williamr@2: typedef typename williamr@2: detail::choose_pmap_helper::Selector Choice; williamr@2: return Choice::apply(p, g, tag); williamr@2: } williamr@2: williamr@2: } // namespace boost williamr@2: williamr@2: #endif // BOOST_GRAPH_NAMED_FUNCTION_PARAMS_HPP