// 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 |