You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
96 lines
3.0 KiB
96 lines
3.0 KiB
// 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_PARALLEL_CACHING_PROPERTY_MAP_HPP |
|
#define BOOST_PARALLEL_CACHING_PROPERTY_MAP_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/property_map/property_map.hpp> |
|
|
|
namespace boost { |
|
|
|
// This probably doesn't belong here |
|
template<typename Key, typename Value> |
|
inline void local_put(dummy_property_map, const Key&, const Value&) {} |
|
|
|
namespace parallel { |
|
|
|
/** Property map that caches values placed in it but does not |
|
* broadcast values to remote processors. This class template is |
|
* meant as an adaptor for @ref distributed_property_map that |
|
* suppresses communication in the event of a remote @c put operation |
|
* by mapping it to a local @c put operation. |
|
* |
|
* @todo Find a better name for @ref caching_property_map |
|
*/ |
|
template<typename PropertyMap> |
|
class caching_property_map |
|
{ |
|
public: |
|
typedef typename property_traits<PropertyMap>::key_type key_type; |
|
typedef typename property_traits<PropertyMap>::value_type value_type; |
|
typedef typename property_traits<PropertyMap>::reference reference; |
|
typedef typename property_traits<PropertyMap>::category category; |
|
|
|
explicit caching_property_map(const PropertyMap& property_map) |
|
: property_map(property_map) {} |
|
|
|
PropertyMap& base() { return property_map; } |
|
const PropertyMap& base() const { return property_map; } |
|
|
|
template<typename Reduce> |
|
void set_reduce(const Reduce& reduce) |
|
{ property_map.set_reduce(reduce); } |
|
|
|
void reset() { property_map.reset(); } |
|
|
|
#if 0 |
|
reference operator[](const key_type& key) const |
|
{ |
|
return property_map[key]; |
|
} |
|
#endif |
|
|
|
private: |
|
PropertyMap property_map; |
|
}; |
|
|
|
template<typename PropertyMap, typename Key> |
|
inline typename caching_property_map<PropertyMap>::value_type |
|
get(const caching_property_map<PropertyMap>& pm, const Key& key) |
|
{ return get(pm.base(), key); } |
|
|
|
template<typename PropertyMap, typename Key, typename Value> |
|
inline void |
|
local_put(const caching_property_map<PropertyMap>& pm, const Key& key, |
|
const Value& value) |
|
{ local_put(pm.base(), key, value); } |
|
|
|
template<typename PropertyMap, typename Key, typename Value> |
|
inline void |
|
cache(const caching_property_map<PropertyMap>& pm, const Key& key, |
|
const Value& value) |
|
{ cache(pm.base(), key, value); } |
|
|
|
template<typename PropertyMap, typename Key, typename Value> |
|
inline void |
|
put(const caching_property_map<PropertyMap>& pm, const Key& key, |
|
const Value& value) |
|
{ local_put(pm.base(), key, value); } |
|
|
|
template<typename PropertyMap> |
|
inline caching_property_map<PropertyMap> |
|
make_caching_property_map(const PropertyMap& pm) |
|
{ return caching_property_map<PropertyMap>(pm); } |
|
|
|
} } // end namespace boost::parallel |
|
|
|
#endif // BOOST_PARALLEL_CACHING_PROPERTY_MAP_HPP
|
|
|