本文主要是介绍boost.graph之属性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
相关宏
BOOST_INSTALL_PROPERTY
#define BOOST_INSTALL_PROPERTY(KIND, NAME) \template <> struct property_kind<KIND##_##NAME##_t> { \typedef KIND##_property_tag type; \}
最终形式为
template <>
struct property_kind<KIND_NAME_t>
{typedef KIND_property_tag type;
}
是property_kind的模板特例化,看是点属性还是边属性
BOOST_DEF_PROPERTY
#define BOOST_DEF_PROPERTY(KIND, NAME) \enum KIND##_##NAME##_t { KIND##_##NAME }; \BOOST_INSTALL_PROPERTY(KIND, NAME)
最终形式为
enum KIND_NAME_T {KIND_NAME};
template <>
struct property_kind<KIND_NAME_t>
{typedef KIND_property_tag type;
}
定义边或者点的枚举,同时确定是边属性还是点属性
支持的点边属性
BOOST_INSTALL_PROPERTY(vertex, all);BOOST_INSTALL_PROPERTY(edge, all);BOOST_INSTALL_PROPERTY(graph, all);BOOST_DEF_PROPERTY(vertex, index);BOOST_DEF_PROPERTY(vertex, index1);BOOST_DEF_PROPERTY(vertex, index2);BOOST_DEF_PROPERTY(vertex, root);BOOST_DEF_PROPERTY(edge, index);BOOST_DEF_PROPERTY(edge, name);BOOST_DEF_PROPERTY(edge, weight);BOOST_DEF_PROPERTY(edge, weight2);BOOST_DEF_PROPERTY(edge, color);BOOST_DEF_PROPERTY(vertex, name);BOOST_DEF_PROPERTY(graph, name);BOOST_DEF_PROPERTY(vertex, distance);BOOST_DEF_PROPERTY(vertex, distance2);BOOST_DEF_PROPERTY(vertex, color);BOOST_DEF_PROPERTY(vertex, degree);BOOST_DEF_PROPERTY(vertex, in_degree);BOOST_DEF_PROPERTY(vertex, out_degree);BOOST_DEF_PROPERTY(vertex, current_degree);BOOST_DEF_PROPERTY(vertex, priority);BOOST_DEF_PROPERTY(vertex, discover_time);BOOST_DEF_PROPERTY(vertex, finish_time);BOOST_DEF_PROPERTY(vertex, predecessor);BOOST_DEF_PROPERTY(vertex, rank);BOOST_DEF_PROPERTY(vertex, centrality);BOOST_DEF_PROPERTY(vertex, lowpoint);BOOST_DEF_PROPERTY(vertex, potential);BOOST_DEF_PROPERTY(vertex, update);BOOST_DEF_PROPERTY(vertex, underlying);BOOST_DEF_PROPERTY(edge, reverse);BOOST_DEF_PROPERTY(edge, capacity);BOOST_DEF_PROPERTY(edge, flow);BOOST_DEF_PROPERTY(edge, residual_capacity);BOOST_DEF_PROPERTY(edge, centrality);BOOST_DEF_PROPERTY(edge, discover_time);BOOST_DEF_PROPERTY(edge, update);BOOST_DEF_PROPERTY(edge, finished);BOOST_DEF_PROPERTY(edge, underlying);BOOST_DEF_PROPERTY(graph, visitor);// These tags are used for property bundles// These three are defined in boost/pending/property.hppBOOST_INSTALL_PROPERTY(graph, bundle);BOOST_INSTALL_PROPERTY(vertex, bundle);BOOST_INSTALL_PROPERTY(edge, bundle);// These tags are used to denote the owners and local descriptors// for the vertices and edges of a distributed graph.BOOST_DEF_PROPERTY(vertex, global);BOOST_DEF_PROPERTY(vertex, owner);BOOST_DEF_PROPERTY(vertex, local);BOOST_DEF_PROPERTY(edge, global);BOOST_DEF_PROPERTY(edge, owner);BOOST_DEF_PROPERTY(edge, local);BOOST_DEF_PROPERTY(vertex, local_index);BOOST_DEF_PROPERTY(edge, local_index);
获取属性类型
property_kind_from_graph,其定义为
template <typename G, typename Tag>struct property_kind_from_graph: property_kind<Tag> {};
使用
get分发
通过判断属性是边属性还是点属性分发到具体的函数
template <class Config, class Base, class Property>inlinetypename boost::property_map<typename Config::graph_type, Property>::typeget(Property p, adj_list_helper<Config, Base>& g) {typedef typename detail::property_kind_from_graph<adj_list_helper<Config, Base>, Property>::type Kind;return detail::get_dispatch(g, p, Kind());}
如果是边属性,分发到
template <class Config, class Base, class Property>inlinetypename boost::property_map<typename Config::graph_type,Property>::typeget_dispatch(adj_list_helper<Config,Base>&, Property p,boost::edge_property_tag) {typedef typename Config::graph_type Graph;typedef typename boost::property_map<Graph, Property>::type PA;return PA(p);}
如果是点属性,分发到
template <class Config, class Base, class Property>inlinetypename boost::property_map<typename Config::graph_type,Property>::typeget_dispatch(adj_list_helper<Config,Base>& g, Property p,boost::vertex_property_tag) {typedef typename Config::graph_type Graph;typedef typename boost::property_map<Graph, Property>::type PA;return PA(&static_cast<Graph&>(g), p);}
property_map
根据属性看继承edge_property_map还是vertex_property_map
template <class Graph, class Property, class Enable = void>struct property_map:mpl::if_<is_same<typename detail::property_kind_from_graph<Graph, Property>::type, edge_property_tag>,detail::edge_property_map<Graph, Property>,detail::vertex_property_map<Graph, Property> >::type{};
这篇关于boost.graph之属性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!