Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/graph/parallel/simple_trigger.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children | c530137014c0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/graph/parallel/simple_trigger.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,108 @@ +// 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 a simplification of the "trigger" method for +// process groups. The simple trigger handles the common case where +// the handler associated with a trigger is a member function bound to +// a particular pointer. + +#ifndef BOOST_GRAPH_PARALLEL_SIMPLE_TRIGGER_HPP +#define BOOST_GRAPH_PARALLEL_SIMPLE_TRIGGER_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/process_group.hpp> + +namespace boost { namespace graph { namespace parallel { + +namespace detail { + +/** + * INTERNAL ONLY + * + * The actual function object that bridges from the normal trigger + * interface to the simplified interface. This is the equivalent of + * bind(pmf, self, _1, _2, _3, _4), but without the compile-time + * overhead of bind. + */ +template<typename Class, typename T, typename Result> +class simple_trigger_t +{ +public: + simple_trigger_t(Class* self, + Result (Class::*pmf)(int, int, const T&, + trigger_receive_context)) + : self(self), pmf(pmf) { } + + Result + operator()(int source, int tag, const T& data, + trigger_receive_context context) const + { + return (self->*pmf)(source, tag, data, context); + } + +private: + Class* self; + Result (Class::*pmf)(int, int, const T&, trigger_receive_context); +}; + +} // end namespace detail + +/** + * Simplified trigger interface that reduces the amount of code + * required to connect a process group trigger to a handler that is + * just a bound member function. + * + * INTERNAL ONLY + */ +template<typename ProcessGroup, typename Class, typename T> +inline void +simple_trigger(ProcessGroup& pg, int tag, Class* self, + void (Class::*pmf)(int source, int tag, const T& data, + trigger_receive_context context), int) +{ + pg.template trigger<T>(tag, + detail::simple_trigger_t<Class, T, void>(self, pmf)); +} + +/** + * Simplified trigger interface that reduces the amount of code + * required to connect a process group trigger with a reply to a + * handler that is just a bound member function. + * + * INTERNAL ONLY + */ +template<typename ProcessGroup, typename Class, typename T, typename Result> +inline void +simple_trigger(ProcessGroup& pg, int tag, Class* self, + Result (Class::*pmf)(int source, int tag, const T& data, + trigger_receive_context context), long) +{ + pg.template trigger_with_reply<T> + (tag, detail::simple_trigger_t<Class, T, Result>(self, pmf)); +} + +/** + * Simplified trigger interface that reduces the amount of code + * required to connect a process group trigger to a handler that is + * just a bound member function. + */ +template<typename ProcessGroup, typename Class, typename T, typename Result> +inline void +simple_trigger(ProcessGroup& pg, int tag, Class* self, + Result (Class::*pmf)(int source, int tag, const T& data, + trigger_receive_context context)) +{ + // We pass 0 (an int) to help VC++ disambiguate calls to simple_trigger + // with Result=void. + simple_trigger(pg, tag, self, pmf, 0); +} + +} } } // end namespace boost::graph::parallel + +#endif // BOOST_GRAPH_PARALLEL_SIMPLE_TRIGGER_HPP