mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-26 22:28:41 -05:00
ecaa982b9f
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@7593 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
233 lines
9.0 KiB
C++
233 lines
9.0 KiB
C++
// (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 */
|
|
|