forked from boostorg/mp11
Revert mp_or; add mp_void; update documentation
This commit is contained in:
@@ -166,6 +166,7 @@
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="mp11.html#mp11.reference.function">Helper Metafunctions, <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mp11</span><span class="special">/</span><span class="identifier">function</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="mp11.html#mp11.reference.function.mp_void_t"><code class="computeroutput"><span class="identifier">mp_void</span><span class="special"><</span><span class="identifier">T</span><span class="special">...></span></code></a></span></dt>
|
||||
<dt><span class="section"><a href="mp11.html#mp11.reference.function.mp_and_t"><code class="computeroutput"><span class="identifier">mp_and</span><span class="special"><</span><span class="identifier">T</span><span class="special">...></span></code></a></span></dt>
|
||||
<dt><span class="section"><a href="mp11.html#mp11.reference.function.mp_all_t"><code class="computeroutput"><span class="identifier">mp_all</span><span class="special"><</span><span class="identifier">T</span><span class="special">...></span></code></a></span></dt>
|
||||
<dt><span class="section"><a href="mp11.html#mp11.reference.function.mp_or_t"><code class="computeroutput"><span class="identifier">mp_or</span><span class="special"><</span><span class="identifier">T</span><span class="special">...></span></code></a></span></dt>
|
||||
@@ -2158,6 +2159,16 @@
|
||||
</h3></div></div></div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="mp11.reference.function.mp_void_t"></a><a class="link" href="mp11.html#mp11.reference.function.mp_void_t" title="mp_void<T...>"><code class="computeroutput"><span class="identifier">mp_void</span><span class="special"><</span><span class="identifier">T</span><span class="special">...></span></code></a>
|
||||
</h4></div></div></div>
|
||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">T</span><span class="special">></span> <span class="keyword">using</span> <span class="identifier">mp_void</span> <span class="special">=</span> <span class="keyword">void</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Same as <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">void_t</span></code> from C++17.
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="mp11.reference.function.mp_and_t"></a><a class="link" href="mp11.html#mp11.reference.function.mp_and_t" title="mp_and<T...>"><code class="computeroutput"><span class="identifier">mp_and</span><span class="special"><</span><span class="identifier">T</span><span class="special">...></span></code></a>
|
||||
</h4></div></div></div>
|
||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">T</span><span class="special">></span> <span class="keyword">using</span> <span class="identifier">mp_and</span> <span class="special">=</span> <span class="comment">/*...*/</span><span class="special">;</span>
|
||||
@@ -2168,12 +2179,17 @@
|
||||
if there exists a type <code class="computeroutput"><span class="identifier">U</span></code>
|
||||
in <code class="computeroutput"><span class="identifier">T</span><span class="special">...</span></code>
|
||||
for which <code class="computeroutput"><span class="identifier">mp_to_bool</span><span class="special"><</span><span class="identifier">U</span><span class="special">></span></code>
|
||||
is <code class="computeroutput"><span class="identifier">mp_false</span></code>. <code class="computeroutput"><span class="identifier">mp_to_bool</span><span class="special"><</span><span class="identifier">U</span><span class="special">></span></code>
|
||||
is not <code class="computeroutput"><span class="identifier">mp_true</span></code>. <code class="computeroutput"><span class="identifier">mp_to_bool</span><span class="special"><</span><span class="identifier">U</span><span class="special">></span></code>
|
||||
is not evaluated for types after <code class="computeroutput"><span class="identifier">U</span></code>.
|
||||
If no such type exists, <code class="computeroutput"><span class="identifier">mp_and</span><span class="special"><</span><span class="identifier">T</span><span class="special">...></span></code> is an alias for <code class="computeroutput"><span class="identifier">mp_true</span></code>.
|
||||
(<code class="computeroutput"><span class="identifier">mp_and</span><span class="special"><></span></code>
|
||||
is <code class="computeroutput"><span class="identifier">mp_true</span></code>.)
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">using</span> <span class="identifier">R1</span> <span class="special">=</span> <span class="identifier">mp_and</span><span class="special"><</span><span class="identifier">mp_true</span><span class="special">,</span> <span class="identifier">mp_true</span><span class="special">>;</span> <span class="comment">// mp_true</span>
|
||||
<span class="keyword">using</span> <span class="identifier">R2</span> <span class="special">=</span> <span class="identifier">mp_and</span><span class="special"><</span><span class="identifier">mp_false</span><span class="special">,</span> <span class="keyword">void</span><span class="special">>;</span> <span class="comment">// mp_false, void is not reached</span>
|
||||
<span class="keyword">using</span> <span class="identifier">R3</span> <span class="special">=</span> <span class="identifier">mp_and</span><span class="special"><</span><span class="identifier">mp_false</span><span class="special">,</span> <span class="identifier">mp_false</span><span class="special">>;</span> <span class="comment">// mp_false</span>
|
||||
<span class="keyword">using</span> <span class="identifier">R4</span> <span class="special">=</span> <span class="identifier">mp_and</span><span class="special"><</span><span class="keyword">void</span><span class="special">,</span> <span class="identifier">mp_true</span><span class="special">>;</span> <span class="comment">// mp_false (!)</span>
|
||||
</pre>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
@@ -2194,6 +2210,11 @@
|
||||
The upside is that <code class="computeroutput"><span class="identifier">mp_all</span></code>
|
||||
is faster on legacy compilers.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">using</span> <span class="identifier">R1</span> <span class="special">=</span> <span class="identifier">mp_and</span><span class="special"><</span><span class="identifier">mp_true</span><span class="special">,</span> <span class="identifier">mp_true</span><span class="special">>;</span> <span class="comment">// mp_true</span>
|
||||
<span class="keyword">using</span> <span class="identifier">R2</span> <span class="special">=</span> <span class="identifier">mp_and</span><span class="special"><</span><span class="identifier">mp_false</span><span class="special">,</span> <span class="keyword">void</span><span class="special">>;</span> <span class="comment">// compile-time error</span>
|
||||
<span class="keyword">using</span> <span class="identifier">R3</span> <span class="special">=</span> <span class="identifier">mp_and</span><span class="special"><</span><span class="identifier">mp_false</span><span class="special">,</span> <span class="identifier">mp_false</span><span class="special">>;</span> <span class="comment">// mp_false</span>
|
||||
<span class="keyword">using</span> <span class="identifier">R4</span> <span class="special">=</span> <span class="identifier">mp_and</span><span class="special"><</span><span class="keyword">void</span><span class="special">,</span> <span class="identifier">mp_true</span><span class="special">>;</span> <span class="comment">// compile-time error</span>
|
||||
</pre>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
@@ -2203,16 +2224,18 @@
|
||||
</pre>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">mp_or</span><span class="special"><</span><span class="identifier">T</span><span class="special">...></span></code>
|
||||
is an alias for <code class="computeroutput"><span class="identifier">mp_true</span></code>
|
||||
if there exists a type <code class="computeroutput"><span class="identifier">U</span></code>
|
||||
in <code class="computeroutput"><span class="identifier">T</span><span class="special">...</span></code>
|
||||
for which <code class="computeroutput"><span class="identifier">mp_to_bool</span><span class="special"><</span><span class="identifier">U</span><span class="special">></span></code>
|
||||
is <code class="computeroutput"><span class="identifier">mp_true</span></code>. <code class="computeroutput"><span class="identifier">mp_to_bool</span><span class="special"><</span><span class="identifier">U</span><span class="special">></span></code>
|
||||
is not evaluated for types after <code class="computeroutput"><span class="identifier">U</span></code>.
|
||||
If no such type exists, <code class="computeroutput"><span class="identifier">mp_or</span><span class="special"><</span><span class="identifier">T</span><span class="special">...></span></code> is an alias for <code class="computeroutput"><span class="identifier">mp_false</span></code>.
|
||||
(<code class="computeroutput"><span class="identifier">mp_or</span><span class="special"><></span></code>
|
||||
is <code class="computeroutput"><span class="identifier">mp_false</span></code>.)
|
||||
applies <code class="computeroutput"><span class="identifier">mp_to_bool</span></code> to the
|
||||
types in <code class="computeroutput"><span class="identifier">T</span><span class="special">...</span></code>,
|
||||
in order. If the result of an application is <code class="computeroutput"><span class="identifier">mp_true</span></code>,
|
||||
<code class="computeroutput"><span class="identifier">mp_or</span></code> returns <code class="computeroutput"><span class="identifier">mp_true</span></code>. If all results are <code class="computeroutput"><span class="identifier">mp_false</span></code>, returns <code class="computeroutput"><span class="identifier">mp_false</span></code>.
|
||||
<code class="computeroutput"><span class="identifier">mp_or</span><span class="special"><></span></code>
|
||||
is <code class="computeroutput"><span class="identifier">mp_false</span></code>.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">using</span> <span class="identifier">R1</span> <span class="special">=</span> <span class="identifier">mp_or</span><span class="special"><</span><span class="identifier">mp_true</span><span class="special">,</span> <span class="identifier">mp_false</span><span class="special">>;</span> <span class="comment">// mp_true</span>
|
||||
<span class="keyword">using</span> <span class="identifier">R2</span> <span class="special">=</span> <span class="identifier">mp_or</span><span class="special"><</span><span class="identifier">mp_true</span><span class="special">,</span> <span class="keyword">void</span><span class="special">>;</span> <span class="comment">// mp_true, void is not reached</span>
|
||||
<span class="keyword">using</span> <span class="identifier">R3</span> <span class="special">=</span> <span class="identifier">mp_or</span><span class="special"><</span><span class="identifier">mp_false</span><span class="special">,</span> <span class="identifier">mp_false</span><span class="special">>;</span> <span class="comment">// mp_false</span>
|
||||
<span class="keyword">using</span> <span class="identifier">R4</span> <span class="special">=</span> <span class="identifier">mp_or</span><span class="special"><</span><span class="keyword">void</span><span class="special">,</span> <span class="identifier">mp_true</span><span class="special">>;</span> <span class="comment">// compile-time error</span>
|
||||
</pre>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
@@ -2228,6 +2251,11 @@
|
||||
otherwise. Same as <code class="computeroutput"><span class="identifier">mp_or</span></code>,
|
||||
but does not perform short-circuit evaluation.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">using</span> <span class="identifier">R1</span> <span class="special">=</span> <span class="identifier">mp_any</span><span class="special"><</span><span class="identifier">mp_true</span><span class="special">,</span> <span class="identifier">mp_false</span><span class="special">>;</span> <span class="comment">// mp_true</span>
|
||||
<span class="keyword">using</span> <span class="identifier">R2</span> <span class="special">=</span> <span class="identifier">mp_any</span><span class="special"><</span><span class="identifier">mp_true</span><span class="special">,</span> <span class="keyword">void</span><span class="special">>;</span> <span class="comment">// compile-time error</span>
|
||||
<span class="keyword">using</span> <span class="identifier">R3</span> <span class="special">=</span> <span class="identifier">mp_any</span><span class="special"><</span><span class="identifier">mp_false</span><span class="special">,</span> <span class="identifier">mp_false</span><span class="special">>;</span> <span class="comment">// mp_false</span>
|
||||
<span class="keyword">using</span> <span class="identifier">R4</span> <span class="special">=</span> <span class="identifier">mp_any</span><span class="special"><</span><span class="keyword">void</span><span class="special">,</span> <span class="identifier">mp_true</span><span class="special">>;</span> <span class="comment">// compile-time error</span>
|
||||
</pre>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
@@ -2450,7 +2478,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||
<td align="left"><p><small>Last revised: May 23, 2017 at 20:23:39 GMT</small></p></td>
|
||||
<td align="left"><p><small>Last revised: May 23, 2017 at 22:20:27 GMT</small></p></td>
|
||||
<td align="right"><div class="copyright-footer"></div></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
|
@@ -8,12 +8,23 @@
|
||||
|
||||
[section:function Helper Metafunctions, `<boost/mp11/function.hpp>`]
|
||||
|
||||
[section `mp_void<T...>`]
|
||||
template<class... T> using mp_void = void;
|
||||
|
||||
Same as `std::void_t` from C++17.
|
||||
[endsect]
|
||||
|
||||
[section `mp_and<T...>`]
|
||||
template<class... T> using mp_and = /*...*/;
|
||||
|
||||
`mp_and<T...>` is an alias for `mp_false` if there exists a type `U` in `T...` for which `mp_to_bool<U>` is `mp_false`.
|
||||
`mp_and<T...>` is an alias for `mp_false` if there exists a type `U` in `T...` for which `mp_to_bool<U>` is not `mp_true`.
|
||||
`mp_to_bool<U>` is not evaluated for types after `U`. If no such type exists, `mp_and<T...>` is an alias for `mp_true`.
|
||||
(`mp_and<>` is `mp_true`.)
|
||||
|
||||
using R1 = mp_and<mp_true, mp_true>; // mp_true
|
||||
using R2 = mp_and<mp_false, void>; // mp_false, void is not reached
|
||||
using R3 = mp_and<mp_false, mp_false>; // mp_false
|
||||
using R4 = mp_and<void, mp_true>; // mp_false (!)
|
||||
[endsect]
|
||||
|
||||
[section `mp_all<T...>`]
|
||||
@@ -22,14 +33,23 @@
|
||||
`mp_all<T...>` is `mp_true` if `mp_to_bool<U>` is `mp_true` for all types `U` in `T...`, `mp_false` otherwise. Same as
|
||||
`mp_and`, but does not perform short-circuit evaluation. `mp_and<mp_false, void>` is `mp_false`, but `mp_all<mp_false, void>`
|
||||
is an error because `void` does not have a nested `value`. The upside is that `mp_all` is faster on legacy compilers.
|
||||
|
||||
using R1 = mp_and<mp_true, mp_true>; // mp_true
|
||||
using R2 = mp_and<mp_false, void>; // compile-time error
|
||||
using R3 = mp_and<mp_false, mp_false>; // mp_false
|
||||
using R4 = mp_and<void, mp_true>; // compile-time error
|
||||
[endsect]
|
||||
|
||||
[section `mp_or<T...>`]
|
||||
template<class... T> using mp_or = /*...*/;
|
||||
|
||||
`mp_or<T...>` is an alias for `mp_true` if there exists a type `U` in `T...` for which `mp_to_bool<U>` is `mp_true`.
|
||||
`mp_to_bool<U>` is not evaluated for types after `U`. If no such type exists, `mp_or<T...>` is an alias for `mp_false`.
|
||||
(`mp_or<>` is `mp_false`.)
|
||||
`mp_or<T...>` applies `mp_to_bool` to the types in `T...`, in order. If the result of an application is `mp_true`, `mp_or`
|
||||
returns `mp_true`. If all results are `mp_false`, returns `mp_false`. `mp_or<>` is `mp_false`.
|
||||
|
||||
using R1 = mp_or<mp_true, mp_false>; // mp_true
|
||||
using R2 = mp_or<mp_true, void>; // mp_true, void is not reached
|
||||
using R3 = mp_or<mp_false, mp_false>; // mp_false
|
||||
using R4 = mp_or<void, mp_true>; // compile-time error
|
||||
[endsect]
|
||||
|
||||
[section `mp_any<T...>`]
|
||||
@@ -37,6 +57,11 @@ is an error because `void` does not have a nested `value`. The upside is that `m
|
||||
|
||||
`mp_any<T...>` is `mp_true` if `mp_to_bool<U>` is `mp_true` for any type `U` in `T...`, `mp_false` otherwise. Same as
|
||||
`mp_or`, but does not perform short-circuit evaluation.
|
||||
|
||||
using R1 = mp_any<mp_true, mp_false>; // mp_true
|
||||
using R2 = mp_any<mp_true, void>; // compile-time error
|
||||
using R3 = mp_any<mp_false, mp_false>; // mp_false
|
||||
using R4 = mp_any<void, mp_true>; // compile-time error
|
||||
[endsect]
|
||||
|
||||
[section `mp_same<T...>`]
|
||||
|
@@ -19,9 +19,22 @@ namespace boost
|
||||
namespace mp11
|
||||
{
|
||||
|
||||
// mp_void<T...>
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template<class... T> struct mp_void_impl
|
||||
{
|
||||
using type = void;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template<class... T> using mp_void = typename detail::mp_void_impl<T...>::type;
|
||||
|
||||
// mp_and<T...>, mp_all<T...>
|
||||
|
||||
#if BOOST_WORKAROUND( BOOST_MSVC, < 1900 )
|
||||
#if BOOST_WORKAROUND( BOOST_MSVC, < 1910 )
|
||||
|
||||
namespace detail
|
||||
{
|
||||
@@ -64,9 +77,7 @@ template<class L, class E = void> struct mp_and_impl
|
||||
using type = mp_false;
|
||||
};
|
||||
|
||||
void mp_and_impl_f(...);
|
||||
|
||||
template<class... T> struct mp_and_impl< mp_list<T...>, decltype( mp_and_impl_f( mp_if<T, int>()... ) ) >
|
||||
template<class... T> struct mp_and_impl< mp_list<T...>, mp_void<mp_if<T, void>...> >
|
||||
{
|
||||
using type = mp_true;
|
||||
};
|
||||
@@ -78,10 +89,7 @@ template<class... T> using mp_all = typename detail::mp_and_impl<mp_list<T...>>:
|
||||
|
||||
#endif
|
||||
|
||||
// mp_or<T...>, mp_any<T...>
|
||||
|
||||
#if BOOST_WORKAROUND( BOOST_MSVC, < 1900 )
|
||||
|
||||
// mp_or<T...>
|
||||
namespace detail
|
||||
{
|
||||
|
||||
@@ -111,32 +119,9 @@ template<class T1, class... T> struct mp_or_impl<T1, T...>
|
||||
|
||||
} // namespace detail
|
||||
|
||||
// mp_any<T...>
|
||||
template<class... T> using mp_any = mp_bool< mp_count_if< mp_list<T...>, mp_to_bool >::value != 0 >;
|
||||
|
||||
#else
|
||||
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template<class L, class E = void> struct mp_or_impl
|
||||
{
|
||||
using type = mp_true;
|
||||
};
|
||||
|
||||
void mp_and_impl_f(...);
|
||||
|
||||
template<class... T> struct mp_or_impl< mp_list<T...>, decltype( mp_and_impl_f( mp_if<mp_not<T>, int>()... ) ) >
|
||||
{
|
||||
using type = mp_false;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template<class... T> using mp_or = typename detail::mp_or_impl<mp_list<T...>>::type;
|
||||
template<class... T> using mp_any = typename detail::mp_or_impl<mp_list<T...>>::type;
|
||||
|
||||
#endif
|
||||
|
||||
// mp_same<T...>
|
||||
namespace detail
|
||||
{
|
||||
|
Reference in New Issue
Block a user