12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- /*!
- @file
- Defines `boost::hana::detail::index_if`.
- @copyright Louis Dionne 2013-2017
- @copyright Jason Rice 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_INDEX_IF_HPP
- #define BOOST_HANA_DETAIL_INDEX_IF_HPP
- #include <boost/hana/config.hpp>
- #include <boost/hana/detail/decay.hpp>
- #include <boost/hana/integral_constant.hpp>
- #include <boost/hana/optional.hpp>
- #include <cstddef>
- #include <utility>
- BOOST_HANA_NAMESPACE_BEGIN namespace detail {
- template <std::size_t i, std::size_t N, bool Done>
- struct index_if_helper;
- template <std::size_t i, std::size_t N>
- struct index_if_helper<i, N, false> {
- template <typename Pred, typename X1, typename ...Xs>
- using f = typename index_if_helper<i + 1, N,
- static_cast<bool>(detail::decay<decltype(
- std::declval<Pred>()(std::declval<X1>()))>::type::value)
- >::template f<Pred, Xs...>;
- };
- template <std::size_t N>
- struct index_if_helper<N, N, false> {
- template <typename ...>
- using f = hana::optional<>;
- };
- template <std::size_t i, std::size_t N>
- struct index_if_helper<i, N, true> {
- template <typename ...>
- using f = hana::optional<hana::size_t<i - 1>>;
- };
- template <typename Pred, typename ...Xs>
- struct index_if {
- using type = typename index_if_helper<0, sizeof...(Xs), false>
- ::template f<Pred, Xs...>;
- };
- } BOOST_HANA_NAMESPACE_END
- #endif // !BOOST_HANA_DETAIL_INDEX_IF_HPP
|