Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/graph/property_iter_range.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/graph/property_iter_range.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,118 @@ + +// (C) Copyright Francois Faure, iMAGIS-GRAVIR / UJF, 2001. +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// Revision History: +// 03 May 2001 Jeremy Siek +// Generalized the property map iterator and moved that +// part to boost/property_map.hpp. Also modified to +// differentiate between const/mutable graphs and +// added a workaround to avoid partial specialization. + +// 02 May 2001 Francois Faure +// Initial version. + +#ifndef BOOST_GRAPH_PROPERTY_ITER_RANGE_HPP +#define BOOST_GRAPH_PROPERTY_ITER_RANGE_HPP + +#include <boost/property_map/property_map_iterator.hpp> +#include <boost/graph/properties.hpp> +#include <boost/mpl/if.hpp> +#include <boost/type_traits/same_traits.hpp> + +namespace boost { + +//====================================================================== +// graph property iterator range + + template <class Graph, class PropertyTag> + class graph_property_iter_range { + typedef typename property_map<Graph, PropertyTag>::type map_type; + typedef typename property_map<Graph, PropertyTag>::const_type + const_map_type; + typedef typename property_kind<PropertyTag>::type Kind; + typedef typename mpl::if_c<is_same<Kind, vertex_property_tag>::value, + typename graph_traits<Graph>::vertex_iterator, + typename graph_traits<Graph>::edge_iterator>::type iter; + public: + typedef typename property_map_iterator_generator<map_type, iter>::type + iterator; + typedef typename property_map_iterator_generator<const_map_type, iter> + ::type const_iterator; + typedef std::pair<iterator, iterator> type; + typedef std::pair<const_iterator, const_iterator> const_type; + }; + + namespace detail { + + template<class Graph,class Tag> + typename graph_property_iter_range<Graph,Tag>::type + get_property_iter_range_kind(Graph& graph, const Tag& tag, + const vertex_property_tag& ) + { + typedef typename graph_property_iter_range<Graph,Tag>::iterator iter; + return std::make_pair(iter(vertices(graph).first, get(tag, graph)), + iter(vertices(graph).second, get(tag, graph))); + } + + template<class Graph,class Tag> + typename graph_property_iter_range<Graph,Tag>::const_type + get_property_iter_range_kind(const Graph& graph, const Tag& tag, + const vertex_property_tag& ) + { + typedef typename graph_property_iter_range<Graph,Tag> + ::const_iterator iter; + return std::make_pair(iter(vertices(graph).first, get(tag, graph)), + iter(vertices(graph).second, get(tag, graph))); + } + + + template<class Graph,class Tag> + typename graph_property_iter_range<Graph,Tag>::type + get_property_iter_range_kind(Graph& graph, const Tag& tag, + const edge_property_tag& ) + { + typedef typename graph_property_iter_range<Graph,Tag>::iterator iter; + return std::make_pair(iter(edges(graph).first, get(tag, graph)), + iter(edges(graph).second, get(tag, graph))); + } + + template<class Graph,class Tag> + typename graph_property_iter_range<Graph,Tag>::const_type + get_property_iter_range_kind(const Graph& graph, const Tag& tag, + const edge_property_tag& ) + { + typedef typename graph_property_iter_range<Graph,Tag> + ::const_iterator iter; + return std::make_pair(iter(edges(graph).first, get(tag, graph)), + iter(edges(graph).second, get(tag, graph))); + } + + } // namespace detail + + //====================================================================== + // get an iterator range of properties + + template<class Graph, class Tag> + typename graph_property_iter_range<Graph, Tag>::type + get_property_iter_range(Graph& graph, const Tag& tag) + { + typedef typename property_kind<Tag>::type Kind; + return detail::get_property_iter_range_kind(graph, tag, Kind()); + } + + template<class Graph, class Tag> + typename graph_property_iter_range<Graph, Tag>::const_type + get_property_iter_range(const Graph& graph, const Tag& tag) + { + typedef typename property_kind<Tag>::type Kind; + return detail::get_property_iter_range_kind(graph, tag, Kind()); + } + +} // namespace boost + + +#endif // BOOST_GRAPH_PROPERTY_ITER_RANGE_HPP