Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/graph/graph_as_tree.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children | c530137014c0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/graph/graph_as_tree.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,154 @@ +// +//======================================================================= +// Copyright 1997, 1998, 1999, 2000 University of Notre Dame. +// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek +// +// 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) +//======================================================================= +// +#ifndef BOOST_GRAPH_GRAPH_AS_TREE_HPP +#define BOOST_GRAPH_GRAPH_AS_TREE_HPP + +#include <vector> +#include <boost/config.hpp> +#include <boost/property_map/property_map.hpp> +#include <boost/graph/tree_traits.hpp> +#include <boost/graph/graph_traits.hpp> +#include <boost/graph/breadth_first_search.hpp> +#include <boost/graph/visitors.hpp> + +namespace boost { + + template <class Graph, class Node, class ChIt, class Derived> + class graph_as_tree_base + { + typedef Derived Tree; + public: + typedef Node node_descriptor; + typedef ChIt children_iterator; + + graph_as_tree_base(Graph& g, Node root) : _g(g), _root(root) { } + + friend Node root(const Tree& t) { return t._root; } + + template <class N> + friend std::pair<ChIt,ChIt> + children(N n, const Tree& t) { return adjacent_vertices(n, t._g); } + + template<class N> + friend Node parent(N n, const Tree& t) { + return boost::get(t.parent_pa(), n); + } + + Graph& _g; + Node _root; + }; + + struct graph_as_tree_tag { }; + + template <class Graph, class ParentMap + , class Node +#if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION + = typename graph_traits<Graph>::vertex_descriptor +#endif + , class ChIt +#if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION + = typename graph_traits<Graph>::adjacency_iterator +#endif + > + class graph_as_tree + : public graph_as_tree_base<Graph, Node, ChIt, + graph_as_tree<Graph,ParentMap,Node,ChIt> > + { + typedef graph_as_tree self; + typedef graph_as_tree_base<Graph, Node, ChIt, self> super; + public: + graph_as_tree(Graph& g, Node root) : super(g, root) { } + + graph_as_tree(Graph& g, Node root, ParentMap p) : super(g, root), _p(p) { + breadth_first_search(g, root, + visitor(make_bfs_visitor + (record_predecessors(p, boost::on_tree_edge())))); + } + ParentMap parent_pa() const { return _p; } + typedef graph_as_tree_tag graph_tag; // for property_map + protected: + ParentMap _p; + }; + + + namespace detail { + + struct graph_as_tree_vertex_property_selector { + template <typename GraphAsTree, typename Property, typename Tag> + struct bind_ { + typedef typename GraphAsTree::base_type Graph; + typedef property_map<Graph, Tag> PMap; + typedef typename PMap::type type; + typedef typename PMap::const_type const_type; + }; + }; + + struct graph_as_tree_edge_property_selector { + template <typename GraphAsTree, typename Property, typename Tag> + struct bind_ { + typedef typename GraphAsTree::base_type Graph; + typedef property_map<Graph, Tag> PMap; + typedef typename PMap::type type; + typedef typename PMap::const_type const_type; + }; + }; + + } // namespace detail + + template <> + struct vertex_property_selector<graph_as_tree_tag> { + typedef detail::graph_as_tree_vertex_property_selector type; + }; + + template <> + struct edge_property_selector<graph_as_tree_tag> { + typedef detail::graph_as_tree_edge_property_selector type; + }; + + template <typename Graph, typename P, typename N, typename C, + typename Property> + typename property_map<Graph, Property>::type + get(Property p, graph_as_tree<Graph,P,N,C>& g) + { + return get(p, g._g); + } + + template <typename Graph, typename P, typename N, typename C, + typename Property> + typename property_map<Graph, Property>::const_type + get(Property p, const graph_as_tree<Graph,P,N,C>& g) + { + const Graph& gref = g._g; // in case GRef is non-const + return get(p, gref); + } + + template <typename Graph, typename P, typename N, typename C, + typename Property, typename Key> + typename property_traits< + typename property_map<Graph, Property>::const_type + >::value_type + get(Property p, const graph_as_tree<Graph,P,N,C>& g, const Key& k) + { + return get(p, g._g, k); + } + + template <typename Graph, typename P, typename N, typename C, + typename Property, typename Key, typename Value> + void + put(Property p, const graph_as_tree<Graph,P,N,C>& g, const Key& k, + const Value& val) + { + put(p, g._g, k, val); + } + +} // namespace boost + +#endif // BOOST_GRAPH_GRAPH_AS_TREE_HPP