diff --git a/include/boost/thread/barrier.hpp b/include/boost/thread/barrier.hpp index 46b0a85c..b99452a9 100644 --- a/include/boost/thread/barrier.hpp +++ b/include/boost/thread/barrier.hpp @@ -18,11 +18,7 @@ #include #include #include -#ifdef BOOST_NO_CXX11_HDR_FUNCTIONAL -#include -#else -#include -#endif +#include #include #include #include @@ -34,13 +30,8 @@ namespace boost { namespace thread_detail { -#ifdef BOOST_NO_CXX11_HDR_FUNCTIONAL - typedef function void_completion_function; - typedef function size_completion_function; -#else - typedef std::function void_completion_function; - typedef std::function size_completion_function; -#endif + typedef detail::nullary_function void_completion_function; + typedef detail::nullary_function size_completion_function; struct default_barrier_reseter { @@ -49,6 +40,17 @@ namespace boost size_(size) { } + BOOST_THREAD_MOVABLE(default_barrier_reseter) + + default_barrier_reseter(default_barrier_reseter const& other) BOOST_NOEXCEPT : + size_(other.size_) + { + } + default_barrier_reseter(BOOST_THREAD_RV_REF(default_barrier_reseter) other) BOOST_NOEXCEPT : + size_(BOOST_THREAD_RV(other).size_) + { + } + unsigned int operator()() { return size_; @@ -60,15 +62,25 @@ namespace boost unsigned int size_; void_completion_function fct_; template -#ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL void_functor_barrier_reseter(unsigned int size, BOOST_THREAD_RV_REF(F) funct) : size_(size), fct_(boost::move(funct)) {} -#else - void_functor_barrier_reseter(unsigned int size, F funct) + template + void_functor_barrier_reseter(unsigned int size, F& funct) : size_(size), fct_(funct) {} -#endif + + BOOST_THREAD_MOVABLE(void_functor_barrier_reseter) + + void_functor_barrier_reseter(void_functor_barrier_reseter const& other) BOOST_NOEXCEPT : + size_(other.size_), fct_(other.fct_) + { + } + void_functor_barrier_reseter(BOOST_THREAD_RV_REF(void_functor_barrier_reseter) other) BOOST_NOEXCEPT : + size_(BOOST_THREAD_RV(other).size_), fct_(BOOST_THREAD_RV(other).fct_) + { + } + unsigned int operator()() { fct_(); @@ -83,6 +95,16 @@ namespace boost size_(size), fct_(funct) { } + BOOST_THREAD_MOVABLE(void_fct_ptr_barrier_reseter) + + void_fct_ptr_barrier_reseter(void_fct_ptr_barrier_reseter const& other) BOOST_NOEXCEPT : + size_(other.size_), fct_(other.fct_) + { + } + void_fct_ptr_barrier_reseter(BOOST_THREAD_RV_REF(void_fct_ptr_barrier_reseter) other) BOOST_NOEXCEPT : + size_(BOOST_THREAD_RV(other).size_), fct_(BOOST_THREAD_RV(other).fct_) + { + } unsigned int operator()() { fct_(); @@ -106,31 +128,37 @@ namespace boost BOOST_THREAD_NO_COPYABLE( barrier) explicit barrier(unsigned int count) : - m_count(check_counter(count)), m_generation(0), fct_(thread_detail::default_barrier_reseter(count)) + m_count(check_counter(count)), m_generation(0), fct_(BOOST_THREAD_MAKE_RV_REF(thread_detail::default_barrier_reseter(count))) { } template barrier( unsigned int count, -#ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL BOOST_THREAD_RV_REF(F) funct, -#else - F funct, -#endif typename enable_if< typename is_void::type>::type, dummy* >::type=0 ) : m_count(check_counter(count)), - m_generation(0), - fct_(thread_detail::void_functor_barrier_reseter(count, -#ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL - boost::move(funct) -#else - funct -#endif - ) + m_generation(0), + fct_(BOOST_THREAD_MAKE_RV_REF(thread_detail::void_functor_barrier_reseter(count, + boost::move(funct))) + ) + { + } + template + barrier( + unsigned int count, + F &funct, + typename enable_if< + typename is_void::type>::type, dummy* + >::type=0 + ) + : m_count(check_counter(count)), + m_generation(0), + fct_(BOOST_THREAD_MAKE_RV_REF(thread_detail::void_functor_barrier_reseter(count, + funct)) ) { } @@ -138,40 +166,43 @@ namespace boost template barrier( unsigned int count, -#ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL BOOST_THREAD_RV_REF(F) funct, -#else - F funct, -#endif typename enable_if< typename is_same::type, unsigned int>::type, dummy* >::type=0 ) : m_count(check_counter(count)), - m_generation(0), - fct_( -#ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL - boost::move(funct) -#else - funct -#endif + m_generation(0), + fct_(boost::move(funct)) + { + } + template + barrier( + unsigned int count, + F& funct, + typename enable_if< + typename is_same::type, unsigned int>::type, dummy* + >::type=0 ) + : m_count(check_counter(count)), + m_generation(0), + fct_(funct) { } barrier(unsigned int count, void(*funct)()) : m_count(check_counter(count)), m_generation(0), fct_(funct - ? thread_detail::size_completion_function(thread_detail::void_fct_ptr_barrier_reseter(count, funct)) - : thread_detail::size_completion_function(thread_detail::default_barrier_reseter(count)) + ? BOOST_THREAD_MAKE_RV_REF(thread_detail::size_completion_function(BOOST_THREAD_MAKE_RV_REF(thread_detail::void_fct_ptr_barrier_reseter(count, funct)))) + : BOOST_THREAD_MAKE_RV_REF(thread_detail::size_completion_function(BOOST_THREAD_MAKE_RV_REF(thread_detail::default_barrier_reseter(count)))) ) { } barrier(unsigned int count, unsigned int(*funct)()) : m_count(check_counter(count)), m_generation(0), fct_(funct - ? thread_detail::size_completion_function(funct) - : thread_detail::size_completion_function(thread_detail::default_barrier_reseter(count)) + ? BOOST_THREAD_MAKE_RV_REF(thread_detail::size_completion_function(funct)) + : BOOST_THREAD_MAKE_RV_REF(thread_detail::size_completion_function(BOOST_THREAD_MAKE_RV_REF(thread_detail::default_barrier_reseter(count)))) ) { }