Boost-Geometry-Utils
view release on metacpan or search on metacpan
src/boost/property_map/parallel/impl/distributed_property_map.ipp view on Meta::CPAN
int model = data->model;
data->reset = &data_t::template do_reset<Reduce>;
set_consistency_model(model);
}
template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
void PBGL_DISTRIB_PMAP::prune_ghost_cells() const
{
if (data->max_ghost_cells == 0)
return;
while (data->ghost_cells->size() > data->max_ghost_cells) {
// Evict the last ghost cell
if (data->model & cm_flush) {
// We need to flush values when we evict them.
boost::parallel::detail::untracked_pair<key_type, value_type> const& victim
= data->ghost_cells->back();
send(data->process_group, get(data->global, victim.first).first,
property_map_put, victim);
}
// Actually remove the ghost cell
data->ghost_cells->pop_back();
}
}
template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
typename PBGL_DISTRIB_PMAP::value_type&
PBGL_DISTRIB_PMAP::cell(const key_type& key, bool request_if_missing) const
{
// Index by key
ghost_cells_key_index_type const& key_index
= data->ghost_cells->template get<1>();
// Search for the ghost cell by key, and project back to the sequence
iterator ghost_cell
= data->ghost_cells->template project<0>(key_index.find(key));
if (ghost_cell == data->ghost_cells->end()) {
value_type value;
if (data->has_default_resolver)
// Since we have a default resolver, use it to create a default
// value for this ghost cell.
value = data->get_default_value(key);
else if (request_if_missing)
// Request the actual value of this key from its owner
send_oob_with_reply(data->process_group, get(data->global, key).first,
property_map_get, key, value);
else
value = value_type();
// Create a ghost cell containing the new value
ghost_cell
= data->ghost_cells->push_front(std::make_pair(key, value)).first;
// If we need to, prune the ghost cells
if (data->max_ghost_cells > 0)
prune_ghost_cells();
} else if (data->max_ghost_cells > 0)
// Put this cell at the beginning of the MRU list
data->ghost_cells->relocate(data->ghost_cells->begin(), ghost_cell);
return const_cast<value_type&>(ghost_cell->second);
}
template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
template<typename Reduce>
void
PBGL_DISTRIB_PMAP
::handle_message<Reduce>::operator()(process_id_type source, int tag)
{
BOOST_ASSERT(false);
}
template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
template<typename Reduce>
void
PBGL_DISTRIB_PMAP::handle_message<Reduce>::
handle_put(int /*source*/, int /*tag*/,
const boost::parallel::detail::untracked_pair<key_type, value_type>& req, trigger_receive_context)
{
using boost::get;
shared_ptr<data_t> data(data_ptr);
owner_local_pair p = get(data->global, req.first);
BOOST_ASSERT(p.first == process_id(data->process_group));
detail::maybe_put(data->storage, p.second,
reduce(req.first,
get(data->storage, p.second),
req.second));
}
template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
template<typename Reduce>
typename PBGL_DISTRIB_PMAP::value_type
PBGL_DISTRIB_PMAP::handle_message<Reduce>::
handle_get(int source, int /*tag*/, const key_type& key,
trigger_receive_context)
{
using boost::get;
shared_ptr<data_t> data(data_ptr);
BOOST_ASSERT(data);
owner_local_pair p = get(data->global, key);
return get(data->storage, p.second);
}
template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
template<typename Reduce>
void
PBGL_DISTRIB_PMAP::handle_message<Reduce>::
handle_multiget(int source, int tag, const std::vector<key_type>& keys,
trigger_receive_context)
{
shared_ptr<data_t> data(data_ptr);
BOOST_ASSERT(data);
typedef boost::parallel::detail::untracked_pair<key_type, value_type> key_value;
( run in 0.512 second using v1.01-cache-2.11-cpan-71847e10f99 )