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