Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/graph/parallel/properties.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/parallel/properties.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,111 @@ +// Copyright 2004 The Trustees of Indiana University. + +// Use, modification and distribution is subject to 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) + +// Authors: Douglas Gregor +// Andrew Lumsdaine + +#ifndef BOOST_GRAPH_PARALLEL_PROPERTIES_HPP +#define BOOST_GRAPH_PARALLEL_PROPERTIES_HPP + +#ifndef BOOST_GRAPH_USE_MPI +#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included" +#endif + +#include <boost/graph/properties.hpp> +#include <boost/property_map/parallel/distributed_property_map.hpp> + +namespace boost { + /*************************************************************************** + * Property map reduction operations + ***************************************************************************/ + /** + * Metafunction that produces a reduction operation for the given + * property. The default behavior merely forwards to @ref + * basic_reduce, but it is expected that this class template will be + * specified for important properties. + */ + template<typename Property> + struct property_reduce + { + template<typename Value> + class apply : public parallel::basic_reduce<Value> {}; + }; + + /** + * Reduction of vertex colors can only darken, not lighten, the + * color. Black cannot turn black, grey can only turn black, and + * white can be changed to either color. The default color is white. + */ + template<> + struct property_reduce<vertex_color_t> + { + template<typename Color> + class apply + { + typedef color_traits<Color> traits; + + public: + BOOST_STATIC_CONSTANT(bool, non_default_resolver = true); + + template<typename Key> + Color operator()(const Key&) const { return traits::white(); } + + template<typename Key> + Color operator()(const Key&, Color local, Color remote) const { + if (local == traits::white()) return remote; + else if (remote == traits::black()) return remote; + else return local; + } + }; + }; + + /** + * Reduction of a distance always takes the shorter distance. The + * default distance value is the maximum value for the data type. + */ + template<> + struct property_reduce<vertex_distance_t> + { + template<typename T> + class apply + { + public: + BOOST_STATIC_CONSTANT(bool, non_default_resolver = true); + + template<typename Key> + T operator()(const Key&) const { return (std::numeric_limits<T>::max)(); } + + template<typename Key> + T operator()(const Key&, T x, T y) const { return x < y? x : y; } + }; + }; + + template<> + struct property_reduce<vertex_predecessor_t> + { + template<typename T> + class apply + { + public: + BOOST_STATIC_CONSTANT(bool, non_default_resolver = true); + + T operator()(T key) const { return key; } + T operator()(T key, T, T y) const { return y; } + }; + }; + + template<typename Property, typename PropertyMap> + inline void set_property_map_role(Property p, PropertyMap pm) + { + typedef typename property_traits<PropertyMap>::value_type value_type; + typedef property_reduce<Property> property_red; + typedef typename property_red::template apply<value_type> reduce; + + pm.set_reduce(reduce()); + } + +} // end namespace boost +#endif // BOOST_GRAPH_PARALLEL_PROPERTIES_HPP