From ea688030928b7232a41653bd573c944f503fb312 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sun, 15 Oct 2017 14:33:50 +0300 Subject: [PATCH] Move mp_fold to detail/mp_fold.hpp --- include/boost/mp11/algorithm.hpp | 46 +------------------ include/boost/mp11/detail/mp_fold.hpp | 65 +++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 44 deletions(-) create mode 100644 include/boost/mp11/detail/mp_fold.hpp diff --git a/include/boost/mp11/algorithm.hpp b/include/boost/mp11/algorithm.hpp index 6a89bc8..4e5bf03 100644 --- a/include/boost/mp11/algorithm.hpp +++ b/include/boost/mp11/algorithm.hpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -29,17 +30,6 @@ namespace boost namespace mp11 { -// mp_fold forward declaration -namespace detail -{ - -template class F> struct mp_fold_impl; - -} // namespace detail - -template class F> using mp_fold = typename detail::mp_fold_impl::type; -template using mp_fold_q = mp_fold; - // mp_transform namespace detail { @@ -767,39 +757,7 @@ template class L, class T1, class T2, class T3, class T4, cla template using mp_reverse = typename detail::mp_reverse_impl::type; // mp_fold -namespace detail -{ - -template class F> struct mp_fold_impl; - -#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1800 ) - -template class L, class... T, class V, template class F> struct mp_fold_impl, V, F> -{ - static_assert( sizeof...(T) == 0, "T... must be empty" ); - using type = V; -}; - -#else - -template class L, class V, template class F> struct mp_fold_impl, V, F> -{ - using type = V; -}; - -#endif - -template class L, class T1, class... T, class V, template class F> struct mp_fold_impl, V, F> -{ - using type = typename mp_fold_impl, F, F>::type; -}; - -template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class... T, class V, template class F> struct mp_fold_impl, V, F> -{ - using type = typename mp_fold_impl, F, T2>, T3>, T4>, T5>, T6>, T7>, T8>, T9>, T10>, F>::type; -}; - -} // namespace detail +// in detail/mp_fold.hpp // mp_reverse_fold namespace detail diff --git a/include/boost/mp11/detail/mp_fold.hpp b/include/boost/mp11/detail/mp_fold.hpp new file mode 100644 index 0000000..62bc785 --- /dev/null +++ b/include/boost/mp11/detail/mp_fold.hpp @@ -0,0 +1,65 @@ +#ifndef BOOST_MP11_DETAIL_MP_FOLD_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MP_FOLD_HPP_INCLUDED + +// Copyright 2015-2017 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_fold +namespace detail +{ + +template class F> struct mp_fold_impl +{ +// An error "no type named 'type'" here means that the first argument to mp_fold is not a list +}; + +#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1800 ) + +template class L, class... T, class V, template class F> struct mp_fold_impl, V, F> +{ + static_assert( sizeof...(T) == 0, "T... must be empty" ); + using type = V; +}; + +#else + +template class L, class V, template class F> struct mp_fold_impl, V, F> +{ + using type = V; +}; + +#endif + +template class L, class T1, class... T, class V, template class F> struct mp_fold_impl, V, F> +{ + using type = typename mp_fold_impl, F, F>::type; +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class... T, class V, template class F> struct mp_fold_impl, V, F> +{ + using type = typename mp_fold_impl, F, T2>, T3>, T4>, T5>, T6>, T7>, T8>, T9>, T10>, F>::type; +}; + +} // namespace detail + +template class F> using mp_fold = typename detail::mp_fold_impl::type; +template using mp_fold_q = mp_fold; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_DETAIL_MP_FOLD_HPP_INCLUDED