Added boost header
This commit is contained in:
117
test/external/boost/graph/exterior_property.hpp
vendored
Normal file
117
test/external/boost/graph/exterior_property.hpp
vendored
Normal file
@@ -0,0 +1,117 @@
|
||||
// (C) Copyright 2007-2009 Andrew Sutton
|
||||
//
|
||||
// Use, modification and distribution are subject to the
|
||||
// Boost Software License, Version 1.0 (See accompanying file
|
||||
// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_GRAPH_EXTERIOR_PROPERTY_HPP
|
||||
#define BOOST_GRAPH_EXTERIOR_PROPERTY_HPP
|
||||
|
||||
#include <vector>
|
||||
#include <boost/graph/property_maps/container_property_map.hpp>
|
||||
#include <boost/graph/property_maps/matrix_property_map.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace detail {
|
||||
// The vector matrix provides a little abstraction over vector
|
||||
// types that makes matrices easier to work with. Note that it's
|
||||
// non-copyable, meaning you should be passing it by value.
|
||||
template <typename Value>
|
||||
struct vector_matrix
|
||||
{
|
||||
typedef std::vector<Value> container_type;
|
||||
typedef std::vector<container_type> matrix_type;
|
||||
|
||||
typedef container_type value_type;
|
||||
typedef container_type& reference;
|
||||
typedef const container_type const_reference;
|
||||
typedef container_type* pointer;
|
||||
typedef typename matrix_type::size_type size_type;
|
||||
|
||||
// Instantiate the matrix over n elements (creates an nxn matrix).
|
||||
// The graph has to be passed in order to ensure the index maps
|
||||
// are constructed correctly when returning indexible elements.
|
||||
inline vector_matrix(size_type n)
|
||||
: m_matrix(n, container_type(n))
|
||||
{ }
|
||||
|
||||
inline reference operator [](size_type n)
|
||||
{ return m_matrix[n]; }
|
||||
|
||||
inline const_reference operator [](size_type n) const
|
||||
{ return m_matrix[n]; }
|
||||
|
||||
matrix_type m_matrix;
|
||||
};
|
||||
} /* namespace detail */
|
||||
|
||||
/**
|
||||
* The exterior_property metafunction defines an appropriate set of types for
|
||||
* creating an exterior property. An exterior property is comprised of a both
|
||||
* a container and a property map that acts as its abstraction. An extension
|
||||
* of this metafunction will select an appropriate "matrix" property that
|
||||
* records values for pairs of vertices.
|
||||
*
|
||||
* @todo This does not currently support the ability to define exterior
|
||||
* properties for graph types that do not model the IndexGraph concepts. A
|
||||
* solution should not be especially difficult, but will require an extension
|
||||
* of type traits to affect the type selection.
|
||||
*/
|
||||
template <typename Graph, typename Key, typename Value>
|
||||
struct exterior_property
|
||||
{
|
||||
typedef Key key_type;
|
||||
typedef Value value_type;
|
||||
|
||||
typedef std::vector<Value> container_type;
|
||||
typedef container_property_map<Graph, Key, container_type> map_type;
|
||||
|
||||
typedef detail::vector_matrix<Value> matrix_type;
|
||||
typedef matrix_property_map<Graph, Key, matrix_type> matrix_map_type;
|
||||
|
||||
private:
|
||||
exterior_property() { }
|
||||
exterior_property(const exterior_property&) { }
|
||||
};
|
||||
|
||||
/**
|
||||
* Define a the container and property map types requried to create an exterior
|
||||
* vertex property for the given value type. The Graph parameter is required to
|
||||
* model the VertexIndexGraph concept.
|
||||
*/
|
||||
template <typename Graph, typename Value>
|
||||
struct exterior_vertex_property
|
||||
{
|
||||
typedef exterior_property<
|
||||
Graph, typename graph_traits<Graph>::vertex_descriptor, Value
|
||||
> property_type;
|
||||
typedef typename property_type::key_type key_type;
|
||||
typedef typename property_type::value_type value_type;
|
||||
typedef typename property_type::container_type container_type;
|
||||
typedef typename property_type::map_type map_type;
|
||||
typedef typename property_type::matrix_type matrix_type;
|
||||
typedef typename property_type::matrix_map_type matrix_map_type;
|
||||
};
|
||||
|
||||
/**
|
||||
* Define a the container and property map types requried to create an exterior
|
||||
* edge property for the given value type. The Graph parameter is required to
|
||||
* model the EdgeIndexGraph concept.
|
||||
*/
|
||||
template <typename Graph, typename Value>
|
||||
struct exterior_edge_property
|
||||
{
|
||||
typedef exterior_property<
|
||||
Graph, typename graph_traits<Graph>::edge_descriptor, Value
|
||||
> property_type;
|
||||
typedef typename property_type::key_type key_type;
|
||||
typedef typename property_type::value_type value_type;
|
||||
typedef typename property_type::container_type container_type;
|
||||
typedef typename property_type::map_type map_type;
|
||||
typedef typename property_type::matrix_type matrix_type;
|
||||
typedef typename property_type::matrix_map_type matrix_map_type;
|
||||
};
|
||||
|
||||
} /* namespace boost */
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user