summaryrefslogtreecommitdiff
path: root/boost/thread/detail/function_wrapper.hpp
diff options
context:
space:
mode:
authorChanho Park <chanho61.park@samsung.com>2014-12-11 18:55:56 +0900
committerChanho Park <chanho61.park@samsung.com>2014-12-11 18:55:56 +0900
commit08c1e93fa36a49f49325a07fe91ff92c964c2b6c (patch)
tree7a7053ceb8874b28ec4b868d4c49b500008a102e /boost/thread/detail/function_wrapper.hpp
parentbb4dd8289b351fae6b55e303f189127a394a1edd (diff)
downloadboost-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.hpp93
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