123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- /*!
- @file
- Defines `boost::hana::detail::type_at`.
- @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_TYPE_AT_HPP
- #define BOOST_HANA_DETAIL_TYPE_AT_HPP
- #include <boost/hana/config.hpp>
- #include <cstddef>
- #include <utility>
- // If possible, use an intrinsic provided by Clang
- #if defined(__has_builtin)
- # if __has_builtin(__type_pack_element)
- # define BOOST_HANA_USE_TYPE_PACK_ELEMENT_INTRINSIC
- # endif
- #endif
- BOOST_HANA_NAMESPACE_BEGIN namespace detail {
- namespace td {
- template <std::size_t I, typename T>
- struct elt { using type = T; };
- template <typename Indices, typename ...T>
- struct indexer;
- template <std::size_t ...I, typename ...T>
- struct indexer<std::index_sequence<I...>, T...>
- : elt<I, T>...
- { };
- template <std::size_t I, typename T>
- elt<I, T> get_elt(elt<I, T> const&);
- }
- //! @ingroup group-details
- //! Classic MPL-style metafunction returning the nth element of a type
- //! parameter pack.
- template <std::size_t n, typename ...T>
- struct type_at {
- #if defined(BOOST_HANA_USE_TYPE_PACK_ELEMENT_INTRINSIC)
- using type = __type_pack_element<n, T...>;
- #else
- using Indexer = td::indexer<std::make_index_sequence<sizeof...(T)>, T...>;
- using type = typename decltype(td::get_elt<n>(Indexer{}))::type;
- #endif
- };
- } BOOST_HANA_NAMESPACE_END
- #endif // !BOOST_HANA_DETAIL_TYPE_AT_HPP
|