summaryrefslogtreecommitdiff
path: root/boost/mp11/utility.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/mp11/utility.hpp')
-rw-r--r--boost/mp11/utility.hpp39
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