]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/boost/bind/protect.hpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / boost / bind / protect.hpp
index 749e158c349fe0dd6e11d8c9681d8c45ad9ff14c..e2511296d22fbd341865a60ee3c5342e82e29c7e 100644 (file)
@@ -2,10 +2,10 @@
 #define BOOST_BIND_PROTECT_HPP_INCLUDED
 
 //
-//  protect.hpp
+// protect.hpp
 //
-//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
-//  Copyright (c) 2009 Steven Watanabe
+// Copyright 2002, 2020 Peter Dimov
+// Copyright 2009 Steven Watanabe
 //
 // Distributed under the Boost Software License, Version 1.0. (See
 // accompanying file LICENSE_1_0.txt or copy at
@@ -13,7 +13,8 @@
 //
 
 #include <boost/config.hpp>
-#include <boost/detail/workaround.hpp>
+#include <boost/config/workaround.hpp>
+#include <utility>
 
 namespace boost
 {
@@ -21,8 +22,53 @@ namespace boost
 namespace _bi
 {
 
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_NO_CXX11_DECLTYPE)
+
+template<class T> struct protect_make_void
+{
+    typedef void type;
+};
+
+template<class F, class E = void> struct protect_result_type
+{
+};
+
+template<class F> struct protect_result_type< F, typename protect_make_void<typename F::result_type>::type >
+{
+    typedef typename F::result_type result_type;
+};
+
+template<class F> class protected_bind_t: public protect_result_type<F>
+{
+private:
+
+    F f_;
+
+public:
+
+    explicit protected_bind_t( F f ): f_( f )
+    {
+    }
+
+    template<class... A> auto operator()( A&&... a ) -> decltype( f_( std::forward<A>(a)... ) )
+    {
+        return f_( std::forward<A>(a)... );
+    }
+
+    template<class... A> auto operator()( A&&... a ) const -> decltype( f_( std::forward<A>(a)... ) )
+    {
+        return f_( std::forward<A>(a)... );
+    }
+};
+
+#else
+
 template<class F> class protected_bind_t
 {
+private:
+
+    F f_;
+
 public:
 
     typedef typename F::result_type result_type;
@@ -286,12 +332,10 @@ public:
     }
 
 #endif
-
-private:
-
-    F f_;
 };
 
+#endif
+
 } // namespace _bi
 
 template<class F> _bi::protected_bind_t<F> protect(F f)