/*! @file Adapts `boost::tuple` for use with Hana. @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_EXT_BOOST_TUPLE_HPP #define BOOST_HANA_EXT_BOOST_TUPLE_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef BOOST_HANA_DOXYGEN_INVOKED namespace boost { //! @ingroup group-ext-boost //! Adapter for `boost::tuple`s. //! //! //! Modeled concepts //! ---------------- //! A `boost::tuple` is a model of the `Sequence` concept, and all the //! concepts it refines. That makes it essentially the same as a Hana //! tuple, although the complexity of some operations might differ from //! that of Hana's tuple. //! //! @include example/ext/boost/tuple.cpp template struct tuple { }; } #endif BOOST_HANA_NAMESPACE_BEGIN namespace ext { namespace boost { struct tuple_tag; }} template struct tag_of> { using type = ext::boost::tuple_tag; }; template struct tag_of> { using type = ext::boost::tuple_tag; }; template <> struct tag_of { using type = ext::boost::tuple_tag; }; ////////////////////////////////////////////////////////////////////////// // Iterable ////////////////////////////////////////////////////////////////////////// template <> struct at_impl { template static constexpr decltype(auto) apply(Xs&& xs, N const&) { constexpr std::size_t n = N::value; return static_cast(xs).template get(); } }; template <> struct drop_front_impl { template static constexpr auto drop_front_helper(Xs&& xs, std::index_sequence) { return hana::make( hana::at_c(static_cast(xs))... ); } template static constexpr auto apply(Xs&& xs, N const&) { constexpr std::size_t n = N::value; constexpr std::size_t len = decltype(hana::length(xs))::value; return drop_front_helper(static_cast(xs), std::make_index_sequence<(n < len ? len - n : 0)>{}); } }; template <> struct is_empty_impl { static constexpr auto apply(boost::tuples::null_type const&) { return hana::true_c; } template static constexpr auto apply(boost::tuples::cons const&) { return hana::false_c; } }; ////////////////////////////////////////////////////////////////////////// // Foldable ////////////////////////////////////////////////////////////////////////// template <> struct length_impl { template static constexpr auto apply(Xs const&) { return hana::size_c::value>; } }; ////////////////////////////////////////////////////////////////////////// // Sequence ////////////////////////////////////////////////////////////////////////// template <> struct Sequence { static constexpr bool value = true; }; template <> struct make_impl { template static constexpr auto apply(Xs&& ...xs) { return boost::tuples::tuple< typename detail::decay::type... >{static_cast(xs)...}; } }; BOOST_HANA_NAMESPACE_END #endif // !BOOST_HANA_EXT_BOOST_TUPLE_HPP