boost/property_map/parallel/parallel_property_maps.hpp
// (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 */