// Copyright (C) 2007 Douglas Gregor | |
// Use, modification and distribution is subject to 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) | |
// This file contains code for the distributed adjacency list's | |
// message handlers. It should not be included directly by users. | |
#ifndef BOOST_GRAPH_DISTRIBUTED_ADJLIST_HANDLERS_HPP | |
#define BOOST_GRAPH_DISTRIBUTED_ADJLIST_HANDLERS_HPP | |
#ifndef BOOST_GRAPH_USE_MPI | |
#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included" | |
#endif | |
#include <boost/graph/parallel/simple_trigger.hpp> | |
#include <boost/graph/parallel/detail/untracked_pair.hpp> | |
namespace boost { | |
template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS> | |
void | |
PBGL_DISTRIB_ADJLIST_TYPE:: | |
setup_triggers() | |
{ | |
using boost::graph::parallel::simple_trigger; | |
simple_trigger(process_group_, msg_add_vertex_with_property, this, | |
&adjacency_list::handle_add_vertex_with_property); | |
simple_trigger(process_group_, msg_add_vertex_with_property_and_reply, this, | |
&adjacency_list::handle_add_vertex_with_property_and_reply); | |
simple_trigger(process_group_, msg_add_edge, this, | |
&adjacency_list::handle_add_edge); | |
simple_trigger(process_group_, msg_add_edge_with_reply, this, | |
&adjacency_list::handle_add_edge_with_reply); | |
simple_trigger(process_group_, msg_add_edge_with_property, this, | |
&adjacency_list::handle_add_edge_with_property); | |
simple_trigger(process_group_, msg_add_edge_with_property_and_reply, this, | |
&adjacency_list::handle_add_edge_with_property_and_reply); | |
simple_trigger(process_group_, msg_nonlocal_edge, this, | |
&adjacency_list::handle_nonlocal_edge); | |
simple_trigger(process_group_, msg_remove_edge, this, | |
&adjacency_list::handle_remove_edge); | |
} | |
template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS> | |
void | |
PBGL_DISTRIB_ADJLIST_TYPE:: | |
handle_add_vertex_with_property(int source, int tag, | |
const vertex_property_type& data, | |
trigger_receive_context) | |
{ | |
vertex_descriptor v(this->processor(), | |
add_vertex(this->build_vertex_property(data), | |
this->base())); | |
if (on_add_vertex) | |
on_add_vertex(v, *this); | |
} | |
template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS> | |
typename PBGL_DISTRIB_ADJLIST_TYPE::local_vertex_descriptor | |
PBGL_DISTRIB_ADJLIST_TYPE:: | |
handle_add_vertex_with_property_and_reply(int source, int tag, | |
const vertex_property_type& data, | |
trigger_receive_context) | |
{ | |
// Try to find a vertex with this name | |
local_vertex_descriptor local_v | |
= add_vertex(this->build_vertex_property(data), this->base()); | |
vertex_descriptor v(processor(), local_v); | |
if (on_add_vertex) | |
on_add_vertex(v, *this); | |
return local_v; | |
} | |
template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS> | |
void | |
PBGL_DISTRIB_ADJLIST_TYPE:: | |
handle_add_edge(int source, int tag, const msg_add_edge_data& data, | |
trigger_receive_context) | |
{ | |
add_edge(vertex_descriptor(processor(), data.source), | |
data.target, *this); | |
} | |
template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS> | |
boost::parallel::detail::untracked_pair<typename PBGL_DISTRIB_ADJLIST_TYPE::edge_descriptor, bool> | |
PBGL_DISTRIB_ADJLIST_TYPE:: | |
handle_add_edge_with_reply(int source, int tag, const msg_add_edge_data& data, | |
trigger_receive_context) | |
{ | |
std::pair<typename PBGL_DISTRIB_ADJLIST_TYPE::edge_descriptor, bool> p = | |
add_edge(vertex_descriptor(processor(), data.source),data.target, *this); | |
return p; | |
} | |
template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS> | |
void | |
PBGL_DISTRIB_ADJLIST_TYPE:: | |
handle_add_edge_with_property(int source, int tag, | |
const msg_add_edge_with_property_data& data, | |
trigger_receive_context) | |
{ | |
add_edge(vertex_descriptor(processor(), data.source), | |
data.target, data.get_property(), *this); | |
} | |
template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS> | |
boost::parallel::detail::untracked_pair<typename PBGL_DISTRIB_ADJLIST_TYPE::edge_descriptor, bool> | |
PBGL_DISTRIB_ADJLIST_TYPE:: | |
handle_add_edge_with_property_and_reply | |
(int source, int tag, | |
const msg_add_edge_with_property_data& data, | |
trigger_receive_context) | |
{ | |
std::pair<typename PBGL_DISTRIB_ADJLIST_TYPE::edge_descriptor, bool> p = | |
add_edge(vertex_descriptor(processor(), data.source), | |
data.target, data.get_property(), *this); | |
return p; | |
} | |
template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS> | |
void | |
PBGL_DISTRIB_ADJLIST_TYPE:: | |
handle_nonlocal_edge(int source, int tag, | |
const msg_nonlocal_edge_data& data, | |
trigger_receive_context) | |
{ | |
add_remote_edge(data, source, directed_selector()); | |
} | |
template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS> | |
void | |
PBGL_DISTRIB_ADJLIST_TYPE:: | |
handle_remove_edge(int source, int tag, | |
const msg_remove_edge_data& data, | |
trigger_receive_context) | |
{ | |
remove_local_edge(data, source, directed_selector()); | |
} | |
} | |
#endif // BOOST_GRAPH_DISTRIBUTED_ADJLIST_HANDLERS_HPP | |