diff options
Diffstat (limited to 'boost/hana/ext/boost/fusion/detail/common.hpp')
-rw-r--r-- | boost/hana/ext/boost/fusion/detail/common.hpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/boost/hana/ext/boost/fusion/detail/common.hpp b/boost/hana/ext/boost/fusion/detail/common.hpp new file mode 100644 index 0000000000..c6ba922be5 --- /dev/null +++ b/boost/hana/ext/boost/fusion/detail/common.hpp @@ -0,0 +1,79 @@ +/*! +@file +Defines common methods for all Boost.Fusion sequences. + +@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_EXT_BOOST_FUSION_DETAIL_COMMON_HPP +#define BOOST_HANA_EXT_BOOST_FUSION_DETAIL_COMMON_HPP + +#include <boost/hana/bool.hpp> +#include <boost/hana/config.hpp> +#include <boost/hana/core/when.hpp> +#include <boost/hana/fwd/at.hpp> +#include <boost/hana/fwd/concept/sequence.hpp> +#include <boost/hana/fwd/is_empty.hpp> +#include <boost/hana/fwd/length.hpp> +#include <boost/hana/integral_constant.hpp> + +#include <boost/fusion/sequence/intrinsic/at.hpp> +#include <boost/fusion/sequence/intrinsic/empty.hpp> +#include <boost/fusion/sequence/intrinsic/size.hpp> + +#include <cstddef> + + +BOOST_HANA_NAMESPACE_BEGIN + namespace detail { + template <typename T> + struct is_fusion_sequence { + static constexpr bool value = false; + }; + } + + ////////////////////////////////////////////////////////////////////////// + // Iterable + ////////////////////////////////////////////////////////////////////////// + template <typename S> + struct at_impl<S, when<detail::is_fusion_sequence<S>::value>> { + template <typename Xs, typename N> + static constexpr decltype(auto) apply(Xs&& xs, N const&) { + constexpr std::size_t n = N::value; + return boost::fusion::at_c<n>(static_cast<Xs&&>(xs)); + } + }; + + template <typename S> + struct is_empty_impl<S, when<detail::is_fusion_sequence<S>::value>> { + template <typename Xs> + static constexpr auto apply(Xs&& xs) { + using Empty = decltype(boost::fusion::empty(xs)); + return hana::bool_c<Empty::value>; + } + }; + + ////////////////////////////////////////////////////////////////////////// + // Foldable + ////////////////////////////////////////////////////////////////////////// + template <typename S> + struct length_impl<S, when<detail::is_fusion_sequence<S>::value>> { + template <typename Xs> + static constexpr auto apply(Xs const&) { + using Size = typename boost::fusion::result_of::size<Xs>::type; + return hana::size_c<Size::value>; + } + }; + + ////////////////////////////////////////////////////////////////////////// + // Sequence + ////////////////////////////////////////////////////////////////////////// + template <typename S> + struct Sequence<S, when<detail::is_fusion_sequence<S>::value>> { + static constexpr bool value = true; + }; +BOOST_HANA_NAMESPACE_END + +#endif // !BOOST_HANA_EXT_BOOST_FUSION_DETAIL_COMMON_HPP |