Chris@102: // Copyright (C) 2013 Vicente J. Botet Escriba Chris@102: // Chris@102: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@102: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@102: // Chris@102: // 2013/09 Vicente J. Botet Escriba Chris@102: // Adapt to boost from CCIA C++11 implementation Chris@102: // Make use of Boost.Move Chris@102: Chris@102: #ifndef BOOST_THREAD_DETAIL_FUNCTION_WRAPPER_HPP Chris@102: #define BOOST_THREAD_DETAIL_FUNCTION_WRAPPER_HPP Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: #include Chris@102: Chris@102: #include Chris@102: #include Chris@102: Chris@102: namespace boost Chris@102: { Chris@102: namespace detail Chris@102: { Chris@102: class function_wrapper Chris@102: { Chris@102: struct impl_base Chris@102: { Chris@102: virtual void call()=0; Chris@102: virtual ~impl_base() Chris@102: { Chris@102: } Chris@102: }; Chris@102: typedef boost::csbl::unique_ptr impl_base_type; Chris@102: impl_base_type impl; Chris@102: template Chris@102: struct impl_type: impl_base Chris@102: { Chris@102: F f; Chris@102: impl_type(F const &f_) Chris@102: : f(f_) Chris@102: {} Chris@102: impl_type(BOOST_THREAD_RV_REF(F) f_) Chris@102: : f(boost::move(f_)) Chris@102: {} Chris@102: Chris@102: void call() Chris@102: { Chris@102: if (impl) f(); Chris@102: } Chris@102: }; Chris@102: public: Chris@102: BOOST_THREAD_MOVABLE_ONLY(function_wrapper) Chris@102: Chris@102: //#if ! defined BOOST_NO_CXX11_RVALUE_REFERENCES Chris@102: template Chris@102: function_wrapper(F const& f): Chris@102: impl(new impl_type(f)) Chris@102: {} Chris@102: //#endif Chris@102: template Chris@102: function_wrapper(BOOST_THREAD_RV_REF(F) f): Chris@102: impl(new impl_type(boost::forward(f))) Chris@102: {} Chris@102: function_wrapper(BOOST_THREAD_RV_REF(function_wrapper) other) BOOST_NOEXCEPT : Chris@102: impl(other.impl) Chris@102: { Chris@102: other.impl = 0; Chris@102: } Chris@102: function_wrapper() Chris@102: : impl(0) Chris@102: { Chris@102: } Chris@102: ~function_wrapper() Chris@102: { Chris@102: } Chris@102: Chris@102: function_wrapper& operator=(BOOST_THREAD_RV_REF(function_wrapper) other) BOOST_NOEXCEPT Chris@102: { Chris@102: impl=other.impl; Chris@102: other.impl=0; Chris@102: return *this; Chris@102: } Chris@102: Chris@102: void operator()() Chris@102: { impl->call();} Chris@102: Chris@102: }; Chris@102: } Chris@102: } Chris@102: Chris@102: #endif // header