diff options
author | Chanho Park <chanho61.park@samsung.com> | 2014-12-11 18:55:56 +0900 |
---|---|---|
committer | Chanho Park <chanho61.park@samsung.com> | 2014-12-11 18:55:56 +0900 |
commit | 08c1e93fa36a49f49325a07fe91ff92c964c2b6c (patch) | |
tree | 7a7053ceb8874b28ec4b868d4c49b500008a102e /boost/thread/detail/function_wrapper.hpp | |
parent | bb4dd8289b351fae6b55e303f189127a394a1edd (diff) | |
download | boost-08c1e93fa36a49f49325a07fe91ff92c964c2b6c.tar.gz boost-08c1e93fa36a49f49325a07fe91ff92c964c2b6c.tar.bz2 boost-08c1e93fa36a49f49325a07fe91ff92c964c2b6c.zip |
Imported Upstream version 1.57.0upstream/1.57.0
Diffstat (limited to 'boost/thread/detail/function_wrapper.hpp')
-rw-r--r-- | boost/thread/detail/function_wrapper.hpp | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/boost/thread/detail/function_wrapper.hpp b/boost/thread/detail/function_wrapper.hpp new file mode 100644 index 0000000000..355f726762 --- /dev/null +++ b/boost/thread/detail/function_wrapper.hpp @@ -0,0 +1,93 @@ +// Copyright (C) 2013 Vicente J. Botet Escriba +// +// Distributed under 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) +// +// 2013/09 Vicente J. Botet Escriba +// Adapt to boost from CCIA C++11 implementation +// Make use of Boost.Move + +#ifndef BOOST_THREAD_DETAIL_FUNCTION_WRAPPER_HPP +#define BOOST_THREAD_DETAIL_FUNCTION_WRAPPER_HPP + +#include <boost/config.hpp> +#include <boost/thread/detail/memory.hpp> +#include <boost/thread/detail/move.hpp> + +#include <boost/thread/csbl/memory/unique_ptr.hpp> + +#include <memory> +#include <functional> + +namespace boost +{ + namespace detail + { + class function_wrapper + { + struct impl_base + { + virtual void call()=0; + virtual ~impl_base() + { + } + }; + typedef boost::csbl::unique_ptr<impl_base> impl_base_type; + impl_base_type impl; + template <typename F> + struct impl_type: impl_base + { + F f; + impl_type(F const &f_) + : f(f_) + {} + impl_type(BOOST_THREAD_RV_REF(F) f_) + : f(boost::move(f_)) + {} + + void call() + { + if (impl) f(); + } + }; + public: + BOOST_THREAD_MOVABLE_ONLY(function_wrapper) + +//#if ! defined BOOST_NO_CXX11_RVALUE_REFERENCES + template<typename F> + function_wrapper(F const& f): + impl(new impl_type<F>(f)) + {} +//#endif + template<typename F> + function_wrapper(BOOST_THREAD_RV_REF(F) f): + impl(new impl_type<F>(boost::forward<F>(f))) + {} + function_wrapper(BOOST_THREAD_RV_REF(function_wrapper) other) BOOST_NOEXCEPT : + impl(other.impl) + { + other.impl = 0; + } + function_wrapper() + : impl(0) + { + } + ~function_wrapper() + { + } + + function_wrapper& operator=(BOOST_THREAD_RV_REF(function_wrapper) other) BOOST_NOEXCEPT + { + impl=other.impl; + other.impl=0; + return *this; + } + + void operator()() + { impl->call();} + + }; + } +} + +#endif // header |