summaryrefslogtreecommitdiff
path: root/boost/hana/ext/boost/fusion/detail/common.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/hana/ext/boost/fusion/detail/common.hpp')
-rw-r--r--boost/hana/ext/boost/fusion/detail/common.hpp79
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