diff options
Diffstat (limited to 'boost/mp11/utility.hpp')
-rw-r--r-- | boost/mp11/utility.hpp | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/boost/mp11/utility.hpp b/boost/mp11/utility.hpp index e19ec8e77b..38989f40bf 100644 --- a/boost/mp11/utility.hpp +++ b/boost/mp11/utility.hpp @@ -1,12 +1,12 @@ #ifndef BOOST_MP11_UTILITY_HPP_INCLUDED #define BOOST_MP11_UTILITY_HPP_INCLUDED -// Copyright 2015, 2017 Peter Dimov. +// Copyright 2015, 2017, 2019 Peter Dimov. // -// Distributed under the Boost Software License, Version 1.0. +// 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 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt #include <boost/mp11/integral.hpp> #include <boost/mp11/detail/config.hpp> @@ -92,6 +92,8 @@ template<template<class...> class F, class... T> using mp_valid = typename detai #endif +template<class Q, class... T> using mp_valid_q = mp_valid<Q::template fn, T...>; + // mp_defer namespace detail { @@ -147,6 +149,14 @@ template<bool C, class T, template<class...> class F, class... U> using mp_eval_ template<class C, class T, template<class...> class F, class... U> using mp_eval_if = typename detail::mp_eval_if_c_impl<static_cast<bool>(C::value), T, F, U...>::type; template<class C, class T, class Q, class... U> using mp_eval_if_q = typename detail::mp_eval_if_c_impl<static_cast<bool>(C::value), T, Q::template fn, U...>::type; +// mp_eval_if_not +template<class C, class T, template<class...> class F, class... U> using mp_eval_if_not = mp_eval_if<mp_not<C>, T, F, U...>; +template<class C, class T, class Q, class... U> using mp_eval_if_not_q = mp_eval_if<mp_not<C>, T, Q::template fn, U...>; + +// mp_eval_or +template<class T, template<class...> class F, class... U> using mp_eval_or = mp_eval_if_not<mp_valid<F, U...>, T, F, U...>; +template<class T, class Q, class... U> using mp_eval_or_q = mp_eval_or<T, Q::template fn, U...>; + // mp_cond // so elegant; so doesn't work @@ -187,28 +197,39 @@ template<template<class...> class F> struct mp_quote_trait template<class... T> using fn = typename F<T...>::type; }; -// mp_invoke +// mp_invoke_q #if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) namespace detail { -template<class Q, class... T> struct mp_invoke_impl: mp_defer<Q::template fn, T...> {}; +template<class Q, class... T> struct mp_invoke_q_impl: mp_defer<Q::template fn, T...> {}; } // namespace detail -template<class Q, class... T> using mp_invoke = typename detail::mp_invoke_impl<Q, T...>::type; +template<class Q, class... T> using mp_invoke_q = typename detail::mp_invoke_q_impl<Q, T...>::type; #elif BOOST_MP11_WORKAROUND( BOOST_MP11_GCC, < 50000 ) -template<class Q, class... T> using mp_invoke = typename mp_defer<Q::template fn, T...>::type; +template<class Q, class... T> using mp_invoke_q = typename mp_defer<Q::template fn, T...>::type; #else -template<class Q, class... T> using mp_invoke = typename Q::template fn<T...>; +template<class Q, class... T> using mp_invoke_q = typename Q::template fn<T...>; #endif +// old name for mp_invoke_q retained for compatibility, but deprecated +template<class Q, class... T> using mp_invoke BOOST_MP11_DEPRECATED("please use mp_invoke_q") = mp_invoke_q<Q, T...>; + +// mp_not_fn<P> +template<template<class...> class P> struct mp_not_fn +{ + template<class... T> using fn = mp_not< mp_invoke_q<mp_quote<P>, T...> >; +}; + +template<class Q> using mp_not_fn_q = mp_not_fn<Q::template fn>; + } // namespace mp11 } // namespace boost |