92 lines
3.4 KiB
C++
92 lines
3.4 KiB
C++
// 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
|