From f24d1ca5df53fe9f70ae359a3b8ecd4bb86bcef2 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Fri, 4 Aug 2017 01:00:50 +0300 Subject: [PATCH] Remove single header --- include/boost/mp11_single.hpp | 2748 --------------------------------- tools/single-header.bat | 1 - tools/single-header.py | 54 - 3 files changed, 2803 deletions(-) delete mode 100644 include/boost/mp11_single.hpp delete mode 100644 tools/single-header.bat delete mode 100644 tools/single-header.py diff --git a/include/boost/mp11_single.hpp b/include/boost/mp11_single.hpp deleted file mode 100644 index 5898d3f..0000000 --- a/include/boost/mp11_single.hpp +++ /dev/null @@ -1,2748 +0,0 @@ -#ifndef BOOST_MP11_HPP_INCLUDED -#define BOOST_MP11_HPP_INCLUDED - -// Copyright 2015 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 - -#ifndef BOOST_MP11_LIST_HPP_INCLUDED -#define BOOST_MP11_LIST_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 - -#ifndef BOOST_MP11_INTEGRAL_HPP_INCLUDED -#define BOOST_MP11_INTEGRAL_HPP_INCLUDED - -// Copyright 2015 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 - -namespace boost -{ -namespace mp11 -{ - -// mp_bool -template using mp_bool = std::integral_constant; - -using mp_true = mp_bool; -using mp_false = mp_bool; - -// mp_to_bool -template using mp_to_bool = mp_bool( T::value )>; - -// mp_not -template using mp_not = mp_bool< !T::value >; - -// mp_int -template using mp_int = std::integral_constant; - -// mp_size_t -template using mp_size_t = std::integral_constant; - -} // namespace mp11 -} // namespace boost - -#endif // #ifndef BOOST_MP11_INTEGRAL_HPP_INCLUDED -#ifndef BOOST_MP11_DETAIL_MP_LIST_HPP_INCLUDED -#define BOOST_MP11_DETAIL_MP_LIST_HPP_INCLUDED - -// Copyright 2015, 2016 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 - -namespace boost -{ -namespace mp11 -{ - -// mp_list -template struct mp_list -{ -}; - -} // namespace mp11 -} // namespace boost - -#endif // #ifndef BOOST_MP11_DETAIL_MP_LIST_HPP_INCLUDED -#ifndef BOOST_MP11_DETAIL_MP_APPEND_HPP_INCLUDED -#define BOOST_MP11_DETAIL_MP_APPEND_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 - -#ifndef BOOST_MP11_UTILITY_HPP_INCLUDED -#define BOOST_MP11_UTILITY_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 - -namespace boost -{ -namespace mp11 -{ - -// mp_identity -template struct mp_identity -{ - using type = T; -}; - -// mp_identity_t -template using mp_identity_t = typename mp_identity::type; - -// mp_inherit -template struct mp_inherit: T... {}; - -// mp_if, mp_if_c -namespace detail -{ - -template struct mp_if_c_impl -{ -}; - -template struct mp_if_c_impl -{ - using type = T; -}; - -template struct mp_if_c_impl -{ - using type = E; -}; - -} // namespace detail - -template using mp_if_c = typename detail::mp_if_c_impl::type; -template using mp_if = typename detail::mp_if_c_impl(C::value), T, E...>::type; - -// mp_valid -// implementation by Bruno Dutra (by the name is_evaluable) -namespace detail -{ - -template class F, class... T> struct mp_valid_impl -{ - template class G, class = G> static mp_true check(int); - template class> static mp_false check(...); - - using type = decltype(check(0)); -}; - -} // namespace detail - -template class F, class... T> using mp_valid = typename detail::mp_valid_impl::type; - -// mp_defer -namespace detail -{ - -template class F, class... T> struct mp_defer_impl -{ - using type = F; -}; - -struct mp_no_type -{ -}; - -} // namespace detail - -template class F, class... T> using mp_defer = mp_if, detail::mp_defer_impl, detail::mp_no_type>; - -// mp_eval_if, mp_eval_if_c -namespace detail -{ - -template class F, class... U> struct mp_eval_if_c_impl; - -template class F, class... U> struct mp_eval_if_c_impl -{ - using type = T; -}; - -template class F, class... U> struct mp_eval_if_c_impl: mp_defer -{ -}; - -} // namespace detail - -template class F, class... U> using mp_eval_if_c = typename detail::mp_eval_if_c_impl::type; -template class F, class... U> using mp_eval_if = typename detail::mp_eval_if_c_impl(C::value), T, F, U...>::type; -template using mp_eval_if_q = typename detail::mp_eval_if_c_impl(C::value), T, Q::template fn, U...>::type; - -// mp_quote -template class F> struct mp_quote -{ - // the indirection through mp_defer works around the language inability - // to expand T... into a fixed parameter list of an alias template - - template using fn = typename mp_defer::type; -}; - -// mp_invoke -#if BOOST_WORKAROUND( BOOST_MSVC, < 1900 ) - -namespace detail -{ - -template struct mp_invoke_impl: mp_defer {}; - -} // namespace detail - -template using mp_invoke = typename detail::mp_invoke_impl::type; - -#elif BOOST_WORKAROUND( BOOST_GCC, < 50000 ) - -template using mp_invoke = typename mp_defer::type; - -#else - -template using mp_invoke = typename Q::template fn; - -#endif - -} // namespace mp11 -} // namespace boost - -#endif // #ifndef BOOST_MP11_UTILITY_HPP_INCLUDED -#include -#include - -namespace boost -{ -namespace mp11 -{ - -// mp_append - -namespace detail -{ - -template struct mp_append_impl; - -#if BOOST_WORKAROUND( BOOST_MSVC, <= 1800 ) - -template<> struct mp_append_impl<> -{ - using type = mp_list<>; -}; - -template class L, class... T> struct mp_append_impl> -{ - using type = L; -}; - -template class L1, class... T1, template class L2, class... T2, class... Lr> struct mp_append_impl, L2, Lr...> -{ - using type = typename mp_append_impl, Lr...>::type; -}; - -#else - -template, class L2 = mp_list<>, class L3 = mp_list<>, class L4 = mp_list<>, class L5 = mp_list<>, class L6 = mp_list<>, class L7 = mp_list<>, class L8 = mp_list<>, class L9 = mp_list<>, class L10 = mp_list<>, class L11 = mp_list<>> struct append_11_impl; - -template< - template class L1, class... T1, - template class L2, class... T2, - template class L3, class... T3, - template class L4, class... T4, - template class L5, class... T5, - template class L6, class... T6, - template class L7, class... T7, - template class L8, class... T8, - template class L9, class... T9, - template class L10, class... T10, - template class L11, class... T11> - -struct append_11_impl, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11> -{ - using type = L1; -}; - -template< - - class L00 = mp_list<>, class L01 = mp_list<>, class L02 = mp_list<>, class L03 = mp_list<>, class L04 = mp_list<>, class L05 = mp_list<>, class L06 = mp_list<>, class L07 = mp_list<>, class L08 = mp_list<>, class L09 = mp_list<>, class L0A = mp_list<>, - class L10 = mp_list<>, class L11 = mp_list<>, class L12 = mp_list<>, class L13 = mp_list<>, class L14 = mp_list<>, class L15 = mp_list<>, class L16 = mp_list<>, class L17 = mp_list<>, class L18 = mp_list<>, class L19 = mp_list<>, - class L20 = mp_list<>, class L21 = mp_list<>, class L22 = mp_list<>, class L23 = mp_list<>, class L24 = mp_list<>, class L25 = mp_list<>, class L26 = mp_list<>, class L27 = mp_list<>, class L28 = mp_list<>, class L29 = mp_list<>, - class L30 = mp_list<>, class L31 = mp_list<>, class L32 = mp_list<>, class L33 = mp_list<>, class L34 = mp_list<>, class L35 = mp_list<>, class L36 = mp_list<>, class L37 = mp_list<>, class L38 = mp_list<>, class L39 = mp_list<>, - class L40 = mp_list<>, class L41 = mp_list<>, class L42 = mp_list<>, class L43 = mp_list<>, class L44 = mp_list<>, class L45 = mp_list<>, class L46 = mp_list<>, class L47 = mp_list<>, class L48 = mp_list<>, class L49 = mp_list<>, - class L50 = mp_list<>, class L51 = mp_list<>, class L52 = mp_list<>, class L53 = mp_list<>, class L54 = mp_list<>, class L55 = mp_list<>, class L56 = mp_list<>, class L57 = mp_list<>, class L58 = mp_list<>, class L59 = mp_list<>, - class L60 = mp_list<>, class L61 = mp_list<>, class L62 = mp_list<>, class L63 = mp_list<>, class L64 = mp_list<>, class L65 = mp_list<>, class L66 = mp_list<>, class L67 = mp_list<>, class L68 = mp_list<>, class L69 = mp_list<>, - class L70 = mp_list<>, class L71 = mp_list<>, class L72 = mp_list<>, class L73 = mp_list<>, class L74 = mp_list<>, class L75 = mp_list<>, class L76 = mp_list<>, class L77 = mp_list<>, class L78 = mp_list<>, class L79 = mp_list<>, - class L80 = mp_list<>, class L81 = mp_list<>, class L82 = mp_list<>, class L83 = mp_list<>, class L84 = mp_list<>, class L85 = mp_list<>, class L86 = mp_list<>, class L87 = mp_list<>, class L88 = mp_list<>, class L89 = mp_list<>, - class L90 = mp_list<>, class L91 = mp_list<>, class L92 = mp_list<>, class L93 = mp_list<>, class L94 = mp_list<>, class L95 = mp_list<>, class L96 = mp_list<>, class L97 = mp_list<>, class L98 = mp_list<>, class L99 = mp_list<>, - class LA0 = mp_list<>, class LA1 = mp_list<>, class LA2 = mp_list<>, class LA3 = mp_list<>, class LA4 = mp_list<>, class LA5 = mp_list<>, class LA6 = mp_list<>, class LA7 = mp_list<>, class LA8 = mp_list<>, class LA9 = mp_list<> - -> struct append_111_impl -{ - using type = typename append_11_impl< - - typename append_11_impl::type, - typename append_11_impl, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19>::type, - typename append_11_impl, L20, L21, L22, L23, L24, L25, L26, L27, L28, L29>::type, - typename append_11_impl, L30, L31, L32, L33, L34, L35, L36, L37, L38, L39>::type, - typename append_11_impl, L40, L41, L42, L43, L44, L45, L46, L47, L48, L49>::type, - typename append_11_impl, L50, L51, L52, L53, L54, L55, L56, L57, L58, L59>::type, - typename append_11_impl, L60, L61, L62, L63, L64, L65, L66, L67, L68, L69>::type, - typename append_11_impl, L70, L71, L72, L73, L74, L75, L76, L77, L78, L79>::type, - typename append_11_impl, L80, L81, L82, L83, L84, L85, L86, L87, L88, L89>::type, - typename append_11_impl, L90, L91, L92, L93, L94, L95, L96, L97, L98, L99>::type, - typename append_11_impl, LA0, LA1, LA2, LA3, LA4, LA5, LA6, LA7, LA8, LA9>::type - - >::type; -}; - -template< - - class L00, class L01, class L02, class L03, class L04, class L05, class L06, class L07, class L08, class L09, class L0A, - class L10, class L11, class L12, class L13, class L14, class L15, class L16, class L17, class L18, class L19, - class L20, class L21, class L22, class L23, class L24, class L25, class L26, class L27, class L28, class L29, - class L30, class L31, class L32, class L33, class L34, class L35, class L36, class L37, class L38, class L39, - class L40, class L41, class L42, class L43, class L44, class L45, class L46, class L47, class L48, class L49, - class L50, class L51, class L52, class L53, class L54, class L55, class L56, class L57, class L58, class L59, - class L60, class L61, class L62, class L63, class L64, class L65, class L66, class L67, class L68, class L69, - class L70, class L71, class L72, class L73, class L74, class L75, class L76, class L77, class L78, class L79, - class L80, class L81, class L82, class L83, class L84, class L85, class L86, class L87, class L88, class L89, - class L90, class L91, class L92, class L93, class L94, class L95, class L96, class L97, class L98, class L99, - class LA0, class LA1, class LA2, class LA3, class LA4, class LA5, class LA6, class LA7, class LA8, class LA9, - class... Lr - -> struct append_inf_impl -{ - using prefix = typename append_111_impl< - - L00, L01, L02, L03, L04, L05, L06, L07, L08, L09, L0A, - L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, - L20, L21, L22, L23, L24, L25, L26, L27, L28, L29, - L30, L31, L32, L33, L34, L35, L36, L37, L38, L39, - L40, L41, L42, L43, L44, L45, L46, L47, L48, L49, - L50, L51, L52, L53, L54, L55, L56, L57, L58, L59, - L60, L61, L62, L63, L64, L65, L66, L67, L68, L69, - L70, L71, L72, L73, L74, L75, L76, L77, L78, L79, - L80, L81, L82, L83, L84, L85, L86, L87, L88, L89, - L90, L91, L92, L93, L94, L95, L96, L97, L98, L99, - LA0, LA1, LA2, LA3, LA4, LA5, LA6, LA7, LA8, LA9 - - >::type; - - using type = typename mp_append_impl::type; -}; - -template struct mp_append_impl: mp_if_c<(sizeof...(L) > 111), mp_quote, mp_if_c<(sizeof...(L) > 11), mp_quote, mp_quote>>::template fn -{ -}; - -#endif - -} // namespace detail - -template using mp_append = typename detail::mp_append_impl::type; - -} // namespace mp11 -} // namespace boost - -#endif // #ifndef BOOST_MP11_DETAIL_MP_APPEND_HPP_INCLUDED -#include -#include - -namespace boost -{ -namespace mp11 -{ - -// mp_size -namespace detail -{ - -template struct mp_size_impl; - -template class L, class... T> struct mp_size_impl> -{ - using type = mp_size_t; -}; - -} // namespace detail - -template using mp_size = typename detail::mp_size_impl::type; - -// mp_empty -template using mp_empty = mp_bool< mp_size::value == 0 >; - -// mp_front -namespace detail -{ - -template struct mp_front_impl; - -template class L, class T1, class... T> struct mp_front_impl> -{ - using type = T1; -}; - -} // namespace detail - -template using mp_front = typename detail::mp_front_impl::type; - -// mp_pop_front -namespace detail -{ - -template struct mp_pop_front_impl; - -template class L, class T1, class... T> struct mp_pop_front_impl> -{ - using type = L; -}; - -} // namespace detail - -template using mp_pop_front = typename detail::mp_pop_front_impl::type; - -// mp_first -template using mp_first = mp_front; - -// mp_rest -template using mp_rest = mp_pop_front; - -// mp_second -namespace detail -{ - -template struct mp_second_impl; - -template class L, class T1, class T2, class... T> struct mp_second_impl> -{ - using type = T2; -}; - -} // namespace detail - -template using mp_second = typename detail::mp_second_impl::type; - -// mp_third -namespace detail -{ - -template struct mp_third_impl; - -template class L, class T1, class T2, class T3, class... T> struct mp_third_impl> -{ - using type = T3; -}; - -} // namespace detail - -template using mp_third = typename detail::mp_third_impl::type; - -// mp_push_front -namespace detail -{ - -template struct mp_push_front_impl; - -template class L, class... U, class... T> struct mp_push_front_impl, T...> -{ - using type = L; -}; - -} // namespace detail - -template using mp_push_front = typename detail::mp_push_front_impl::type; - -// mp_push_back -namespace detail -{ - -template struct mp_push_back_impl; - -template class L, class... U, class... T> struct mp_push_back_impl, T...> -{ - using type = L; -}; - -} // namespace detail - -template using mp_push_back = typename detail::mp_push_back_impl::type; - -// mp_rename -namespace detail -{ - -template class B> struct mp_rename_impl; - -template class A, class... T, template class B> struct mp_rename_impl, B> -{ - using type = B; -}; - -} // namespace detail - -template class B> using mp_rename = typename detail::mp_rename_impl::type; - -template class F, class L> using mp_apply = typename detail::mp_rename_impl::type; - -template using mp_apply_q = typename detail::mp_rename_impl::type; - -// mp_replace_front -namespace detail -{ - -template struct mp_replace_front_impl; - -template class L, class U1, class... U, class T> struct mp_replace_front_impl, T> -{ - using type = L; -}; - -} // namespace detail - -template using mp_replace_front = typename detail::mp_replace_front_impl::type; - -// mp_replace_first -template using mp_replace_first = typename detail::mp_replace_front_impl::type; - -// mp_replace_second -namespace detail -{ - -template struct mp_replace_second_impl; - -template class L, class U1, class U2, class... U, class T> struct mp_replace_second_impl, T> -{ - using type = L; -}; - -} // namespace detail - -template using mp_replace_second = typename detail::mp_replace_second_impl::type; - -// mp_replace_third -namespace detail -{ - -template struct mp_replace_third_impl; - -template class L, class U1, class U2, class U3, class... U, class T> struct mp_replace_third_impl, T> -{ - using type = L; -}; - -} // namespace detail - -template using mp_replace_third = typename detail::mp_replace_third_impl::type; - -} // namespace mp11 -} // namespace boost - -#endif // #ifndef BOOST_MP11_LIST_HPP_INCLUDED -#ifndef BOOST_MP11_ALGORITHM_HPP_INCLUDED -#define BOOST_MP11_ALGORITHM_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 - -#ifndef BOOST_MP11_SET_HPP_INCLUDED -#define BOOST_MP11_SET_HPP_INCLUDED - -// Copyright 2015 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 - -namespace boost -{ -namespace mp11 -{ - -// mp_set_contains -namespace detail -{ - -template struct mp_set_contains_impl; - -template class L, class... T, class V> struct mp_set_contains_impl, V> -{ - using type = mp_to_bool, mp_inherit...>>>; -}; - -} // namespace detail - -template using mp_set_contains = typename detail::mp_set_contains_impl::type; - -// mp_set_push_back -namespace detail -{ - -template struct mp_set_push_back_impl; - -template class L, class... U> struct mp_set_push_back_impl> -{ - using type = L; -}; - -template class L, class... U, class T1, class... T> struct mp_set_push_back_impl, T1, T...> -{ - using S = mp_if, T1>, L, L>; - using type = typename mp_set_push_back_impl::type; -}; - -} // namespace detail - -template using mp_set_push_back = typename detail::mp_set_push_back_impl::type; - -// mp_set_push_front -namespace detail -{ - -template struct mp_set_push_front_impl; - -template class L, class... U> struct mp_set_push_front_impl> -{ - using type = L; -}; - -template class L, class... U, class T1> struct mp_set_push_front_impl, T1> -{ - using type = mp_if, T1>, L, L>; -}; - -template class L, class... U, class T1, class... T> struct mp_set_push_front_impl, T1, T...> -{ - using S = typename mp_set_push_front_impl, T...>::type; - using type = typename mp_set_push_front_impl::type; -}; - -} // namespace detail - -template using mp_set_push_front = typename detail::mp_set_push_front_impl::type; - -} // namespace mp11 -} // namespace boost - -#endif // #ifndef BOOST_MP11_SET_HPP_INCLUDED -#ifndef BOOST_MP11_FUNCTION_HPP_INCLUDED -#define BOOST_MP11_FUNCTION_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 - -#ifndef BOOST_MP11_DETAIL_MP_COUNT_HPP_INCLUDED -#define BOOST_MP11_DETAIL_MP_COUNT_HPP_INCLUDED - -// Copyright 2015, 2016 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 - -#ifndef BOOST_MP11_DETAIL_MP_PLUS_HPP_INCLUDED -#define BOOST_MP11_DETAIL_MP_PLUS_HPP_INCLUDED - -// Copyright 2015 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 - -#ifndef BOOST_MP11_DETAIL_CONFIG_HPP_INCLUDED -#define BOOST_MP11_DETAIL_CONFIG_HPP_INCLUDED - -// Copyright 2016 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 - -#if defined( BOOST_NO_CXX11_CONSTEXPR ) - -# define BOOST_MP11_NO_CONSTEXPR - -#elif defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) - -# define BOOST_MP11_NO_CONSTEXPR - -#endif - -#if defined(__cpp_fold_expressions) && __cpp_fold_expressions >= 201603 - -# define BOOST_MP11_HAS_FOLD_EXPRESSIONS - -#elif defined(BOOST_CLANG) && defined(__has_cpp_attribute) -# if __has_cpp_attribute(fallthrough) && __cplusplus >= 201406L // Clang 3.9+ in c++1z mode - -# define BOOST_MP11_HAS_FOLD_EXPRESSIONS - -# endif -#endif - -#if defined(__has_builtin) -# if __has_builtin(__type_pack_element) - -# define BOOST_MP11_HAS_TYPE_PACK_ELEMENT - -# endif -#endif - -#endif // #ifndef BOOST_MP11_DETAIL_CONFIG_HPP_INCLUDED -#include -#include - -namespace boost -{ -namespace mp11 -{ - -// mp_plus -namespace detail -{ - -#if defined( BOOST_MP11_HAS_FOLD_EXPRESSIONS ) - -template struct mp_plus_impl -{ - static const auto _v = (T::value + ... + 0); - using type = std::integral_constant::type, _v>; -}; - -#else - -template struct mp_plus_impl; - -template<> struct mp_plus_impl<> -{ - using type = std::integral_constant; -}; - -#if BOOST_WORKAROUND( BOOST_GCC, < 40800 ) - -template struct mp_plus_impl -{ - static const decltype(T1::value + mp_plus_impl::type::value) _v = T1::value + mp_plus_impl::type::value; - using type = std::integral_constant::type, _v>; -}; - -template struct mp_plus_impl -{ - static const - decltype(T1::value + T2::value + T3::value + T4::value + T5::value + T6::value + T7::value + T8::value + T9::value + T10::value + mp_plus_impl::type::value) - _v = T1::value + T2::value + T3::value + T4::value + T5::value + T6::value + T7::value + T8::value + T9::value + T10::value + mp_plus_impl::type::value; - using type = std::integral_constant::type, _v>; -}; - -#else - -template struct mp_plus_impl -{ - static const auto _v = T1::value + mp_plus_impl::type::value; - using type = std::integral_constant::type, _v>; -}; - -template struct mp_plus_impl -{ - static const auto _v = T1::value + T2::value + T3::value + T4::value + T5::value + T6::value + T7::value + T8::value + T9::value + T10::value + mp_plus_impl::type::value; - using type = std::integral_constant::type, _v>; -}; - -#endif - -#endif - -} // namespace detail - -template using mp_plus = typename detail::mp_plus_impl::type; - -} // namespace mp11 -} // namespace boost - -#endif // #ifndef BOOST_MP11_DETAIL_MP_PLUS_HPP_INCLUDED -#include - -namespace boost -{ -namespace mp11 -{ - -// mp_count -namespace detail -{ - -template struct mp_count_impl; - -#if defined( BOOST_MP11_HAS_FOLD_EXPRESSIONS ) - -template class L, class... T, class V> struct mp_count_impl, V> -{ - using type = mp_size_t<(std::is_same::value + ... + 0)>; -}; - -#elif !defined( BOOST_MP11_NO_CONSTEXPR ) - -constexpr std::size_t cx_plus() -{ - return 0; -} - -template constexpr std::size_t cx_plus(T1 t1, T... t) -{ - return t1 + cx_plus(t...); -} - -template -constexpr std::size_t cx_plus(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10, T... t) -{ - return t1 + t2 + t3 + t4 + t5 + t6 + t7 + t8 + t9 + t10 + cx_plus(t...); -} - -template class L, class... T, class V> struct mp_count_impl, V> -{ - using type = mp_size_t::value...)>; -}; - -#else - -template class L, class... T, class V> struct mp_count_impl, V> -{ - using type = mp_size_t...>::value>; -}; - -#endif - -} // namespace detail - -template using mp_count = typename detail::mp_count_impl::type; - -// mp_count_if -namespace detail -{ - -template class P> struct mp_count_if_impl; - -#if defined( BOOST_MP11_HAS_FOLD_EXPRESSIONS ) - -template class L, class... T, template class P> struct mp_count_if_impl, P> -{ - using type = mp_size_t<(mp_to_bool>::value + ... + 0)>; -}; - -#elif !defined( BOOST_MP11_NO_CONSTEXPR ) - -template class L, class... T, template class P> struct mp_count_if_impl, P> -{ - using type = mp_size_t>::value...)>; -}; - -#else - -template class L, class... T, template class P> struct mp_count_if_impl, P> -{ -#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) - - template struct _f { using type = mp_to_bool>; }; - using type = mp_size_t::type...>::value>; - -#else - - using type = mp_size_t>...>::value>; - -#endif -}; - -#endif - -} // namespace detail - -template class P> using mp_count_if = typename detail::mp_count_if_impl::type; - -} // namespace mp11 -} // namespace boost - -#endif // #ifndef BOOST_MP11_DETAIL_MP_COUNT_HPP_INCLUDED -#include - -namespace boost -{ -namespace mp11 -{ - -// mp_void -namespace detail -{ - -template struct mp_void_impl -{ - using type = void; -}; - -} // namespace detail - -template using mp_void = typename detail::mp_void_impl::type; - -// mp_and -#if BOOST_WORKAROUND( BOOST_MSVC, < 1910 ) - -namespace detail -{ - -template struct mp_and_impl; - -} // namespace detail - -template using mp_and = mp_to_bool< typename detail::mp_and_impl::type >; - -namespace detail -{ - -template<> struct mp_and_impl<> -{ - using type = mp_true; -}; - -template struct mp_and_impl -{ - using type = T; -}; - -template struct mp_and_impl -{ - using type = mp_eval_if< mp_not, T1, mp_and, T... >; -}; - -} // namespace detail - -#else - -namespace detail -{ - -template struct mp_and_impl -{ - using type = mp_false; -}; - -template struct mp_and_impl< mp_list, mp_void...> > -{ - using type = mp_true; -}; - -} // namespace detail - -template using mp_and = typename detail::mp_and_impl>::type; - -#endif - -// mp_all -#if BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) || BOOST_WORKAROUND( BOOST_GCC, < 70200 ) - -template using mp_all = mp_bool< mp_count_if< mp_list, mp_not >::value == 0 >; - -#elif defined( BOOST_MP11_HAS_FOLD_EXPRESSIONS ) - -template using mp_all = mp_bool<(static_cast(T::value) && ...)>; - -#else - -template using mp_all = mp_and...>; - -#endif - -// mp_or -namespace detail -{ - -template struct mp_or_impl; - -} // namespace detail - -template using mp_or = mp_to_bool< typename detail::mp_or_impl::type >; - -namespace detail -{ - -template<> struct mp_or_impl<> -{ - using type = mp_false; -}; - -template struct mp_or_impl -{ - using type = T; -}; - -template struct mp_or_impl -{ - using type = mp_eval_if< T1, T1, mp_or, T... >; -}; - -} // namespace detail - -// mp_any -#if defined( BOOST_MP11_HAS_FOLD_EXPRESSIONS ) && !BOOST_WORKAROUND( BOOST_GCC, < 70200 ) - -template using mp_any = mp_bool<(static_cast(T::value) || ...)>; - -#else - -template using mp_any = mp_bool< mp_count_if< mp_list, mp_to_bool >::value != 0 >; - -#endif - -// mp_same -namespace detail -{ - -template struct mp_same_impl; - -template<> struct mp_same_impl<> -{ - using type = mp_true; -}; - -template struct mp_same_impl -{ - using type = mp_all...>; -}; - -} // namespace detail - -template using mp_same = typename detail::mp_same_impl::type; - -} // namespace mp11 -} // namespace boost - -#endif // #ifndef BOOST_MP11_FUNCTION_HPP_INCLUDED -#ifndef BOOST_MP11_DETAIL_MP_MAP_FIND_HPP_INCLUDED -#define BOOST_MP11_DETAIL_MP_MAP_FIND_HPP_INCLUDED - -// Copyright 2015 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 - - -namespace boost -{ -namespace mp11 -{ - -// mp_map_find -namespace detail -{ - -template struct mp_map_find_impl; - -template class M, class... T, class K> struct mp_map_find_impl, K> -{ - using U = mp_inherit...>; - - template class L, class... U> static mp_identity> f( mp_identity>* ); - static mp_identity f( ... ); - - using V = decltype( f((U*)0) ); - - using type = typename V::type; -}; - -} // namespace detail - -template using mp_map_find = typename detail::mp_map_find_impl::type; - -} // namespace mp11 -} // namespace boost - -#endif // #ifndef BOOST_MP11_DETAIL_MP_MAP_FIND_HPP_INCLUDED -#ifndef BOOST_MP11_DETAIL_MP_WITH_INDEX_HPP_INCLUDED -#define BOOST_MP11_DETAIL_MP_WITH_INDEX_HPP_INCLUDED - -// Copyright 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 - -#if !defined( BOOST_NO_CXX14_CONSTEXPR ) -# define BOOST_MP11_CONSTEXPR14 constexpr -#else -# define BOOST_MP11_CONSTEXPR14 -#endif - -namespace boost -{ -namespace mp11 -{ - -namespace detail -{ - -template struct mp_with_index_impl_ -{ - template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) - { - switch( i ) - { - case 0: return std::forward(f)( mp_size_t() ); - case 1: return std::forward(f)( mp_size_t() ); - case 2: return std::forward(f)( mp_size_t() ); - case 3: return std::forward(f)( mp_size_t() ); - case 4: return std::forward(f)( mp_size_t() ); - case 5: return std::forward(f)( mp_size_t() ); - case 6: return std::forward(f)( mp_size_t() ); - case 7: return std::forward(f)( mp_size_t() ); - case 8: return std::forward(f)( mp_size_t() ); - case 9: return std::forward(f)( mp_size_t() ); - case 10: return std::forward(f)( mp_size_t() ); - case 11: return std::forward(f)( mp_size_t() ); - case 12: return std::forward(f)( mp_size_t() ); - case 13: return std::forward(f)( mp_size_t() ); - case 14: return std::forward(f)( mp_size_t() ); - case 15: return std::forward(f)( mp_size_t() ); - } - - return mp_with_index_impl_::template call( i-16, std::forward(f) ); - } -}; - -template<> struct mp_with_index_impl_<0> -{ -}; - -template<> struct mp_with_index_impl_<1> -{ - template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t /*i*/, F && f ) - { - return std::forward(f)( mp_size_t() ); - } -}; - -template<> struct mp_with_index_impl_<2> -{ - template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) - { - switch( i ) - { - case 0: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); - } - } -}; - -template<> struct mp_with_index_impl_<3> -{ - template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) - { - switch( i ) - { - case 0: return std::forward(f)( mp_size_t() ); - case 1: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); - } - } -}; - -template<> struct mp_with_index_impl_<4> -{ - template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) - { - switch( i ) - { - case 0: return std::forward(f)( mp_size_t() ); - case 1: return std::forward(f)( mp_size_t() ); - case 2: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); - } - } -}; - -template<> struct mp_with_index_impl_<5> -{ - template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) - { - switch( i ) - { - case 0: return std::forward(f)( mp_size_t() ); - case 1: return std::forward(f)( mp_size_t() ); - case 2: return std::forward(f)( mp_size_t() ); - case 3: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); - } - } -}; - -template<> struct mp_with_index_impl_<6> -{ - template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) - { - switch( i ) - { - case 0: return std::forward(f)( mp_size_t() ); - case 1: return std::forward(f)( mp_size_t() ); - case 2: return std::forward(f)( mp_size_t() ); - case 3: return std::forward(f)( mp_size_t() ); - case 4: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); - } - } -}; - -template<> struct mp_with_index_impl_<7> -{ - template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) - { - switch( i ) - { - case 0: return std::forward(f)( mp_size_t() ); - case 1: return std::forward(f)( mp_size_t() ); - case 2: return std::forward(f)( mp_size_t() ); - case 3: return std::forward(f)( mp_size_t() ); - case 4: return std::forward(f)( mp_size_t() ); - case 5: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); - } - } -}; - -template<> struct mp_with_index_impl_<8> -{ - template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) - { - switch( i ) - { - case 0: return std::forward(f)( mp_size_t() ); - case 1: return std::forward(f)( mp_size_t() ); - case 2: return std::forward(f)( mp_size_t() ); - case 3: return std::forward(f)( mp_size_t() ); - case 4: return std::forward(f)( mp_size_t() ); - case 5: return std::forward(f)( mp_size_t() ); - case 6: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); - } - } -}; - -template<> struct mp_with_index_impl_<9> -{ - template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) - { - switch( i ) - { - case 0: return std::forward(f)( mp_size_t() ); - case 1: return std::forward(f)( mp_size_t() ); - case 2: return std::forward(f)( mp_size_t() ); - case 3: return std::forward(f)( mp_size_t() ); - case 4: return std::forward(f)( mp_size_t() ); - case 5: return std::forward(f)( mp_size_t() ); - case 6: return std::forward(f)( mp_size_t() ); - case 7: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); - } - } -}; - -template<> struct mp_with_index_impl_<10> -{ - template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) - { - switch( i ) - { - case 0: return std::forward(f)( mp_size_t() ); - case 1: return std::forward(f)( mp_size_t() ); - case 2: return std::forward(f)( mp_size_t() ); - case 3: return std::forward(f)( mp_size_t() ); - case 4: return std::forward(f)( mp_size_t() ); - case 5: return std::forward(f)( mp_size_t() ); - case 6: return std::forward(f)( mp_size_t() ); - case 7: return std::forward(f)( mp_size_t() ); - case 8: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); - } - } -}; - -template<> struct mp_with_index_impl_<11> -{ - template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) - { - switch( i ) - { - case 0: return std::forward(f)( mp_size_t() ); - case 1: return std::forward(f)( mp_size_t() ); - case 2: return std::forward(f)( mp_size_t() ); - case 3: return std::forward(f)( mp_size_t() ); - case 4: return std::forward(f)( mp_size_t() ); - case 5: return std::forward(f)( mp_size_t() ); - case 6: return std::forward(f)( mp_size_t() ); - case 7: return std::forward(f)( mp_size_t() ); - case 8: return std::forward(f)( mp_size_t() ); - case 9: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); - } - } -}; - -template<> struct mp_with_index_impl_<12> -{ - template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) - { - switch( i ) - { - case 0: return std::forward(f)( mp_size_t() ); - case 1: return std::forward(f)( mp_size_t() ); - case 2: return std::forward(f)( mp_size_t() ); - case 3: return std::forward(f)( mp_size_t() ); - case 4: return std::forward(f)( mp_size_t() ); - case 5: return std::forward(f)( mp_size_t() ); - case 6: return std::forward(f)( mp_size_t() ); - case 7: return std::forward(f)( mp_size_t() ); - case 8: return std::forward(f)( mp_size_t() ); - case 9: return std::forward(f)( mp_size_t() ); - case 10: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); - } - } -}; - -template<> struct mp_with_index_impl_<13> -{ - template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) - { - switch( i ) - { - case 0: return std::forward(f)( mp_size_t() ); - case 1: return std::forward(f)( mp_size_t() ); - case 2: return std::forward(f)( mp_size_t() ); - case 3: return std::forward(f)( mp_size_t() ); - case 4: return std::forward(f)( mp_size_t() ); - case 5: return std::forward(f)( mp_size_t() ); - case 6: return std::forward(f)( mp_size_t() ); - case 7: return std::forward(f)( mp_size_t() ); - case 8: return std::forward(f)( mp_size_t() ); - case 9: return std::forward(f)( mp_size_t() ); - case 10: return std::forward(f)( mp_size_t() ); - case 11: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); - } - } -}; - -template<> struct mp_with_index_impl_<14> -{ - template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) - { - switch( i ) - { - case 0: return std::forward(f)( mp_size_t() ); - case 1: return std::forward(f)( mp_size_t() ); - case 2: return std::forward(f)( mp_size_t() ); - case 3: return std::forward(f)( mp_size_t() ); - case 4: return std::forward(f)( mp_size_t() ); - case 5: return std::forward(f)( mp_size_t() ); - case 6: return std::forward(f)( mp_size_t() ); - case 7: return std::forward(f)( mp_size_t() ); - case 8: return std::forward(f)( mp_size_t() ); - case 9: return std::forward(f)( mp_size_t() ); - case 10: return std::forward(f)( mp_size_t() ); - case 11: return std::forward(f)( mp_size_t() ); - case 12: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); - } - } -}; - -template<> struct mp_with_index_impl_<15> -{ - template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) - { - switch( i ) - { - case 0: return std::forward(f)( mp_size_t() ); - case 1: return std::forward(f)( mp_size_t() ); - case 2: return std::forward(f)( mp_size_t() ); - case 3: return std::forward(f)( mp_size_t() ); - case 4: return std::forward(f)( mp_size_t() ); - case 5: return std::forward(f)( mp_size_t() ); - case 6: return std::forward(f)( mp_size_t() ); - case 7: return std::forward(f)( mp_size_t() ); - case 8: return std::forward(f)( mp_size_t() ); - case 9: return std::forward(f)( mp_size_t() ); - case 10: return std::forward(f)( mp_size_t() ); - case 11: return std::forward(f)( mp_size_t() ); - case 12: return std::forward(f)( mp_size_t() ); - case 13: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); - } - } -}; - -template<> struct mp_with_index_impl_<16> -{ - template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) - { - switch( i ) - { - case 0: return std::forward(f)( mp_size_t() ); - case 1: return std::forward(f)( mp_size_t() ); - case 2: return std::forward(f)( mp_size_t() ); - case 3: return std::forward(f)( mp_size_t() ); - case 4: return std::forward(f)( mp_size_t() ); - case 5: return std::forward(f)( mp_size_t() ); - case 6: return std::forward(f)( mp_size_t() ); - case 7: return std::forward(f)( mp_size_t() ); - case 8: return std::forward(f)( mp_size_t() ); - case 9: return std::forward(f)( mp_size_t() ); - case 10: return std::forward(f)( mp_size_t() ); - case 11: return std::forward(f)( mp_size_t() ); - case 12: return std::forward(f)( mp_size_t() ); - case 13: return std::forward(f)( mp_size_t() ); - case 14: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); - } - } -}; - -} // namespace detail - -template inline BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) mp_with_index( std::size_t i, F && f ) -{ - assert( i < N ); - return detail::mp_with_index_impl_::template call<0>( i, std::forward(f) ); -} - -template inline BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) mp_with_index( std::size_t i, F && f ) -{ - return mp_with_index( i, std::forward(f) ); -} - -#undef BOOST_MP11_CONSTEXPR14 - -} // namespace mp11 -} // namespace boost - -#endif // #ifndef BOOST_MP11_DETAIL_MP_WITH_INDEX_HPP_INCLUDED -#ifndef BOOST_MP11_INTEGER_SEQUENCE_HPP_INCLUDED -#define BOOST_MP11_INTEGER_SEQUENCE_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 - -namespace boost -{ -namespace mp11 -{ - -// integer_sequence -template struct integer_sequence -{ -}; - -// detail::make_integer_sequence_impl -namespace detail -{ - -// iseq_if_c -template struct iseq_if_c_impl; - -template struct iseq_if_c_impl -{ - using type = T; -}; - -template struct iseq_if_c_impl -{ - using type = E; -}; - -template using iseq_if_c = typename iseq_if_c_impl::type; - -// iseq_identity -template struct iseq_identity -{ - using type = T; -}; - -template struct append_integer_sequence; - -template struct append_integer_sequence, integer_sequence> -{ - using type = integer_sequence< T, I..., ( J + sizeof...(I) )... >; -}; - -template struct make_integer_sequence_impl; - -template struct make_integer_sequence_impl_ -{ -private: - - static_assert( N >= 0, "make_integer_sequence: N must not be negative" ); - - static T const M = N / 2; - static T const R = N % 2; - - using S1 = typename make_integer_sequence_impl::type; - using S2 = typename append_integer_sequence::type; - using S3 = typename make_integer_sequence_impl::type; - using S4 = typename append_integer_sequence::type; - -public: - - using type = S4; -}; - -template struct make_integer_sequence_impl: iseq_if_c>, iseq_if_c>, make_integer_sequence_impl_>> -{ -}; - -} // namespace detail - -// make_integer_sequence -template using make_integer_sequence = typename detail::make_integer_sequence_impl::type; - -// index_sequence -template using index_sequence = integer_sequence; - -// make_index_sequence -template using make_index_sequence = make_integer_sequence; - -// index_sequence_for -template using index_sequence_for = make_integer_sequence; - -} // namespace mp11 -} // namespace boost - -#endif // #ifndef BOOST_MP11_INTEGER_SEQUENCE_HPP_INCLUDED -#include -#include -#include -#include - -namespace boost -{ -namespace mp11 -{ - -// mp_assign -namespace detail -{ - -template struct mp_assign_impl; - -template class L1, class... T, template class L2, class... U> struct mp_assign_impl, L2> -{ - using type = L1; -}; - -} // namespace detail - -template using mp_assign = typename detail::mp_assign_impl::type; - -// mp_clear -template using mp_clear = mp_assign>; - -// 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; - -// mp_transform -namespace detail -{ - -template class F, class... L> struct mp_transform_impl -{ -}; - -template class F, template class L, class... T> struct mp_transform_impl> -{ -#if BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) - - template struct f { using type = F; }; - - using type = L::type...>; - -#else - - using type = L...>; - -#endif -}; - -template class F, template class L1, class... T1, template class L2, class... T2> struct mp_transform_impl, L2> -{ -#if BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) - - template struct f { using type = F; }; - - using type = L1::type...>; - -#else - - using type = L1...>; - -#endif -}; - -template class F, template class L1, class... T1, template class L2, class... T2, template class L3, class... T3> struct mp_transform_impl, L2, L3> -{ -#if BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) - - template struct f { using type = F; }; - - using type = L1::type...>; - -#else - - using type = L1...>; - -#endif -}; - -#if BOOST_WORKAROUND( BOOST_MSVC, == 1900 ) || BOOST_WORKAROUND( BOOST_GCC, < 40800 ) - -template using mp_same_size_1 = mp_same...>; -template struct mp_same_size_2: mp_defer {}; - -#endif - -} // namespace detail - -#if BOOST_WORKAROUND( BOOST_MSVC, == 1900 ) || BOOST_WORKAROUND( BOOST_GCC, < 40800 ) - -template class F, class... L> using mp_transform = typename mp_if::type, detail::mp_transform_impl>::type; - -#else - -template class F, class... L> using mp_transform = typename mp_if...>, detail::mp_transform_impl>::type; - -#endif - -template using mp_transform_q = mp_transform; - -namespace detail -{ - -template class F, template class L1, class... T1, template class L2, class... T2, template class L3, class... T3, template class L4, class... T4, class... L> struct mp_transform_impl, L2, L3, L4, L...> -{ - using A1 = L1...>; - - template using _f = mp_transform; - - using A2 = mp_fold, A1, _f>; - - template using _g = mp_apply; - - using type = mp_transform<_g, A2>; -}; - -} // namespace detail - -// mp_transform_if -namespace detail -{ - -template class P, template class F, class... L> struct mp_transform_if_impl -{ - // the stupid quote-unquote dance avoids "pack expansion used as argument for non-pack parameter of alias template" - - using Qp = mp_quote

; - using Qf = mp_quote; - -#if BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) - - template struct _f_ { using type = mp_eval_if_q>, mp_first>, Qf, U...>; }; - template using _f = typename _f_::type; - -#else - - template using _f = mp_eval_if_q>, mp_first>, Qf, U...>; - -#endif - - using type = mp_transform<_f, L...>; -}; - -} // namespace detail - -template class P, template class F, class... L> using mp_transform_if = typename detail::mp_transform_if_impl::type; -template using mp_transform_if_q = typename detail::mp_transform_if_impl::type; - -// mp_fill -namespace detail -{ - -template struct mp_fill_impl; - -template class L, class... T, class V> struct mp_fill_impl, V> -{ -#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1900 ) - - template struct _f { using type = V; }; - using type = L::type...>; - -#else - - template using _f = V; - using type = L<_f...>; - -#endif -}; - -} // namespace detail - -template using mp_fill = typename detail::mp_fill_impl::type; - -// mp_contains -template using mp_contains = mp_to_bool>; - -// mp_repeat(_c) -namespace detail -{ - -template struct mp_repeat_c_impl -{ - using _l1 = typename mp_repeat_c_impl::type; - using _l2 = typename mp_repeat_c_impl::type; - - using type = mp_append<_l1, _l1, _l2>; -}; - -template struct mp_repeat_c_impl -{ - using type = mp_clear; -}; - -template struct mp_repeat_c_impl -{ - using type = L; -}; - -} // namespace detail - -template using mp_repeat_c = typename detail::mp_repeat_c_impl::type; -template using mp_repeat = typename detail::mp_repeat_c_impl::type; - -// mp_product -namespace detail -{ - -template class F, class P, class... L> struct mp_product_impl_2; - -template class F, class P> struct mp_product_impl_2 -{ - using type = mp_list>; -}; - -template class F, class P, template class L1, class... T1, class... L> struct mp_product_impl_2, L...> -{ - using type = mp_append, L...>::type...>; -}; - -template class F, class... L> struct mp_product_impl; - -template class F, class L1, class... L> struct mp_product_impl -{ - using type = mp_assign, L1, L...>::type>; -}; - -} // namespace detail - -template class F, class... L> using mp_product = typename detail::mp_product_impl::type; -template using mp_product_q = typename detail::mp_product_impl::type; - -// mp_drop(_c) -namespace detail -{ - -template struct mp_drop_impl; - -template class L, class... T, template class L2, class... U> struct mp_drop_impl, L2> -{ - template static mp_identity> f( U*..., mp_identity*... ); - - using R = decltype( f( (mp_identity*)0 ... ) ); - - using type = typename R::type; -}; - -} // namespace detail - -template using mp_drop_c = typename detail::mp_drop_impl, N>>::type; - -template using mp_drop = typename detail::mp_drop_impl, N>>::type; - -// mp_iota(_c) -namespace detail -{ - -template struct mp_from_sequence_impl; - -template class S, class U, U... J> struct mp_from_sequence_impl> -{ - using type = mp_list...>; -}; - -template using mp_from_sequence = typename mp_from_sequence_impl::type; - -} // namespace detail - -template using mp_iota_c = detail::mp_from_sequence>; -template using mp_iota = detail::mp_from_sequence::type, N::value>>; - -// mp_at(_c) -namespace detail -{ - -template struct mp_at_c_impl; - -#if defined(BOOST_MP11_HAS_TYPE_PACK_ELEMENT) - -template class L, class... T, std::size_t I> struct mp_at_c_impl, I> -{ - using type = __type_pack_element; -}; - -#else - -template struct mp_at_c_impl -{ - using _map = mp_transform>, L>; - using type = mp_second>>; -}; - -#endif - -} // namespace detail - -template using mp_at_c = typename mp_if_c<(I < mp_size::value), detail::mp_at_c_impl, void>::type; -template using mp_at = mp_at_c; - -// mp_take(_c) -namespace detail -{ - -template struct mp_take_c_impl; - -template class L, class... T> struct mp_take_c_impl, 0> -{ - using type = L<>; -}; - -template class L, class T1, class... T> struct mp_take_c_impl, 1> -{ - using type = L; -}; - -template class L, class T1, class T2, class... T> struct mp_take_c_impl, 2> -{ - using type = L; -}; - -template class L, class T1, class T2, class T3, class... T> struct mp_take_c_impl, 3> -{ - using type = L; -}; - -template class L, class T1, class T2, class T3, class T4, class... T> struct mp_take_c_impl, 4> -{ - using type = L; -}; - -template class L, class T1, class T2, class T3, class T4, class T5, class... T, std::size_t N> struct mp_take_c_impl, N, typename std::enable_if= 5>::type> -{ - using type = mp_append, typename mp_take_c_impl, N-5>::type>; -}; - -} // namespace detail - -template using mp_take_c = typename detail::mp_take_c_impl::type; -template using mp_take = typename detail::mp_take_c_impl::type; - -// mp_replace -namespace detail -{ - -template struct mp_replace_impl; - -template class L, class... T, class V, class W> struct mp_replace_impl, V, W> -{ -#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1800 ) - template struct _f { using type = mp_if, W, A>; }; - using type = L::type...>; -#else - template using _f = mp_if, W, A>; - using type = L<_f...>; -#endif -}; - -} // namespace detail - -template using mp_replace = typename detail::mp_replace_impl::type; - -// mp_replace_if -namespace detail -{ - -template class P, class W> struct mp_replace_if_impl; - -template class L, class... T, template class P, class W> struct mp_replace_if_impl, P, W> -{ - template using _f = mp_if, W, U>; - using type = L<_f...>; -}; - -} // namespace detail - -template class P, class W> using mp_replace_if = typename detail::mp_replace_if_impl::type; - -// mp_copy_if -namespace detail -{ - -template class P> struct mp_copy_if_impl; - -template class L, class... T, template class P> struct mp_copy_if_impl, P> -{ -#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) - template struct _f { using type = mp_if, mp_list, mp_list<>>; }; - using type = mp_append, typename _f::type...>; -#else - template using _f = mp_if, mp_list, mp_list<>>; - using type = mp_append, _f...>; -#endif -}; - -} // namespace detail - -template class P> using mp_copy_if = typename detail::mp_copy_if_impl::type; - -// mp_remove -namespace detail -{ - -template struct mp_remove_impl; - -template class L, class... T, class V> struct mp_remove_impl, V> -{ -#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) - template struct _f { using type = mp_if, mp_list<>, mp_list>; }; - using type = mp_append, typename _f::type...>; -#else - template using _f = mp_if, mp_list<>, mp_list>; - using type = mp_append, _f...>; -#endif -}; - -} // namespace detail - -template using mp_remove = typename detail::mp_remove_impl::type; - -// mp_remove_if -namespace detail -{ - -template class P> struct mp_remove_if_impl; - -template class L, class... T, template class P> struct mp_remove_if_impl, P> -{ -#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) - template struct _f { using type = mp_if, mp_list<>, mp_list>; }; - using type = mp_append, typename _f::type...>; -#else - template using _f = mp_if, mp_list<>, mp_list>; - using type = mp_append, _f...>; -#endif -}; - -} // namespace detail - -template class P> using mp_remove_if = typename detail::mp_remove_if_impl::type; - -// mp_partition -namespace detail -{ - -template class P> struct mp_partition_impl; - -template class L, class... T, template class P> struct mp_partition_impl, P> -{ - using type = L, P>, mp_remove_if, P>>; -}; - -} // namespace detail - -template class P> using mp_partition = typename detail::mp_partition_impl::type; - -// mp_sort -namespace detail -{ - -template class P> struct mp_sort_impl; - -#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1800 ) - -template class L, class... T, template class P> struct mp_sort_impl, P> -{ - static_assert( sizeof...(T) == 0, "T... must be empty" ); - using type = L<>; -}; - -#else - -template class L, template class P> struct mp_sort_impl, P> -{ - using type = L<>; -}; - -#endif - -template class L, class T1, template class P> struct mp_sort_impl, P> -{ - using type = L; -}; - -template class L, class T1, class... T, template class P> struct mp_sort_impl, P> -{ - template using F = P; - - using part = mp_partition, F>; - - using S1 = typename mp_sort_impl, P>::type; - using S2 = typename mp_sort_impl, P>::type; - - using type = mp_append, S2>; -}; - -} // namespace detail - -template class P> using mp_sort = typename detail::mp_sort_impl::type; - -// mp_find -namespace detail -{ - -template struct mp_find_impl; - -#if defined( BOOST_CLANG ) && defined( BOOST_MP11_HAS_FOLD_EXPRESSIONS ) - -struct mp_index_holder -{ - std::size_t i_; - bool f_; -}; - -constexpr inline mp_index_holder operator+( mp_index_holder const & v, bool f ) -{ - if( v.f_ ) - { - return v; - } - else if( f ) - { - return { v.i_, true }; - } - else - { - return { v.i_ + 1, false }; - } -} - -template class L, class... T, class V> struct mp_find_impl, V> -{ - static constexpr mp_index_holder _v{ 0, false }; - using type = mp_size_t< (_v + ... + std::is_same::value).i_ >; -}; - -#elif !defined( BOOST_MP11_NO_CONSTEXPR ) - -template class L, class V> struct mp_find_impl, V> -{ - using type = mp_size_t<0>; -}; - -constexpr std::size_t cx_find_index( bool const * first, bool const * last ) -{ - return first == last || *first? 0: 1 + cx_find_index( first + 1, last ); -} - -template class L, class... T, class V> struct mp_find_impl, V> -{ - static constexpr bool _v[] = { std::is_same::value... }; - using type = mp_size_t< cx_find_index( _v, _v + sizeof...(T) ) >; -}; - -#else - -#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1800 ) - -template class L, class... T, class V> struct mp_find_impl, V> -{ - static_assert( sizeof...(T) == 0, "T... must be empty" ); - using type = mp_size_t<0>; -}; - -#else - -template class L, class V> struct mp_find_impl, V> -{ - using type = mp_size_t<0>; -}; - -#endif - -template class L, class... T, class V> struct mp_find_impl, V> -{ - using type = mp_size_t<0>; -}; - -template class L, class T1, class... T, class V> struct mp_find_impl, V> -{ - using _r = typename mp_find_impl, V>::type; - using type = mp_size_t<1 + _r::value>; -}; - -#endif - -} // namespace detail - -template using mp_find = typename detail::mp_find_impl::type; - -// mp_find_if -namespace detail -{ - -template class P> struct mp_find_if_impl; - -#if defined( BOOST_CLANG ) && defined( BOOST_MP11_HAS_FOLD_EXPRESSIONS ) - -template class L, class... T, template class P> struct mp_find_if_impl, P> -{ - static constexpr mp_index_holder _v{ 0, false }; - using type = mp_size_t< (_v + ... + P::value).i_ >; -}; - -#elif !defined( BOOST_MP11_NO_CONSTEXPR ) - -template class L, template class P> struct mp_find_if_impl, P> -{ - using type = mp_size_t<0>; -}; - -template class L, class... T, template class P> struct mp_find_if_impl, P> -{ - static constexpr bool _v[] = { P::value... }; - using type = mp_size_t< cx_find_index( _v, _v + sizeof...(T) ) >; -}; - -#else - -#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1800 ) - -template class L, class... T, template class P> struct mp_find_if_impl, P> -{ - static_assert( sizeof...(T) == 0, "T... must be empty" ); - using type = mp_size_t<0>; -}; - -#else - -template class L, template class P> struct mp_find_if_impl, P> -{ - using type = mp_size_t<0>; -}; - -#endif - -template class P> struct mp_find_if_impl_2 -{ - using _r = typename mp_find_if_impl::type; - using type = mp_size_t<1 + _r::value>; -}; - -template class L, class T1, class... T, template class P> struct mp_find_if_impl, P> -{ - using type = typename mp_if, mp_identity>, mp_find_if_impl_2, P>>::type; -}; - -#endif - -} // namespace detail - -template class P> using mp_find_if = typename detail::mp_find_if_impl::type; - -// mp_reverse -namespace detail -{ - -template struct mp_reverse_impl; - -#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1800 ) - -template class L, class... T> struct mp_reverse_impl> -{ - static_assert( sizeof...(T) == 0, "T... must be empty" ); - using type = L<>; -}; - -#else - -template class L> struct mp_reverse_impl> -{ - using type = L<>; -}; - -#endif - -template class L, class T1> struct mp_reverse_impl> -{ - using type = L; -}; - -template class L, class T1, class T2> struct mp_reverse_impl> -{ - using type = L; -}; - -template class L, class T1, class T2, class T3> struct mp_reverse_impl> -{ - using type = L; -}; - -template class L, class T1, class T2, class T3, class T4> struct mp_reverse_impl> -{ - using type = L; -}; - -template class L, class T1, class T2, class T3, class T4, class T5> struct mp_reverse_impl> -{ - using type = L; -}; - -template class L, class T1, class T2, class T3, class T4, class T5, class T6> struct mp_reverse_impl> -{ - using type = L; -}; - -template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7> struct mp_reverse_impl> -{ - using type = L; -}; - -template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8> struct mp_reverse_impl> -{ - using type = L; -}; - -template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9> struct mp_reverse_impl> -{ - using type = L; -}; - -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> struct mp_reverse_impl> -{ - using type = mp_push_back>::type, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1>; -}; - -} // namespace detail - -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 - -// mp_reverse_fold -namespace detail -{ - -template class F> struct mp_reverse_fold_impl; - -#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1800 ) - -template class L, class... T, class V, template class F> struct mp_reverse_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_reverse_fold_impl, V, F> -{ - using type = V; -}; - -#endif - -template class L, class T1, class... T, class V, template class F> struct mp_reverse_fold_impl, V, F> -{ - using rest = typename mp_reverse_fold_impl, V, F>::type; - using type = F; -}; - -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_reverse_fold_impl, V, F> -{ - using rest = typename mp_reverse_fold_impl, V, F>::type; - using type = F>>>>>>>>>; -}; - -} // namespace detail - -template class F> using mp_reverse_fold = typename detail::mp_reverse_fold_impl::type; - -// mp_unique -namespace detail -{ - -template struct mp_unique_impl; - -template class L, class... T> struct mp_unique_impl> -{ - using type = mp_set_push_back, T...>; -}; - -} // namespace detail - -template using mp_unique = typename detail::mp_unique_impl::type; - -// mp_all_of -template class P> using mp_all_of = mp_bool< mp_count_if::value == mp_size::value >; - -// mp_none_of -template class P> using mp_none_of = mp_bool< mp_count_if::value == 0 >; - -// mp_any_of -template class P> using mp_any_of = mp_bool< mp_count_if::value != 0 >; - -// mp_replace_at_c -namespace detail -{ - -template struct mp_replace_at_impl -{ - static_assert( I::value >= 0, "mp_replace_at: I must not be negative" ); - - template using _p = std::is_same>; - template using _f = W; - - using type = mp_transform_if<_p, _f, L, mp_iota>>; -}; - -} // namespace detail - -template using mp_replace_at = typename detail::mp_replace_at_impl::type; -template using mp_replace_at_c = typename detail::mp_replace_at_impl, W>::type; - -//mp_for_each(f) -namespace detail -{ - -template BOOST_CONSTEXPR F mp_for_each_impl( mp_list, F && f ) -{ - using A = int[sizeof...(T)]; - return (void)A{ ((void)f(T()), 0)... }, std::forward(f); -} - -#if BOOST_WORKAROUND( BOOST_MSVC, <= 1800 ) - -template BOOST_CONSTEXPR F mp_for_each_impl( mp_list<>, F && f ) -{ - return std::forward(f); -} - -#endif - -} // namespace detail - -template BOOST_CONSTEXPR F mp_for_each( F && f ) -{ - return detail::mp_for_each_impl( mp_rename(), std::forward(f) ); -} - -// mp_insert -template using mp_insert = mp_append, mp_push_front, T...>>; - -// mp_insert_c -template using mp_insert_c = mp_append, mp_push_front, T...>>; - -// mp_erase -template using mp_erase = mp_append, mp_drop>; - -// mp_erase_c -template using mp_erase_c = mp_append, mp_drop_c>; - -} // namespace mp11 -} // namespace boost - -#endif // #ifndef BOOST_MP11_ALGORITHM_HPP_INCLUDED -#ifndef BOOST_MP11_MAP_HPP_INCLUDED -#define BOOST_MP11_MAP_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 - -namespace boost -{ -namespace mp11 -{ - -// mp_map_contains -template using mp_map_contains = mp_not, void>>; - -// mp_map_insert -template using mp_map_insert = mp_if< mp_map_contains>, M, mp_push_back >; - -// mp_map_replace -namespace detail -{ - -template struct mp_map_replace_impl; - -template class M, class... U, class T> struct mp_map_replace_impl, T> -{ - using K = mp_first; - - // mp_replace_if is inlined here using a struct _f because of msvc-14.0 - - template struct _f { using type = mp_if< std::is_same, K>, T, V >; }; - - using type = mp_if< mp_map_contains, K>, M::type...>, M >; -}; - -} // namespace detail - -template using mp_map_replace = typename detail::mp_map_replace_impl::type; - -// mp_map_update -namespace detail -{ - -template class F> struct mp_map_update_impl -{ - template using _f = std::is_same, mp_first>; - - // _f3> -> L> - template using _f3 = mp_assign, mp_rename>>; - - using type = mp_if< mp_map_contains>, mp_transform_if<_f, _f3, M>, mp_push_back >; -}; - -} // namespace detail - -template class F> using mp_map_update = typename detail::mp_map_update_impl::type; - -// mp_map_erase -namespace detail -{ - -template struct mp_map_erase_impl -{ - template using _f = std::is_same, K>; - using type = mp_remove_if; -}; - -} // namespace detail - -template using mp_map_erase = typename detail::mp_map_erase_impl::type; - -} // namespace mp11 -} // namespace boost - -#endif // #ifndef BOOST_MP11_MAP_HPP_INCLUDED -#ifndef BOOST_MP11_BIND_HPP_INCLUDED -#define BOOST_MP11_BIND_HPP_INCLUDED - -// Copyright 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 - -namespace boost -{ -namespace mp11 -{ - -// mp_arg -template struct mp_arg -{ - template using fn = mp_at_c, I>; -}; - -using _1 = mp_arg<0>; -using _2 = mp_arg<1>; -using _3 = mp_arg<2>; -using _4 = mp_arg<3>; -using _5 = mp_arg<4>; -using _6 = mp_arg<5>; -using _7 = mp_arg<6>; -using _8 = mp_arg<7>; -using _9 = mp_arg<8>; - -// mp_bind -template class F, class... T> struct mp_bind; - -namespace detail -{ - -template struct eval_bound_arg -{ - using type = V; -}; - -template struct eval_bound_arg, T...> -{ - using type = typename mp_arg::template fn; -}; - -template class F, class... U, class... T> struct eval_bound_arg, T...> -{ - using type = typename mp_bind::template fn; -}; - -} // namespace detail - -template class F, class... T> struct mp_bind -{ - template using fn = F::type...>; -}; - -template using mp_bind_q = mp_bind; - -// mp_bind_front -template class F, class... T> struct mp_bind_front -{ -#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1910 && BOOST_MSVC >= 1900 ) -#else -private: -#endif - - template struct _fn { using type = F; }; - -public: - - // the indirection through _fn works around the language inability - // to expand U... into a fixed parameter list of an alias template - - template using fn = typename _fn::type; -}; - -template using mp_bind_front_q = mp_bind_front; - -// mp_bind_back -template class F, class... T> struct mp_bind_back -{ -#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1910 && BOOST_MSVC >= 1900 ) -#else -private: -#endif - - template struct _fn { using type = F; }; - -public: - - template using fn = typename _fn::type; -}; - -template using mp_bind_back_q = mp_bind_back; - -} // namespace mp11 -} // namespace boost - -#endif // #ifndef BOOST_MP11_BIND_HPP_INCLUDED -#ifndef BOOST_MP11_TUPLE_HPP_INCLUDED -#define BOOST_MP11_TUPLE_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 -#include -#include - -namespace boost -{ -namespace mp11 -{ - -// tuple_apply -namespace detail -{ - -template BOOST_CONSTEXPR auto tuple_apply_impl( F && f, Tp && tp, integer_sequence ) - -> decltype( std::forward(f)( std::get(std::forward(tp))... ) ) -{ - return std::forward(f)( std::get(std::forward(tp))... ); -} - -} // namespace detail - -template::type>::value>> -BOOST_CONSTEXPR auto tuple_apply( F && f, Tp && tp ) - -> decltype( detail::tuple_apply_impl( std::forward(f), std::forward(tp), Seq() ) ) -{ - return detail::tuple_apply_impl( std::forward(f), std::forward(tp), Seq() ); -} - -// construct_from_tuple -namespace detail -{ - -template BOOST_CONSTEXPR T construct_from_tuple_impl( Tp && tp, integer_sequence ) -{ - return T( std::get(std::forward(tp))... ); -} - -} // namespace detail - -template::type>::value>> -BOOST_CONSTEXPR T construct_from_tuple( Tp && tp ) -{ - return detail::construct_from_tuple_impl( std::forward(tp), Seq() ); -} - -// tuple_for_each -namespace detail -{ - -template BOOST_CONSTEXPR F tuple_for_each_impl( Tp && tp, integer_sequence, F && f ) -{ - using A = int[sizeof...(J)]; - return (void)A{ ((void)f(std::get(std::forward(tp))), 0)... }, std::forward(f); -} - -#if BOOST_WORKAROUND( BOOST_MSVC, <= 1800 ) - -template BOOST_CONSTEXPR F tuple_for_each_impl( Tp && tp, integer_sequence, F && f ) -{ - return std::forward(f); -} - -#endif - -} // namespace detail - -template BOOST_CONSTEXPR F tuple_for_each( Tp && tp, F && f ) -{ - using seq = make_index_sequence::type>::value>; - return detail::tuple_for_each_impl( std::forward(tp), seq(), std::forward(f) ); -} - -} // namespace mp11 -} // namespace boost - -#endif // #ifndef BOOST_TUPLE_HPP_INCLUDED - -#endif // #ifndef BOOST_MP11_HPP_INCLUDED diff --git a/tools/single-header.bat b/tools/single-header.bat deleted file mode 100644 index 52edfac..0000000 --- a/tools/single-header.bat +++ /dev/null @@ -1 +0,0 @@ -python2.7 tools\single-header.py > include\boost\mp11_single.hpp \ No newline at end of file diff --git a/tools/single-header.py b/tools/single-header.py deleted file mode 100644 index 9982c41..0000000 --- a/tools/single-header.py +++ /dev/null @@ -1,54 +0,0 @@ - -# Copyright 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 - -import os.path -import re -import sys - -included = [] - -def scan_header( prefix, dir, fn ): - - path = os.path.join( prefix, dir, fn ) - - if path in included: - - return - - included.append( path ) - - with open( path, 'r' ) as header: - - for line in header: - - m = re.match( '[ \t]*#[ \t]*include[ \t]*(["<])([^">]*)[">]', line ) - - r = False - - if m: - - h = m.group( 2 ) - - hfn1 = os.path.join( prefix, h ) - hfn2 = os.path.join( prefix, dir, h ) - - if m.group( 1 ) == '"' and os.path.exists( hfn2 ): - - scan_header( prefix, os.path.join( dir, os.path.dirname( hfn2 ) ), os.path.basename( hfn2 ) ) - r = True - - elif os.path.exists( hfn1 ): - - scan_header( prefix, os.path.dirname( h ), os.path.basename( h ) ) - r = True - - if not r: - - sys.stdout.write( line ) - -scan_header( 'include', 'boost', 'mp11.hpp' )