123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- #include <boost/property_map/property_map.hpp>
- #ifndef BOOST_PARALLEL_LOCAL_PROPERTY_MAP_HPP
- #define BOOST_PARALLEL_LOCAL_PROPERTY_MAP_HPP
- #include <boost/assert.hpp>
- namespace boost {
-
- 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);
- }
- }
- #endif
|