Chris@102: // (C) Copyright Jeremy Siek 1999-2001. Chris@102: // Copyright (C) 2006 Trustees of Indiana University Chris@102: // Authors: Douglas Gregor and Jeremy Siek Chris@102: Chris@102: // Distributed under the Boost Software License, Version 1.0. (See Chris@102: // accompanying file LICENSE_1_0.txt or copy at Chris@102: // http://www.boost.org/LICENSE_1_0.txt) Chris@102: Chris@102: // See http://www.boost.org/libs/property_map for documentation. Chris@102: Chris@102: #ifndef BOOST_PROPERTY_MAP_PARALLEL_PROPERTY_MAPS_HPP Chris@102: #define BOOST_PROPERTY_MAP_PARALLEL_PROPERTY_MAPS_HPP Chris@102: Chris@102: // Parallel property maps moved over from Chris@102: // as part of refactoring out all parallel code from sequential property map Chris@102: // library. Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: #include Chris@102: #include Chris@102: Chris@102: namespace boost { Chris@102: /** Distributed iterator property map. Chris@102: * Chris@102: * This specialization of @ref iterator_property_map builds a Chris@102: * distributed iterator property map given the local index maps Chris@102: * generated by distributed graph types that automatically have index Chris@102: * properties. Chris@102: * Chris@102: * This specialization is useful when creating external distributed Chris@102: * property maps via the same syntax used to create external Chris@102: * sequential property maps. Chris@102: */ Chris@102: template Chris@102: class iterator_property_map Chris@102: , Chris@102: ValueType, Reference> Chris@102: : public parallel::distributed_property_map Chris@102: > Chris@102: { Chris@102: typedef iterator_property_map local_iterator_map; Chris@102: Chris@102: typedef parallel::distributed_property_map inherited; Chris@102: Chris@102: typedef local_property_map Chris@102: index_map_type; Chris@102: typedef iterator_property_map self_type; Chris@102: Chris@102: public: Chris@102: iterator_property_map() { } Chris@102: Chris@102: iterator_property_map(RandomAccessIterator cc, const index_map_type& id) Chris@102: : inherited(id.process_group(), id.global(), Chris@102: local_iterator_map(cc, id.base())) { } Chris@102: }; Chris@102: Chris@102: /** Distributed iterator property map. Chris@102: * Chris@102: * This specialization of @ref iterator_property_map builds a Chris@102: * distributed iterator property map given a distributed index Chris@102: * map. Only the local portion of the distributed index property map Chris@102: * is utilized. Chris@102: * Chris@102: * This specialization is useful when creating external distributed Chris@102: * property maps via the same syntax used to create external Chris@102: * sequential property maps. Chris@102: */ Chris@102: template Chris@102: class iterator_property_map< Chris@102: RandomAccessIterator, Chris@102: parallel::distributed_property_map, Chris@102: ValueType, Reference Chris@102: > Chris@102: : public parallel::distributed_property_map Chris@102: > Chris@102: { Chris@102: typedef iterator_property_map local_iterator_map; Chris@102: Chris@102: typedef parallel::distributed_property_map inherited; Chris@102: Chris@102: typedef parallel::distributed_property_map Chris@102: index_map_type; Chris@102: Chris@102: public: Chris@102: iterator_property_map() { } Chris@102: Chris@102: iterator_property_map(RandomAccessIterator cc, const index_map_type& id) Chris@102: : inherited(id.process_group(), id.global(), Chris@102: local_iterator_map(cc, id.base())) { } Chris@102: }; Chris@102: Chris@102: namespace parallel { Chris@102: // Generate an iterator property map with a specific kind of ghost Chris@102: // cells Chris@102: template Chris@102: distributed_property_map > Chris@102: make_iterator_property_map(RandomAccessIterator cc, Chris@102: local_property_map index_map) Chris@102: { Chris@102: typedef distributed_property_map< Chris@102: ProcessGroup, GlobalMap, Chris@102: iterator_property_map > Chris@102: result_type; Chris@102: return result_type(index_map.process_group(), index_map.global(), Chris@102: make_iterator_property_map(cc, index_map.base())); Chris@102: } Chris@102: Chris@102: } // end namespace parallel Chris@102: Chris@102: /** Distributed safe iterator property map. Chris@102: * Chris@102: * This specialization of @ref safe_iterator_property_map builds a Chris@102: * distributed iterator property map given the local index maps Chris@102: * generated by distributed graph types that automatically have index Chris@102: * properties. Chris@102: * Chris@102: * This specialization is useful when creating external distributed Chris@102: * property maps via the same syntax used to create external Chris@102: * sequential property maps. Chris@102: */ Chris@102: template Chris@102: class safe_iterator_property_map Chris@102: , Chris@102: ValueType, Reference> Chris@102: : public parallel::distributed_property_map Chris@102: > Chris@102: { Chris@102: typedef safe_iterator_property_map local_iterator_map; Chris@102: Chris@102: typedef parallel::distributed_property_map inherited; Chris@102: Chris@102: typedef local_property_map index_map_type; Chris@102: Chris@102: public: Chris@102: safe_iterator_property_map() { } Chris@102: Chris@102: safe_iterator_property_map(RandomAccessIterator cc, std::size_t n, Chris@102: const index_map_type& id) Chris@102: : inherited(id.process_group(), id.global(), Chris@102: local_iterator_map(cc, n, id.base())) { } Chris@102: }; Chris@102: Chris@102: /** Distributed safe iterator property map. Chris@102: * Chris@102: * This specialization of @ref safe_iterator_property_map builds a Chris@102: * distributed iterator property map given a distributed index Chris@102: * map. Only the local portion of the distributed index property map Chris@102: * is utilized. Chris@102: * Chris@102: * This specialization is useful when creating external distributed Chris@102: * property maps via the same syntax used to create external Chris@102: * sequential property maps. Chris@102: */ Chris@102: template Chris@102: class safe_iterator_property_map< Chris@102: RandomAccessIterator, Chris@102: parallel::distributed_property_map, Chris@102: ValueType, Reference> Chris@102: : public parallel::distributed_property_map Chris@102: > Chris@102: { Chris@102: typedef safe_iterator_property_map local_iterator_map; Chris@102: Chris@102: typedef parallel::distributed_property_map inherited; Chris@102: Chris@102: typedef parallel::distributed_property_map Chris@102: index_map_type; Chris@102: Chris@102: public: Chris@102: safe_iterator_property_map() { } Chris@102: Chris@102: safe_iterator_property_map(RandomAccessIterator cc, std::size_t n, Chris@102: const index_map_type& id) Chris@102: : inherited(id.process_group(), id.global(), Chris@102: local_iterator_map(cc, n, id.base())) { } Chris@102: }; Chris@102: Chris@102: } Chris@102: Chris@102: #include Chris@102: Chris@102: #endif /* BOOST_PROPERTY_MAP_PARALLEL_PROPERTY_MAPS_HPP */ Chris@102: