Chris@16: //======================================================================= Chris@16: // Copyright 1997, 1998, 1999, 2000 University of Notre Dame. Chris@16: // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: //======================================================================= Chris@16: Chris@16: #ifndef BOOST_GRAPH_NAMED_FUNCTION_PARAMS_HPP Chris@16: #define BOOST_GRAPH_NAMED_FUNCTION_PARAMS_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: struct parity_map_t { }; Chris@16: struct vertex_assignment_map_t { }; Chris@16: struct distance_compare_t { }; Chris@16: struct distance_combine_t { }; Chris@16: struct distance_inf_t { }; Chris@16: struct distance_zero_t { }; Chris@16: struct buffer_param_t { }; Chris@16: struct edge_copy_t { }; Chris@16: struct vertex_copy_t { }; Chris@16: struct vertex_isomorphism_t { }; Chris@16: struct vertex_invariant_t { }; Chris@16: struct vertex_invariant1_t { }; Chris@16: struct vertex_invariant2_t { }; Chris@16: struct edge_compare_t { }; Chris@16: struct vertex_max_invariant_t { }; Chris@16: struct orig_to_copy_t { }; Chris@16: struct root_vertex_t { }; Chris@16: struct polling_t { }; Chris@16: struct lookahead_t { }; Chris@16: struct in_parallel_t { }; Chris@16: struct attractive_force_t { }; Chris@16: struct repulsive_force_t { }; Chris@16: struct force_pairs_t { }; Chris@16: struct cooling_t { }; Chris@16: struct vertex_displacement_t { }; Chris@16: struct iterations_t { }; Chris@16: struct diameter_range_t { }; Chris@16: struct learning_constant_range_t { }; Chris@16: struct vertices_equivalent_t { }; Chris@16: struct edges_equivalent_t { }; Chris@16: struct index_in_heap_map_t { }; Chris@16: struct max_priority_queue_t { }; Chris@16: Chris@16: #define BOOST_BGL_DECLARE_NAMED_PARAMS \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(weight_map, edge_weight) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(weight_map2, edge_weight2) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(distance_map, vertex_distance) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(distance_map2, vertex_distance2) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(predecessor_map, vertex_predecessor) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(rank_map, vertex_rank) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(root_map, vertex_root) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(root_vertex, root_vertex) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(edge_centrality_map, edge_centrality) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(centrality_map, vertex_centrality) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(parity_map, parity_map) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(color_map, vertex_color) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(edge_color_map, edge_color) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(capacity_map, edge_capacity) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(residual_capacity_map, edge_residual_capacity) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(reverse_edge_map, edge_reverse) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(discover_time_map, vertex_discover_time) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(lowpoint_map, vertex_lowpoint) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(vertex_index_map, vertex_index) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(vertex_index1_map, vertex_index1) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(vertex_index2_map, vertex_index2) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(vertex_assignment_map, vertex_assignment_map) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(visitor, graph_visitor) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(distance_compare, distance_compare) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(distance_combine, distance_combine) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(distance_inf, distance_inf) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(distance_zero, distance_zero) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(edge_copy, edge_copy) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(vertex_copy, vertex_copy) \ Chris@16: BOOST_BGL_ONE_PARAM_REF(buffer, buffer_param) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(orig_to_copy, orig_to_copy) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(isomorphism_map, vertex_isomorphism) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(vertex_invariant, vertex_invariant) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(vertex_invariant1, vertex_invariant1) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(vertex_invariant2, vertex_invariant2) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(vertex_max_invariant, vertex_max_invariant) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(polling, polling) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(lookahead, lookahead) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(in_parallel, in_parallel) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(displacement_map, vertex_displacement) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(attractive_force, attractive_force) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(repulsive_force, repulsive_force) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(force_pairs, force_pairs) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(cooling, cooling) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(iterations, iterations) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(diameter_range, diameter_range) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(learning_constant_range, learning_constant_range) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(vertices_equivalent, vertices_equivalent) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(edges_equivalent, edges_equivalent) \ Chris@16: BOOST_BGL_ONE_PARAM_CREF(index_in_heap_map, index_in_heap_map) \ Chris@16: BOOST_BGL_ONE_PARAM_REF(max_priority_queue, max_priority_queue) Chris@16: Chris@16: template Chris@16: struct bgl_named_params Chris@16: { Chris@16: typedef bgl_named_params self; Chris@16: typedef Base next_type; Chris@16: typedef Tag tag_type; Chris@16: typedef T value_type; Chris@16: bgl_named_params(T v = T()) : m_value(v) { } Chris@16: bgl_named_params(T v, const Base& b) : m_value(v), m_base(b) { } Chris@16: T m_value; Chris@16: Base m_base; Chris@16: Chris@16: #define BOOST_BGL_ONE_PARAM_REF(name, key) \ Chris@16: template \ Chris@16: bgl_named_params, BOOST_PP_CAT(key, _t), self> \ Chris@16: name(PType& p) const { \ Chris@16: typedef bgl_named_params, BOOST_PP_CAT(key, _t), self> Params; \ Chris@16: return Params(boost::ref(p), *this); \ Chris@16: } \ Chris@16: Chris@16: #define BOOST_BGL_ONE_PARAM_CREF(name, key) \ Chris@16: template \ Chris@16: bgl_named_params \ Chris@16: name(const PType& p) const { \ Chris@16: typedef bgl_named_params Params; \ Chris@16: return Params(p, *this); \ Chris@16: } \ Chris@16: Chris@16: BOOST_BGL_DECLARE_NAMED_PARAMS Chris@16: Chris@16: #undef BOOST_BGL_ONE_PARAM_REF Chris@16: #undef BOOST_BGL_ONE_PARAM_CREF Chris@16: Chris@16: // Duplicate Chris@16: template Chris@16: bgl_named_params Chris@16: vertex_color_map(const PType& p) const {return this->color_map(p);} Chris@16: }; Chris@16: Chris@16: #define BOOST_BGL_ONE_PARAM_REF(name, key) \ Chris@16: template \ Chris@16: bgl_named_params, BOOST_PP_CAT(key, _t)> \ Chris@16: name(PType& p) { \ Chris@16: typedef bgl_named_params, BOOST_PP_CAT(key, _t)> Params; \ Chris@16: return Params(boost::ref(p)); \ Chris@16: } \ Chris@16: Chris@16: #define BOOST_BGL_ONE_PARAM_CREF(name, key) \ Chris@16: template \ Chris@16: bgl_named_params \ Chris@16: name(const PType& p) { \ Chris@16: typedef bgl_named_params Params; \ Chris@16: return Params(p); \ Chris@16: } \ Chris@16: Chris@16: BOOST_BGL_DECLARE_NAMED_PARAMS Chris@16: Chris@16: #undef BOOST_BGL_ONE_PARAM_REF Chris@16: #undef BOOST_BGL_ONE_PARAM_CREF Chris@16: Chris@16: // Duplicate Chris@16: template Chris@16: bgl_named_params Chris@16: vertex_color_map(const PType& p) {return color_map(p);} Chris@16: Chris@16: namespace detail { Chris@16: struct unused_tag_type {}; Chris@16: } Chris@16: typedef bgl_named_params no_named_parameters; Chris@16: Chris@16: //=========================================================================== Chris@16: // Functions for extracting parameters from bgl_named_params Chris@16: Chris@16: template Chris@16: struct lookup_named_param {}; Chris@16: Chris@16: template Chris@16: struct lookup_named_param > { Chris@16: typedef T type; Chris@16: static const T& get(const bgl_named_params& p) { Chris@16: return p.m_value; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct lookup_named_param > { Chris@16: typedef typename lookup_named_param::type type; Chris@16: static const type& get(const bgl_named_params& p) { Chris@16: return lookup_named_param::get(p.m_base); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct lookup_named_param_def { Chris@16: typedef Def type; Chris@16: static const Def& get(const Args&, const Def& def) {return def;} Chris@16: }; Chris@16: Chris@16: template Chris@16: struct lookup_named_param_def, Def> { Chris@16: typedef T type; Chris@16: static const type& get(const bgl_named_params& p, const Def&) { Chris@16: return p.m_value; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct lookup_named_param_def, Def> { Chris@16: typedef typename lookup_named_param_def::type type; Chris@16: static const type& get(const bgl_named_params& p, const Def& def) { Chris@16: return lookup_named_param_def::get(p.m_base, def); Chris@16: } Chris@16: }; Chris@16: Chris@16: struct param_not_found {}; Chris@16: Chris@16: template Chris@16: struct get_param_type: Chris@16: lookup_named_param_def {}; Chris@16: Chris@16: template Chris@16: inline Chris@16: const typename lookup_named_param_def::type& Chris@16: get_param(const Args& p, Tag) { Chris@16: return lookup_named_param_def::get(p, param_not_found()); Chris@16: } Chris@16: Chris@16: template Chris@16: const P& choose_param(const P& param, const Default&) { Chris@16: return param; Chris@16: } Chris@16: Chris@16: template Chris@16: Default choose_param(const param_not_found&, const Default& d) { Chris@16: return d; Chris@16: } Chris@16: Chris@16: template Chris@16: inline bool is_default_param(const T&) { return false; } Chris@16: Chris@16: inline bool is_default_param(const param_not_found&) Chris@16: { return true; } Chris@16: Chris@16: namespace detail { Chris@16: template Chris@16: struct const_type_as_type {typedef typename T::const_type type;}; Chris@16: } // namespace detail Chris@16: Chris@16: Chris@16: // Use this function instead of choose_param() when you want Chris@16: // to avoid requiring get(tag, g) when it is not used. Chris@16: namespace detail { Chris@16: template Chris@16: struct choose_impl_result: Chris@16: boost::mpl::eval_if< Chris@16: boost::is_same, Chris@16: boost::mpl::eval_if< Chris@16: GraphIsConst, Chris@16: detail::const_type_as_type >, Chris@16: property_map >, Chris@16: boost::mpl::identity > {}; Chris@16: Chris@16: // Parameters of f are (GraphIsConst, Graph, Param, Tag) Chris@16: template struct choose_impl_helper; Chris@16: Chris@16: template <> struct choose_impl_helper { Chris@16: template Chris@16: static typename property_map::type, PropertyTag>::const_type Chris@16: f(boost::mpl::true_, const Graph& g, const Param&, PropertyTag tag) { Chris@16: return get(tag, g); Chris@16: } Chris@16: Chris@16: template Chris@16: static typename property_map::type, PropertyTag>::type Chris@16: f(boost::mpl::false_, Graph& g, const Param&, PropertyTag tag) { Chris@16: return get(tag, g); Chris@16: } Chris@16: }; Chris@16: Chris@16: template <> struct choose_impl_helper { Chris@16: template Chris@16: static Param f(GraphIsConst, const Graph&, const Param& p, PropertyTag) { Chris@16: return p; Chris@16: } Chris@16: }; Chris@16: } Chris@16: Chris@16: template Chris@16: typename detail::choose_impl_result::type Chris@16: choose_const_pmap(const Param& p, const Graph& g, PropertyTag tag) Chris@16: { Chris@16: return detail::choose_impl_helper::value> Chris@16: ::f(boost::mpl::true_(), g, p, tag); Chris@16: } Chris@16: Chris@16: template Chris@16: typename detail::choose_impl_result::type Chris@16: choose_pmap(const Param& p, Graph& g, PropertyTag tag) Chris@16: { Chris@16: return detail::choose_impl_helper::value> Chris@16: ::f(boost::mpl::false_(), g, p, tag); Chris@16: } Chris@16: Chris@16: namespace detail { Chris@16: Chris@16: // used in the max-flow algorithms Chris@16: template Chris@16: struct edge_capacity_value Chris@16: { Chris@16: typedef bgl_named_params Params; Chris@16: typedef typename detail::choose_impl_result::type, edge_capacity_t>::type CapacityEdgeMap; Chris@16: typedef typename property_traits::value_type type; Chris@16: }; Chris@16: Chris@16: } Chris@16: Chris@16: // Declare all new tags Chris@16: namespace graph { Chris@16: namespace keywords { Chris@16: #define BOOST_BGL_ONE_PARAM_REF(name, key) BOOST_PARAMETER_NAME(name) Chris@16: #define BOOST_BGL_ONE_PARAM_CREF(name, key) BOOST_PARAMETER_NAME(name) Chris@16: BOOST_BGL_DECLARE_NAMED_PARAMS Chris@16: #undef BOOST_BGL_ONE_PARAM_REF Chris@16: #undef BOOST_BGL_ONE_PARAM_CREF Chris@16: } Chris@16: } Chris@16: Chris@16: namespace detail { Chris@16: template struct convert_one_keyword {}; Chris@16: #define BOOST_BGL_ONE_PARAM_REF(name, key) \ Chris@16: template <> \ Chris@16: struct convert_one_keyword { \ Chris@16: typedef boost::graph::keywords::tag::name type; \ Chris@16: }; Chris@16: #define BOOST_BGL_ONE_PARAM_CREF(name, key) BOOST_BGL_ONE_PARAM_REF(name, key) Chris@16: BOOST_BGL_DECLARE_NAMED_PARAMS Chris@16: #undef BOOST_BGL_ONE_PARAM_REF Chris@16: #undef BOOST_BGL_ONE_PARAM_CREF Chris@16: Chris@16: template Chris@16: struct convert_bgl_params_to_boost_parameter { Chris@16: typedef typename convert_one_keyword::type new_kw; Chris@16: typedef boost::parameter::aux::tagged_argument tagged_arg_type; Chris@16: typedef convert_bgl_params_to_boost_parameter rest_conv; Chris@16: typedef boost::parameter::aux::arg_list type; Chris@16: static type conv(const T& x) { Chris@16: return type(tagged_arg_type(x.m_value), rest_conv::conv(x.m_base)); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct convert_bgl_params_to_boost_parameter > { Chris@16: typedef convert_bgl_params_to_boost_parameter rest_conv; Chris@16: typedef typename rest_conv::type type; Chris@16: static type conv(const bgl_named_params& x) { Chris@16: return rest_conv::conv(x.m_base); Chris@16: } Chris@16: }; Chris@16: Chris@16: template <> Chris@16: struct convert_bgl_params_to_boost_parameter { Chris@16: typedef boost::parameter::aux::empty_arg_list type; Chris@16: static type conv(const boost::no_property&) {return type();} Chris@16: }; Chris@16: Chris@16: template <> Chris@16: struct convert_bgl_params_to_boost_parameter { Chris@16: typedef boost::parameter::aux::empty_arg_list type; Chris@16: static type conv(const boost::no_named_parameters&) {return type();} Chris@16: }; Chris@16: Chris@16: struct bgl_parameter_not_found_type {}; Chris@16: Chris@16: template Chris@16: struct parameter_exists : boost::mpl::not_::type, bgl_parameter_not_found_type> > {}; Chris@16: } Chris@16: Chris@16: #define BOOST_GRAPH_DECLARE_CONVERTED_PARAMETERS(old_type, old_var) \ Chris@16: typedef typename boost::detail::convert_bgl_params_to_boost_parameter::type arg_pack_type; \ Chris@16: arg_pack_type arg_pack = boost::detail::convert_bgl_params_to_boost_parameter::conv(old_var); Chris@16: Chris@16: namespace detail { Chris@16: Chris@16: template Chris@16: struct override_const_property_t { Chris@16: typedef typename boost::remove_const::type result_type; Chris@16: result_type operator()(const Graph&, const ArgType& a) const {return a;} Chris@16: }; Chris@16: Chris@16: template Chris@16: struct override_const_property_t { Chris@16: typedef typename boost::property_map::const_type result_type; Chris@16: result_type operator()(const Graph& g, const ArgType&) const {return get(Prop(), g);} Chris@16: }; Chris@16: Chris@16: template Chris@16: struct override_const_property_result { Chris@16: typedef Chris@16: typename override_const_property_t< Chris@16: typename boost::parameter::value_type::type, Chris@16: Prop, Chris@16: Graph, Chris@16: boost::detail::parameter_exists::value Chris@16: >::result_type Chris@16: type; Chris@16: }; Chris@16: Chris@16: template Chris@16: typename override_const_property_result::type Chris@16: override_const_property(const ArgPack& ap, const boost::parameter::keyword& t, const Graph& g, Prop) { Chris@16: return override_const_property_t< Chris@16: typename boost::parameter::value_type::type, Chris@16: Prop, Chris@16: Graph, Chris@16: boost::detail::parameter_exists::value Chris@16: >()(g, ap[t | 0]); Chris@16: } Chris@16: Chris@16: template Chris@16: struct override_property_t { Chris@16: typedef ArgType result_type; Chris@16: result_type operator()(const Graph&, const typename boost::add_reference::type a) const {return a;} Chris@16: }; Chris@16: Chris@16: template Chris@16: struct override_property_t { Chris@16: typedef typename boost::property_map::type result_type; Chris@16: result_type operator()(const Graph& g, const ArgType&) const {return get(Prop(), g);} Chris@16: }; Chris@16: Chris@16: template Chris@16: struct override_property_result { Chris@16: typedef Chris@16: typename override_property_t< Chris@16: typename boost::parameter::value_type::type, Chris@16: Prop, Chris@16: Graph, Chris@16: boost::detail::parameter_exists::value Chris@16: >::result_type Chris@16: type; Chris@16: }; Chris@16: Chris@16: template Chris@16: typename override_property_result::type Chris@16: override_property(const ArgPack& ap, const boost::parameter::keyword& t, const Graph& g, Prop) { Chris@16: return override_property_t< Chris@16: typename boost::parameter::value_type::type, Chris@16: Prop, Chris@16: Graph, Chris@16: boost::detail::parameter_exists::value Chris@16: >()(g, ap[t | 0]); Chris@16: } Chris@16: Chris@16: template struct make_arg_pack_type; Chris@16: template <> struct make_arg_pack_type {typedef boost::parameter::aux::empty_arg_list type;}; Chris@16: template Chris@16: struct make_arg_pack_type { Chris@16: typedef boost::parameter::aux::tagged_argument type; Chris@16: }; Chris@16: Chris@16: #define BOOST_GRAPH_OPENING_PART_OF_PAIR(z, i, n) boost::parameter::aux::arg_list, Chris@16: #define BOOST_GRAPH_MAKE_PAIR_PARAM(z, i, _) const boost::parameter::aux::tagged_argument& BOOST_PP_CAT(kw, i) Chris@16: Chris@16: #define BOOST_GRAPH_MAKE_AP_TYPE_SPECIALIZATION(z, i, _) \ Chris@16: template \ Chris@16: struct make_arg_pack_type { \ Chris@16: typedef \ Chris@16: BOOST_PP_REPEAT(i, BOOST_GRAPH_OPENING_PART_OF_PAIR, BOOST_PP_DEC(i)) boost::parameter::aux::empty_arg_list BOOST_PP_REPEAT(i, > BOOST_PP_TUPLE_EAT(3), ~) \ Chris@16: type; \ Chris@16: }; Chris@16: BOOST_PP_REPEAT_FROM_TO(2, 11, BOOST_GRAPH_MAKE_AP_TYPE_SPECIALIZATION, ~) Chris@16: #undef BOOST_GRAPH_MAKE_AP_TYPE_SPECIALIZATION Chris@16: Chris@16: #define BOOST_GRAPH_MAKE_FORWARDING_FUNCTION(name, nfixed, nnamed_max) \ Chris@16: /* Entry point for conversion from BGL-style named parameters */ \ Chris@16: template \ Chris@16: typename boost::result_of< \ Chris@16: detail::BOOST_PP_CAT(name, _impl)(BOOST_PP_ENUM_PARAMS(nfixed, Param) BOOST_PP_COMMA_IF(nfixed) const ArgPack&) \ Chris@16: >::type \ Chris@16: BOOST_PP_CAT(name, _with_named_params)(BOOST_PP_ENUM_BINARY_PARAMS(nfixed, const Param, & param) BOOST_PP_COMMA_IF(nfixed) const ArgPack& arg_pack) { \ Chris@16: return detail::BOOST_PP_CAT(name, _impl)()(BOOST_PP_ENUM_PARAMS(nfixed, param) BOOST_PP_COMMA_IF(nfixed) arg_pack); \ Chris@16: } \ Chris@16: /* Individual functions taking Boost.Parameter-style keyword arguments */ \ Chris@16: BOOST_PP_REPEAT(BOOST_PP_INC(nnamed_max), BOOST_GRAPH_MAKE_FORWARDING_FUNCTION_ONE, (name)(nfixed)) Chris@16: Chris@16: #define BOOST_GRAPH_MAKE_FORWARDING_FUNCTION_ONE(z, nnamed, seq) \ Chris@16: BOOST_GRAPH_MAKE_FORWARDING_FUNCTION_ONEX(z, nnamed, BOOST_PP_SEQ_ELEM(0, seq), BOOST_PP_SEQ_ELEM(1, seq)) Chris@16: Chris@16: #define BOOST_GRAPH_MAKE_FORWARDING_FUNCTION_ONEX(z, nnamed, name, nfixed) \ Chris@16: template \ Chris@16: typename boost::result_of< \ Chris@16: detail::BOOST_PP_CAT(name, _impl) \ Chris@16: (BOOST_PP_ENUM_PARAMS(nfixed, Param) BOOST_PP_COMMA_IF(nfixed) \ Chris@16: const typename boost::detail::make_arg_pack_type::type&) \ Chris@16: >::type \ Chris@16: name(BOOST_PP_ENUM_BINARY_PARAMS(nfixed, const Param, & param) \ Chris@16: BOOST_PP_ENUM_TRAILING(nnamed, BOOST_GRAPH_MAKE_PAIR_PARAM, ~)) { \ Chris@16: return detail::BOOST_PP_CAT(name, _impl)() \ Chris@16: (BOOST_PP_ENUM_PARAMS(nfixed, param), \ Chris@16: (boost::parameter::aux::empty_arg_list() BOOST_PP_ENUM_TRAILING_PARAMS(nnamed, kw))); \ Chris@16: } Chris@16: Chris@16: #define BOOST_GRAPH_MAKE_OLD_STYLE_PARAMETER_FUNCTION(name, nfixed) \ Chris@16: template \ Chris@16: typename boost::result_of< \ Chris@16: ::boost::graph::detail::BOOST_PP_CAT(name, _impl) BOOST_PP_EXPR_IF(nfixed, <) BOOST_PP_ENUM_PARAMS(nfixed, Param) BOOST_PP_EXPR_IF(nfixed, >) \ Chris@16: (BOOST_PP_ENUM_PARAMS(nfixed, Param) BOOST_PP_COMMA_IF(nfixed) \ Chris@16: const typename boost::detail::convert_bgl_params_to_boost_parameter >::type &) \ Chris@16: >::type \ Chris@16: name(BOOST_PP_ENUM_BINARY_PARAMS(nfixed, const Param, & param) BOOST_PP_COMMA_IF(nfixed) const boost::bgl_named_params& old_style_params) { \ Chris@16: typedef boost::bgl_named_params old_style_params_type; \ Chris@16: BOOST_GRAPH_DECLARE_CONVERTED_PARAMETERS(old_style_params_type, old_style_params) \ Chris@16: return ::boost::graph::BOOST_PP_CAT(name, _with_named_params)(BOOST_PP_ENUM_PARAMS(nfixed, param) BOOST_PP_COMMA_IF(nfixed) arg_pack); \ Chris@16: } \ Chris@16: \ Chris@16: BOOST_PP_EXPR_IF(nfixed, template <) BOOST_PP_ENUM_PARAMS(nfixed, typename Param) BOOST_PP_EXPR_IF(nfixed, >) \ Chris@16: BOOST_PP_EXPR_IF(nfixed, typename) boost::result_of< \ Chris@16: ::boost::graph::detail::BOOST_PP_CAT(name, _impl) BOOST_PP_EXPR_IF(nfixed, <) BOOST_PP_ENUM_PARAMS(nfixed, Param) BOOST_PP_EXPR_IF(nfixed, >) \ Chris@16: (BOOST_PP_ENUM_PARAMS(nfixed, Param) BOOST_PP_COMMA_IF(nfixed) const boost::parameter::aux::empty_arg_list &) \ Chris@16: >::type \ Chris@16: name(BOOST_PP_ENUM_BINARY_PARAMS(nfixed, const Param, & param)) { \ Chris@16: BOOST_GRAPH_DECLARE_CONVERTED_PARAMETERS(boost::no_named_parameters, boost::no_named_parameters()) \ Chris@16: return ::boost::graph::BOOST_PP_CAT(name, _with_named_params)(BOOST_PP_ENUM_PARAMS(nfixed, param) BOOST_PP_COMMA_IF(nfixed) arg_pack); \ Chris@16: } Chris@16: Chris@16: } Chris@16: Chris@16: namespace detail { Chris@16: Chris@16: template Chris@16: struct map_maker_helper { Chris@16: typedef PM map_type; Chris@16: static PM make_map(const Graph&, Value, const PM& pm, const ArgPack&) { Chris@16: return pm; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct map_maker_helper { Chris@16: typedef typename boost::remove_const< Chris@16: typename override_const_property_t< Chris@16: typename boost::parameter::value_type< Chris@16: ArgPack, boost::graph::keywords::tag::vertex_index_map, int>::type, Chris@16: boost::vertex_index_t, Chris@16: Graph, Chris@16: boost::detail::parameter_exists< Chris@16: ArgPack, boost::graph::keywords::tag::vertex_index_map>::value Chris@16: >::result_type>::type vi_map_type; Chris@16: typedef Chris@16: boost::shared_array_property_map Chris@16: map_type; Chris@16: static map_type make_map(const Graph& g, Chris@16: Value v, Chris@16: const PM&, Chris@16: const ArgPack& ap) { Chris@16: return make_shared_array_property_map( Chris@16: num_vertices(g), Chris@16: v, Chris@16: override_const_property( Chris@16: ap, Chris@16: boost::graph::keywords::_vertex_index_map, Chris@16: g, vertex_index)); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct map_maker { Chris@16: BOOST_STATIC_CONSTANT( Chris@16: bool, Chris@16: has_map = Chris@16: (parameter_exists Chris@16: ::value)); Chris@16: typedef map_maker_helper::type Chris@16: >::type> helper; Chris@16: typedef typename helper::map_type map_type; Chris@16: static map_type make_map(const Graph& g, const ArgPack& ap, ValueType default_value) { Chris@16: return helper::make_map(g, default_value, ap[::boost::parameter::keyword::instance | 0], ap); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: class make_property_map_from_arg_pack_gen { Chris@16: ValueType default_value; Chris@16: Chris@16: public: Chris@16: make_property_map_from_arg_pack_gen(ValueType default_value) Chris@16: : default_value(default_value) {} Chris@16: Chris@16: template Chris@16: typename map_maker::map_type Chris@16: operator()(const Graph& g, const ArgPack& ap) const { Chris@16: return map_maker::make_map(g, ap, default_value); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: class make_property_map_from_arg_pack_gen { Chris@16: public: Chris@16: template Chris@16: typename map_maker::map_type Chris@16: operator()(const Graph& g, const ArgPack& ap, ValueType default_value) const { Chris@16: return map_maker::make_map(g, ap, default_value); Chris@16: } Chris@16: }; Chris@16: Chris@16: static const Chris@16: make_property_map_from_arg_pack_gen< Chris@16: boost::graph::keywords::tag::color_map, Chris@16: default_color_type> Chris@16: make_color_map_from_arg_pack(white_color); Chris@16: Chris@16: template Chris@16: struct priority_queue_maker_helper { Chris@16: typedef Q priority_queue_type; Chris@16: Chris@16: static priority_queue_type Chris@16: make_queue(const Graph&, const ArgPack&, KeyT, const Q& q) { Chris@16: return q; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct priority_queue_maker_helper { Chris@16: typedef typename std::vector::size_type default_index_in_heap_type; Chris@16: typedef typename map_maker::helper::map_type index_in_heap_map; Chris@16: typedef boost::d_ary_heap_indirect::helper::map_type, Compare> priority_queue_type; Chris@16: Chris@16: static priority_queue_type Chris@16: make_queue(const Graph& g, const ArgPack& ap, KeyT defaultKey, const Q&) { Chris@16: return priority_queue_type( Chris@16: map_maker::make_map(g, ap, defaultKey), Chris@16: map_maker::make_map(g, ap, typename boost::property_traits::value_type(-1)) Chris@16: ); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct priority_queue_maker { Chris@16: BOOST_STATIC_CONSTANT( Chris@16: bool, Chris@16: g_hasQ = Chris@16: (parameter_exists Chris@16: ::value)); Chris@16: typedef boost::reference_wrapper int_refw; Chris@16: typedef typename boost::parameter::value_type< Chris@16: ArgPack, Chris@16: PriorityQueueTag, Chris@16: int_refw Chris@16: >::type Chris@16: param_value_type_wrapper; Chris@16: typedef typename param_value_type_wrapper::type Chris@16: param_value_type; Chris@16: typedef typename boost::remove_const::type param_value_type_no_const; Chris@16: typedef priority_queue_maker_helper helper; Chris@16: typedef typename helper::priority_queue_type priority_queue_type; Chris@16: Chris@16: static priority_queue_type make_queue(const Graph& g, const ArgPack& ap, KeyT defaultKey) { Chris@16: return helper::make_queue(g, ap, defaultKey, ap[::boost::parameter::keyword::instance | 0]); Chris@16: } Chris@16: }; Chris@16: Chris@16: template , class KeyMapTag = boost::graph::keywords::tag::distance_map, class IndexInHeapMapTag = boost::graph::keywords::tag::index_in_heap_map> Chris@16: struct make_priority_queue_from_arg_pack_gen { Chris@16: KeyT defaultKey; Chris@16: Chris@16: make_priority_queue_from_arg_pack_gen(KeyT defaultKey_) : defaultKey(defaultKey_) { } Chris@16: Chris@16: template Chris@16: struct result { Chris@16: typedef typename remove_const::arg1_type>::type>::type graph_type; Chris@16: typedef typename remove_const::arg2_type>::type>::type arg_pack_type; Chris@16: typedef typename priority_queue_maker::priority_queue_type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: typename priority_queue_maker::priority_queue_type Chris@16: operator()(const Graph& g, const ArgPack& ap) const { Chris@16: return priority_queue_maker::make_queue(g, ap, defaultKey); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: typename boost::graph_traits::vertex_descriptor Chris@16: get_null_vertex(const G&) {return boost::graph_traits::null_vertex();} Chris@16: Chris@16: template Chris@16: typename boost::graph_traits::vertex_descriptor Chris@16: get_default_starting_vertex(const G& g) { Chris@16: std::pair::vertex_iterator, typename boost::graph_traits::vertex_iterator> iters = vertices(g); Chris@16: return (iters.first == iters.second) ? boost::graph_traits::null_vertex() : *iters.first; Chris@16: } Chris@16: Chris@16: template Chris@16: struct get_default_starting_vertex_t { Chris@16: typedef typename boost::graph_traits::vertex_descriptor result_type; Chris@16: const G& g; Chris@16: get_default_starting_vertex_t(const G& g): g(g) {} Chris@16: result_type operator()() const {return get_default_starting_vertex(g);} Chris@16: }; Chris@16: Chris@16: // Wrapper to avoid instantiating numeric_limits when users provide distance_inf value manually Chris@16: template Chris@16: struct get_max { Chris@16: T operator()() const { Chris@16: return (std::numeric_limits::max)(); Chris@16: } Chris@16: typedef T result_type; Chris@16: }; Chris@16: Chris@16: } // namespace detail Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #undef BOOST_BGL_DECLARE_NAMED_PARAMS Chris@16: Chris@16: #endif // BOOST_GRAPH_NAMED_FUNCTION_PARAMS_HPP