summaryrefslogtreecommitdiff
path: root/boost/hana/detail/nested_by_fwd.hpp
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2016-10-06 10:38:45 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2016-10-06 10:39:52 +0900
commit5cde13f21d36c7224b0e13d11c4b49379ae5210d (patch)
treee8269ac85a4b0f7d416e2565fa4f451b5cb41351 /boost/hana/detail/nested_by_fwd.hpp
parentd9ec475d945d3035377a0d89ed42e382d8988891 (diff)
downloadboost-5cde13f21d36c7224b0e13d11c4b49379ae5210d.tar.gz
boost-5cde13f21d36c7224b0e13d11c4b49379ae5210d.tar.bz2
boost-5cde13f21d36c7224b0e13d11c4b49379ae5210d.zip
Imported Upstream version 1.61.0
Change-Id: I96a1f878d1e6164f01e9aadd5147f38fca448d90 Signed-off-by: DongHun Kwak <dh0128.kwak@samsung.com>
Diffstat (limited to 'boost/hana/detail/nested_by_fwd.hpp')
-rw-r--r--boost/hana/detail/nested_by_fwd.hpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/boost/hana/detail/nested_by_fwd.hpp b/boost/hana/detail/nested_by_fwd.hpp
new file mode 100644
index 0000000000..3ca9dc7058
--- /dev/null
+++ b/boost/hana/detail/nested_by_fwd.hpp
@@ -0,0 +1,55 @@
+/*!
+@file
+Forward declares `boost::hana::detail::nested_by`.
+
+@copyright Louis Dionne 2013-2016
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_HANA_DETAIL_NESTED_BY_FWD_HPP
+#define BOOST_HANA_DETAIL_NESTED_BY_FWD_HPP
+
+#include <boost/hana/config.hpp>
+
+
+BOOST_HANA_NAMESPACE_BEGIN namespace detail {
+ template <typename Algorithm>
+ struct nested_by_t {
+ template <typename Predicate, typename Object>
+ constexpr decltype(auto)
+ operator()(Predicate&& predicate, Object&& object) const;
+
+ template <typename Predicate>
+ constexpr decltype(auto) operator()(Predicate&& predicate) const;
+ };
+
+ //! @ingroup group-details
+ //! Provides a `.by` static constexpr function object.
+ //!
+ //! When creating a binary function object of type `Algorithm` whose
+ //! signature is `Object x Predicate -> Return`, `nested_by<Algorithm>`
+ //! can be used as a base class to `Algorithm`. Doing so will provide a
+ //! static constexpr member called `by`, which has the two following
+ //! signatures:
+ //! @code
+ //! Predicate x Object -> Return
+ //! Predicate -> (Object -> Return)
+ //! @endcode
+ //!
+ //! In other words, `nested_by` is a `curry`ed and `flip`ped version of
+ //! `Algorithm`. Note that the function object `Algorithm` must be
+ //! default-constructible, since the algorithm will be called as
+ //! `Algorithm{}(arguments...)`.
+ //!
+ //! @note
+ //! This function object is especially useful because it takes care of
+ //! avoiding ODR violations caused by the nested static constexpr member.
+ template <typename Algorithm>
+ struct nested_by { static constexpr nested_by_t<Algorithm> by{}; };
+
+ template <typename Algorithm>
+ constexpr nested_by_t<Algorithm> nested_by<Algorithm>::by;
+} BOOST_HANA_NAMESPACE_END
+
+#endif // !BOOST_HANA_DETAIL_NESTED_BY_FWD_HPP