123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- // 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
|