123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- /*!
- @file
- Defines `boost::hana::detail::variadic::take`.
- @copyright Louis Dionne 2013-2017
- 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_VARIADIC_TAKE_HPP
- #define BOOST_HANA_DETAIL_VARIADIC_TAKE_HPP
- #include <boost/hana/config.hpp>
- #include <boost/hana/detail/variadic/split_at.hpp>
- #include <boost/hana/functional/always.hpp>
- #include <boost/hana/functional/reverse_partial.hpp>
- #include <cstddef>
- BOOST_HANA_NAMESPACE_BEGIN namespace detail { namespace variadic {
- struct take_impl2 {
- template <typename F, typename ...Xs>
- constexpr decltype(auto) operator()(F&& f, Xs&& ...xs) const {
- return static_cast<F&&>(f)(static_cast<Xs&&>(xs)...);
- }
- };
- struct take_impl1 {
- template <typename ...Xs>
- constexpr auto operator()(Xs&& ...xs) const {
- return hana::always(
- reverse_partial(take_impl2{},
- static_cast<Xs&&>(xs)...)
- );
- }
- };
- template <std::size_t n>
- struct take_t {
- template <typename ...Xs>
- constexpr decltype(auto) operator()(Xs&& ...xs) const {
- return variadic::split_at<n>(static_cast<Xs&&>(xs)...)(take_impl1{});
- }
- };
- template <std::size_t n>
- constexpr take_t<n> take{};
- }} BOOST_HANA_NAMESPACE_END
- #endif // !BOOST_HANA_DETAIL_VARIADIC_TAKE_HPP
|