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.
91 lines
3.4 KiB
91 lines
3.4 KiB
// Copyright (C) 2004-2006 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 |
|
|
|
// The placement of this #include probably looks very odd relative to |
|
// the #ifndef/#define pair below. However, this placement is |
|
// extremely important to allow the various property map headers to be |
|
// included in any order. |
|
#include <boost/property_map/property_map.hpp> |
|
|
|
#ifndef BOOST_PARALLEL_LOCAL_PROPERTY_MAP_HPP |
|
#define BOOST_PARALLEL_LOCAL_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/assert.hpp> |
|
|
|
namespace boost { |
|
/** Property map that accesses an underlying, local property map |
|
* using a subset of the global keys. |
|
*/ |
|
template<typename ProcessGroup, typename GlobalMap, typename StorageMap> |
|
class local_property_map |
|
{ |
|
typedef typename property_traits<GlobalMap>::value_type owner_local_pair; |
|
|
|
public: |
|
typedef ProcessGroup process_group_type; |
|
typedef typename property_traits<StorageMap>::value_type value_type; |
|
typedef typename property_traits<GlobalMap>::key_type key_type; |
|
typedef typename property_traits<StorageMap>::reference reference; |
|
typedef typename property_traits<StorageMap>::category category; |
|
|
|
local_property_map() { } |
|
|
|
local_property_map(const ProcessGroup& process_group, |
|
const GlobalMap& global, const StorageMap& storage) |
|
: process_group_(process_group), global_(global), storage(storage) { } |
|
|
|
reference operator[](const key_type& key) |
|
{ |
|
owner_local_pair p = get(global_, key); |
|
BOOST_ASSERT(p.first == process_id(process_group_)); |
|
return storage[p.second]; |
|
} |
|
|
|
GlobalMap& global() const { return global_; } |
|
StorageMap& base() const { return storage; } |
|
|
|
ProcessGroup& process_group() { return process_group_; } |
|
const ProcessGroup& process_group() const { return process_group_; } |
|
|
|
private: |
|
ProcessGroup process_group_; |
|
mutable GlobalMap global_; |
|
mutable StorageMap storage; |
|
}; |
|
|
|
template<typename ProcessGroup, typename GlobalMap, typename StorageMap> |
|
inline |
|
typename local_property_map<ProcessGroup, GlobalMap, StorageMap>::reference |
|
get(const local_property_map<ProcessGroup, GlobalMap, StorageMap>& pm, |
|
typename local_property_map<ProcessGroup, GlobalMap, StorageMap>::key_type |
|
const & key) |
|
|
|
{ |
|
typename property_traits<GlobalMap>::value_type p = get(pm.global(), key); |
|
return get(pm.base(), p.second); |
|
} |
|
|
|
template<typename ProcessGroup, typename GlobalMap, typename StorageMap> |
|
inline void |
|
put(const local_property_map<ProcessGroup, GlobalMap, StorageMap>& pm, |
|
typename local_property_map<ProcessGroup, GlobalMap, StorageMap> |
|
::key_type const & key, |
|
typename local_property_map<ProcessGroup, GlobalMap, StorageMap> |
|
::value_type const& v) |
|
{ |
|
typename property_traits<GlobalMap>::value_type p = get(pm.global(), key); |
|
BOOST_ASSERT(p.first == process_id(pm.process_group())); |
|
put(pm.base(), p.second, v); |
|
} |
|
} // end namespace boost |
|
#endif // BOOST_PARALLEL_LOCAL_PROPERTY_MAP_HPP
|
|
|