summaryrefslogtreecommitdiff
path: root/boost/variant/detail/apply_visitor_binary.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/variant/detail/apply_visitor_binary.hpp')
-rw-r--r--boost/variant/detail/apply_visitor_binary.hpp108
1 files changed, 105 insertions, 3 deletions
diff --git a/boost/variant/detail/apply_visitor_binary.hpp b/boost/variant/detail/apply_visitor_binary.hpp
index 5cc9430352..e5e22e1d82 100644
--- a/boost/variant/detail/apply_visitor_binary.hpp
+++ b/boost/variant/detail/apply_visitor_binary.hpp
@@ -3,8 +3,8 @@
// See http://www.boost.org for updates, documentation, and revision history.
//-----------------------------------------------------------------------------
//
-// Copyright (c) 2002-2003
-// Eric Friedman
+// Copyright (c) 2002-2003 Eric Friedman
+// Copyright (c) 2014 Antony Polukhin
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
@@ -25,6 +25,11 @@
#include "boost/type_traits/is_const.hpp"
#endif
+
+#if !defined(BOOST_NO_CXX14_DECLTYPE_AUTO) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276)
+# include "boost/variant/detail/has_result_type.hpp"
+#endif
+
namespace boost {
//////////////////////////////////////////////////////////////////////////
@@ -69,7 +74,6 @@ public: // visitor interfaces
private:
apply_visitor_binary_invoke& operator=(const apply_visitor_binary_invoke&);
-
};
template <typename Visitor, typename Visitable2>
@@ -173,6 +177,104 @@ apply_visitor(
return boost::apply_visitor(unwrapper, visitable1);
}
+
+#if !defined(BOOST_NO_CXX14_DECLTYPE_AUTO) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276)
+
+//////////////////////////////////////////////////////////////////////////
+// function template apply_visitor(visitor, visitable1, visitable2)
+//
+// C++14 part.
+//
+
+namespace detail { namespace variant {
+
+template <typename Visitor, typename Value1>
+class apply_visitor_binary_invoke_cpp14
+{
+ Visitor& visitor_;
+ Value1& value1_;
+
+public: // structors
+
+ apply_visitor_binary_invoke_cpp14(Visitor& visitor, Value1& value1) BOOST_NOEXCEPT
+ : visitor_(visitor)
+ , value1_(value1)
+ {
+ }
+
+public: // visitor interfaces
+
+ template <typename Value2>
+ decltype(auto) operator()(Value2& value2)
+ {
+ return visitor_(value1_, value2);
+ }
+
+private:
+ apply_visitor_binary_invoke_cpp14& operator=(const apply_visitor_binary_invoke_cpp14&);
+};
+
+template <typename Visitor, typename Visitable2>
+class apply_visitor_binary_unwrap_cpp14
+{
+ Visitor& visitor_;
+ Visitable2& visitable2_;
+
+public: // structors
+
+ apply_visitor_binary_unwrap_cpp14(Visitor& visitor, Visitable2& visitable2) BOOST_NOEXCEPT
+ : visitor_(visitor)
+ , visitable2_(visitable2)
+ {
+ }
+
+public: // visitor interfaces
+
+ template <typename Value1>
+ decltype(auto) operator()(Value1& value1)
+ {
+ apply_visitor_binary_invoke_cpp14<
+ Visitor
+ , Value1
+ > invoker(visitor_, value1);
+
+ return boost::apply_visitor(invoker, visitable2_);
+ }
+
+private:
+ apply_visitor_binary_unwrap_cpp14& operator=(const apply_visitor_binary_unwrap_cpp14&);
+};
+
+}} // namespace detail::variant
+
+template <typename Visitor, typename Visitable1, typename Visitable2>
+inline decltype(auto) apply_visitor(Visitor& visitor, Visitable1& visitable1, Visitable2& visitable2,
+ typename boost::disable_if<
+ boost::detail::variant::has_result_type<Visitor>
+ >::type* = 0)
+{
+ ::boost::detail::variant::apply_visitor_binary_unwrap_cpp14<
+ Visitor, Visitable2
+ > unwrapper(visitor, visitable2);
+
+ return boost::apply_visitor(unwrapper, visitable1);
+}
+
+template <typename Visitor, typename Visitable1, typename Visitable2>
+inline decltype(auto) apply_visitor(const Visitor& visitor, Visitable1& visitable1, Visitable2& visitable2,
+ typename boost::disable_if<
+ boost::detail::variant::has_result_type<Visitor>
+ >::type* = 0)
+{
+ ::boost::detail::variant::apply_visitor_binary_unwrap_cpp14<
+ const Visitor, Visitable2
+ > unwrapper(visitor, visitable2);
+
+ return boost::apply_visitor(unwrapper, visitable1);
+}
+
+#endif // !defined(BOOST_NO_CXX14_DECLTYPE_AUTO) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276)
+
} // namespace boost
#endif // BOOST_VARIANT_DETAIL_APPLY_VISITOR_BINARY_HPP