233 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			233 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | //  (C) Copyright Jeremy Siek 1999-2001. | ||
|  | //  Copyright (C) 2006 Trustees of Indiana University | ||
|  | //  Authors: Douglas Gregor and Jeremy Siek | ||
|  | 
 | ||
|  | // Distributed under 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) | ||
|  | 
 | ||
|  | //  See http://www.boost.org/libs/property_map for documentation. | ||
|  | 
 | ||
|  | #ifndef BOOST_PROPERTY_MAP_PARALLEL_PROPERTY_MAPS_HPP | ||
|  | #define BOOST_PROPERTY_MAP_PARALLEL_PROPERTY_MAPS_HPP | ||
|  | 
 | ||
|  | // Parallel property maps moved over from <boost/property_map/property_map.hpp> | ||
|  | // as part of refactoring out all parallel code from sequential property map | ||
|  | // library. | ||
|  | 
 | ||
|  | #include <boost/assert.hpp> | ||
|  | #include <boost/config.hpp> | ||
|  | #include <boost/static_assert.hpp> | ||
|  | #include <cstddef> | ||
|  | #include <boost/detail/iterator.hpp> | ||
|  | #include <boost/concept_archetype.hpp> | ||
|  | #include <boost/mpl/assert.hpp> | ||
|  | #include <boost/mpl/or.hpp> | ||
|  | #include <boost/mpl/and.hpp> | ||
|  | #include <boost/mpl/has_xxx.hpp> | ||
|  | #include <boost/type_traits/is_same.hpp> | ||
|  | #include <boost/property_map/property_map.hpp> | ||
|  | 
 | ||
|  | #include <boost/property_map/parallel/distributed_property_map.hpp> | ||
|  | #include <boost/property_map/parallel/local_property_map.hpp> | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | /** Distributed iterator property map. | ||
|  |  * | ||
|  |  * This specialization of @ref iterator_property_map builds a | ||
|  |  * distributed iterator property map given the local index maps | ||
|  |  * generated by distributed graph types that automatically have index | ||
|  |  * properties.  | ||
|  |  * | ||
|  |  * This specialization is useful when creating external distributed | ||
|  |  * property maps via the same syntax used to create external | ||
|  |  * sequential property maps. | ||
|  |  */ | ||
|  | template<typename RandomAccessIterator, typename ProcessGroup, | ||
|  |          typename GlobalMap, typename StorageMap,  | ||
|  |          typename ValueType, typename Reference> | ||
|  | class iterator_property_map | ||
|  |         <RandomAccessIterator,  | ||
|  |          local_property_map<ProcessGroup, GlobalMap, StorageMap>, | ||
|  |          ValueType, Reference> | ||
|  |   : public parallel::distributed_property_map | ||
|  |              <ProcessGroup,  | ||
|  |               GlobalMap,  | ||
|  |               iterator_property_map<RandomAccessIterator, StorageMap, | ||
|  |                                     ValueType, Reference> > | ||
|  | { | ||
|  |   typedef iterator_property_map<RandomAccessIterator, StorageMap,  | ||
|  |                                 ValueType, Reference> local_iterator_map; | ||
|  | 
 | ||
|  |   typedef parallel::distributed_property_map<ProcessGroup, GlobalMap, | ||
|  |                                              local_iterator_map> inherited; | ||
|  | 
 | ||
|  |   typedef local_property_map<ProcessGroup, GlobalMap, StorageMap> | ||
|  |     index_map_type; | ||
|  |   typedef iterator_property_map self_type; | ||
|  | 
 | ||
|  | public: | ||
|  |   iterator_property_map() { } | ||
|  | 
 | ||
|  |   iterator_property_map(RandomAccessIterator cc, const index_map_type& id) | ||
|  |     : inherited(id.process_group(), id.global(),  | ||
|  |                 local_iterator_map(cc, id.base())) { } | ||
|  | }; | ||
|  | 
 | ||
|  | /** Distributed iterator property map. | ||
|  |  * | ||
|  |  * This specialization of @ref iterator_property_map builds a | ||
|  |  * distributed iterator property map given a distributed index | ||
|  |  * map. Only the local portion of the distributed index property map | ||
|  |  * is utilized. | ||
|  |  * | ||
|  |  * This specialization is useful when creating external distributed | ||
|  |  * property maps via the same syntax used to create external | ||
|  |  * sequential property maps. | ||
|  |  */ | ||
|  | template<typename RandomAccessIterator, typename ProcessGroup, | ||
|  |          typename GlobalMap, typename StorageMap,  | ||
|  |          typename ValueType, typename Reference> | ||
|  | class iterator_property_map< | ||
|  |         RandomAccessIterator,  | ||
|  |         parallel::distributed_property_map<ProcessGroup,GlobalMap,StorageMap>, | ||
|  |         ValueType, Reference | ||
|  |       > | ||
|  |   : public parallel::distributed_property_map | ||
|  |              <ProcessGroup,  | ||
|  |               GlobalMap, | ||
|  |               iterator_property_map<RandomAccessIterator, StorageMap, | ||
|  |                                     ValueType, Reference> > | ||
|  | { | ||
|  |   typedef iterator_property_map<RandomAccessIterator, StorageMap, | ||
|  |                                 ValueType, Reference> local_iterator_map; | ||
|  | 
 | ||
|  |   typedef parallel::distributed_property_map<ProcessGroup, GlobalMap, | ||
|  |                                              local_iterator_map> inherited; | ||
|  | 
 | ||
|  |   typedef parallel::distributed_property_map<ProcessGroup, GlobalMap,  | ||
|  |                                              StorageMap> | ||
|  |     index_map_type; | ||
|  | 
 | ||
|  | public: | ||
|  |   iterator_property_map() { } | ||
|  | 
 | ||
|  |   iterator_property_map(RandomAccessIterator cc, const index_map_type& id) | ||
|  |     : inherited(id.process_group(), id.global(), | ||
|  |                 local_iterator_map(cc, id.base())) { } | ||
|  | }; | ||
|  | 
 | ||
|  | namespace parallel { | ||
|  | // Generate an iterator property map with a specific kind of ghost | ||
|  | // cells | ||
|  | template<typename RandomAccessIterator, typename ProcessGroup, | ||
|  |          typename GlobalMap, typename StorageMap> | ||
|  | distributed_property_map<ProcessGroup,  | ||
|  |                          GlobalMap, | ||
|  |                          iterator_property_map<RandomAccessIterator,  | ||
|  |                                                StorageMap> > | ||
|  | make_iterator_property_map(RandomAccessIterator cc, | ||
|  |                            local_property_map<ProcessGroup, GlobalMap,  | ||
|  |                                               StorageMap> index_map) | ||
|  | { | ||
|  |   typedef distributed_property_map< | ||
|  |             ProcessGroup, GlobalMap, | ||
|  |             iterator_property_map<RandomAccessIterator, StorageMap> > | ||
|  |     result_type; | ||
|  |   return result_type(index_map.process_group(), index_map.global(), | ||
|  |                      make_iterator_property_map(cc, index_map.base())); | ||
|  | } | ||
|  | 
 | ||
|  | } // end namespace parallel | ||
|  | 
 | ||
|  | /** Distributed safe iterator property map. | ||
|  |  * | ||
|  |  * This specialization of @ref safe_iterator_property_map builds a | ||
|  |  * distributed iterator property map given the local index maps | ||
|  |  * generated by distributed graph types that automatically have index | ||
|  |  * properties.  | ||
|  |  * | ||
|  |  * This specialization is useful when creating external distributed | ||
|  |  * property maps via the same syntax used to create external | ||
|  |  * sequential property maps. | ||
|  |  */ | ||
|  | template<typename RandomAccessIterator, typename ProcessGroup, | ||
|  |          typename GlobalMap, typename StorageMap, typename ValueType, | ||
|  |          typename Reference> | ||
|  | class safe_iterator_property_map | ||
|  |         <RandomAccessIterator,  | ||
|  |          local_property_map<ProcessGroup, GlobalMap, StorageMap>, | ||
|  |          ValueType, Reference> | ||
|  |   : public parallel::distributed_property_map | ||
|  |              <ProcessGroup,  | ||
|  |               GlobalMap, | ||
|  |               safe_iterator_property_map<RandomAccessIterator, StorageMap, | ||
|  |                                          ValueType, Reference> > | ||
|  | { | ||
|  |   typedef safe_iterator_property_map<RandomAccessIterator, StorageMap,  | ||
|  |                                      ValueType, Reference> local_iterator_map; | ||
|  | 
 | ||
|  |   typedef parallel::distributed_property_map<ProcessGroup, GlobalMap, | ||
|  |                                              local_iterator_map> inherited; | ||
|  | 
 | ||
|  |   typedef local_property_map<ProcessGroup, GlobalMap, StorageMap> index_map_type; | ||
|  | 
 | ||
|  | public: | ||
|  |   safe_iterator_property_map() { } | ||
|  | 
 | ||
|  |   safe_iterator_property_map(RandomAccessIterator cc, std::size_t n,  | ||
|  |                              const index_map_type& id) | ||
|  |     : inherited(id.process_group(), id.global(), | ||
|  |                 local_iterator_map(cc, n, id.base())) { } | ||
|  | }; | ||
|  | 
 | ||
|  | /** Distributed safe iterator property map. | ||
|  |  * | ||
|  |  * This specialization of @ref safe_iterator_property_map builds a | ||
|  |  * distributed iterator property map given a distributed index | ||
|  |  * map. Only the local portion of the distributed index property map | ||
|  |  * is utilized. | ||
|  |  * | ||
|  |  * This specialization is useful when creating external distributed | ||
|  |  * property maps via the same syntax used to create external | ||
|  |  * sequential property maps. | ||
|  |  */ | ||
|  | template<typename RandomAccessIterator, typename ProcessGroup, | ||
|  |          typename GlobalMap, typename StorageMap,  | ||
|  |          typename ValueType, typename Reference> | ||
|  | class safe_iterator_property_map< | ||
|  |         RandomAccessIterator,  | ||
|  |         parallel::distributed_property_map<ProcessGroup,GlobalMap,StorageMap>, | ||
|  |         ValueType, Reference> | ||
|  |   : public parallel::distributed_property_map | ||
|  |              <ProcessGroup,  | ||
|  |               GlobalMap, | ||
|  |               safe_iterator_property_map<RandomAccessIterator, StorageMap, | ||
|  |                                          ValueType, Reference> > | ||
|  | { | ||
|  |   typedef safe_iterator_property_map<RandomAccessIterator, StorageMap, | ||
|  |                                      ValueType, Reference> local_iterator_map; | ||
|  | 
 | ||
|  |   typedef parallel::distributed_property_map<ProcessGroup, GlobalMap, | ||
|  |                                              local_iterator_map> inherited; | ||
|  | 
 | ||
|  |   typedef parallel::distributed_property_map<ProcessGroup, GlobalMap,  | ||
|  |                                              StorageMap> | ||
|  |     index_map_type; | ||
|  | 
 | ||
|  | public: | ||
|  |   safe_iterator_property_map() { } | ||
|  | 
 | ||
|  |   safe_iterator_property_map(RandomAccessIterator cc, std::size_t n,  | ||
|  |                              const index_map_type& id) | ||
|  |     : inherited(id.process_group(), id.global(),  | ||
|  |                 local_iterator_map(cc, n, id.base())) { } | ||
|  | };                                             | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | #include <boost/property_map/vector_property_map.hpp> | ||
|  | 
 | ||
|  | #endif /* BOOST_PROPERTY_MAP_PARALLEL_PROPERTY_MAPS_HPP */ | ||
|  | 
 |