test and doc update for .map()

This commit is contained in:
Andrzej Krzemienski
2018-06-23 20:53:16 +02:00
parent e47a017009
commit 51d1bc843d
7 changed files with 67 additions and 11 deletions

View File

@ -260,6 +260,8 @@ They are empty, trivially copyable classes with disabled default constructor.
template<class F> T& value_or_eval( F f ) const ; ``[link reference_optional_ref_value_or_eval __GO_TO__]`` template<class F> T& value_or_eval( F f ) const ; ``[link reference_optional_ref_value_or_eval __GO_TO__]``
template<class F> auto map( F f ) const -> ``['see below]``; ``[link reference_optional_ref_map __GO_TO__]``
T* get_ptr() const noexcept ; ``[link reference_optional_ref_get_ptr __GO_TO__]`` T* get_ptr() const noexcept ; ``[link reference_optional_ref_get_ptr __GO_TO__]``
bool has_value() const noexcept ; ``[link reference_optional_ref_operator_bool __GO_TO__]`` bool has_value() const noexcept ; ``[link reference_optional_ref_operator_bool __GO_TO__]``

View File

@ -687,20 +687,20 @@ __SPACE__
[#reference_optional_map] [#reference_optional_map]
[: `template<class F> auto optional<T>::map(F f) const& -> ``['see below]`` ;`] [: `template<class F> auto optional<T>::map(F f) const& -> `['see below]` ;`]
[: `template<class F> auto optional<T>::map(F f) & -> ``['see below]`` ;`] [: `template<class F> auto optional<T>::map(F f) & -> `['see below]` ;`]
* [*Effects:] `if (*this) return f(**this); else return none;` * [*Effects:] `if (*this) return f(**this); else return none;`
* [*Notes:] The return type of these overloads is `optional<decltype(f(**this)>`. On compilers that do not support ref-qualifiers on member functions, these two (as well as the next one) overloads are replaced with good old const and non-const overloads. * [*Notes:] The return type of these overloads is `optional<decltype(f(**this))>`. On compilers that do not support ref-qualifiers on member functions, these two (as well as the next one) overloads are replaced with good old const and non-const overloads.
__SPACE__ __SPACE__
[#reference_optional_map_move] [#reference_optional_map_move]
[: `template<class F> auto optional<T>::map(F f) && -> ``['see below]`` ;`] [: `template<class F> auto optional<T>::map(F f) && -> `['see below]` ;`]
* [*Effects:] `if (*this) return f(std::move(**this)); else return none;` * [*Effects:] `if (*this) return f(std::move(**this)); else return none;`
* [*Notes:] The return type of this overload is `optional<decltype(f(istd::move(**this))>`. * [*Notes:] The return type of this overload is `optional<decltype(f(istd::move(**this)))>`.
__SPACE__ __SPACE__
@ -1053,6 +1053,13 @@ __SPACE__
__SPACE__ __SPACE__
[#reference_optional_ref_map]
[: `template<class F> auto optional<T&>::map( F f ) const -> `['see below]`;`]
* [*Effects:] Equivalent to `if (*this) return f(**this); else return none;`.
* [*Remarks:] The return type of this function is `optional<decltype(f(**this))>`.
__SPACE__
[#reference_optional_ref_get_ptr] [#reference_optional_ref_get_ptr]
[: `T* optional<T&>::get_ptr () const noexcept;`] [: `T* optional<T&>::get_ptr () const noexcept;`]
* [*Returns:] `ref`. * [*Returns:] `ref`.

View File

@ -407,6 +407,21 @@
is ill-formed. is ill-formed.
</li> </li>
</ul></div> </ul></div>
<p>
<span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
</p>
<a name="reference_optional_ref_map"></a><div class="blockquote"><blockquote class="blockquote"><p>
<code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="keyword">auto</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="identifier">map</span><span class="special">(</span> <span class="identifier">F</span> <span class="identifier">f</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">-&gt;</span> </code><span class="emphasis"><em>see below</em></span><code class="computeroutput"><span class="special">;</span></code>
</p></blockquote></div>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
<span class="bold"><strong>Effects:</strong></span> Equivalent to <code class="computeroutput"><span class="keyword">if</span> <span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> <span class="keyword">return</span> <span class="identifier">f</span><span class="special">(**</span><span class="keyword">this</span><span class="special">);</span> <span class="keyword">else</span> <span class="keyword">return</span> <span class="identifier">none</span><span class="special">;</span></code>.
</li>
<li class="listitem">
<span class="bold"><strong>Remarks:</strong></span> The return type of this function
is <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">decltype</span><span class="special">(</span><span class="identifier">f</span><span class="special">(**</span><span class="keyword">this</span><span class="special">))&gt;</span></code>.
</li>
</ul></div>
<p> <p>
<span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span> <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
</p> </p>

View File

@ -1476,10 +1476,10 @@
</p> </p>
<a name="reference_optional_map"></a><div class="blockquote"><blockquote class="blockquote"><p> <a name="reference_optional_map"></a><div class="blockquote"><blockquote class="blockquote"><p>
<code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="keyword">auto</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">map</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">-&gt;</span> <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="keyword">auto</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">map</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">-&gt;</span>
</code><code class="computeroutput"><span class="special">[</span><span class="error">'</span><span class="identifier">see</span> <span class="identifier">below</span><span class="special">]</span></code><code class="computeroutput"> <span class="special">;</span></code> </code><span class="emphasis"><em>see below</em></span><code class="computeroutput"> <span class="special">;</span></code>
</p></blockquote></div> </p></blockquote></div>
<div class="blockquote"><blockquote class="blockquote"><p> <div class="blockquote"><blockquote class="blockquote"><p>
<code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="keyword">auto</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">map</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span> <span class="special">&amp;</span> <span class="special">-&gt;</span> </code><code class="computeroutput"><span class="special">[</span><span class="error">'</span><span class="identifier">see</span> <span class="identifier">below</span><span class="special">]</span></code><code class="computeroutput"> <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="keyword">auto</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">map</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span> <span class="special">&amp;</span> <span class="special">-&gt;</span> </code><span class="emphasis"><em>see below</em></span><code class="computeroutput">
<span class="special">;</span></code> <span class="special">;</span></code>
</p></blockquote></div> </p></blockquote></div>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
@ -1490,7 +1490,7 @@
</li> </li>
<li class="listitem"> <li class="listitem">
<span class="bold"><strong>Notes:</strong></span> The return type of these overloads <span class="bold"><strong>Notes:</strong></span> The return type of these overloads
is <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">decltype</span><span class="special">(</span><span class="identifier">f</span><span class="special">(**</span><span class="keyword">this</span><span class="special">)&gt;</span></code>. is <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">decltype</span><span class="special">(</span><span class="identifier">f</span><span class="special">(**</span><span class="keyword">this</span><span class="special">))&gt;</span></code>.
On compilers that do not support ref-qualifiers on member functions, On compilers that do not support ref-qualifiers on member functions,
these two (as well as the next one) overloads are replaced with good these two (as well as the next one) overloads are replaced with good
old const and non-const overloads. old const and non-const overloads.
@ -1501,7 +1501,7 @@
</p> </p>
<a name="reference_optional_map_move"></a><div class="blockquote"><blockquote class="blockquote"><p> <a name="reference_optional_map_move"></a><div class="blockquote"><blockquote class="blockquote"><p>
<code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="keyword">auto</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">map</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span> <span class="special">&amp;&amp;</span> <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="keyword">auto</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">map</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span> <span class="special">&amp;&amp;</span>
<span class="special">-&gt;</span> </code><code class="computeroutput"><span class="special">[</span><span class="error">'</span><span class="identifier">see</span> <span class="identifier">below</span><span class="special">]</span></code><code class="computeroutput"> <span class="special">-&gt;</span> </code><span class="emphasis"><em>see below</em></span><code class="computeroutput">
<span class="special">;</span></code> <span class="special">;</span></code>
</p></blockquote></div> </p></blockquote></div>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
@ -1512,7 +1512,7 @@
</li> </li>
<li class="listitem"> <li class="listitem">
<span class="bold"><strong>Notes:</strong></span> The return type of this overload <span class="bold"><strong>Notes:</strong></span> The return type of this overload
is <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">decltype</span><span class="special">(</span><span class="identifier">f</span><span class="special">(</span><span class="identifier">istd</span><span class="special">::</span><span class="identifier">move</span><span class="special">(**</span><span class="keyword">this</span><span class="special">))&gt;</span></code>. is <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">decltype</span><span class="special">(</span><span class="identifier">f</span><span class="special">(</span><span class="identifier">istd</span><span class="special">::</span><span class="identifier">move</span><span class="special">(**</span><span class="keyword">this</span><span class="special">)))&gt;</span></code>.
</li> </li>
</ul></div> </ul></div>
<p> <p>

View File

@ -73,6 +73,8 @@
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">value_or_eval</span><span class="special">(</span> <span class="identifier">F</span> <span class="identifier">f</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="detailed_semantics___optional_references.html#reference_optional_ref_value_or_eval"><span class="inlinemediaobject"><img src="../../../images/callouts/R.png" alt="R"></span></a> <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">value_or_eval</span><span class="special">(</span> <span class="identifier">F</span> <span class="identifier">f</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="detailed_semantics___optional_references.html#reference_optional_ref_value_or_eval"><span class="inlinemediaobject"><img src="../../../images/callouts/R.png" alt="R"></span></a>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="keyword">auto</span> <span class="identifier">map</span><span class="special">(</span> <span class="identifier">F</span> <span class="identifier">f</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">-&gt;</span> <span class="emphasis"><em>see below</em></span><span class="special">;</span> <a class="link" href="detailed_semantics___optional_references.html#reference_optional_ref_map"><span class="inlinemediaobject"><img src="../../../images/callouts/R.png" alt="R"></span></a>
<span class="identifier">T</span><span class="special">*</span> <span class="identifier">get_ptr</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="detailed_semantics___optional_references.html#reference_optional_ref_get_ptr"><span class="inlinemediaobject"><img src="../../../images/callouts/R.png" alt="R"></span></a> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">get_ptr</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="detailed_semantics___optional_references.html#reference_optional_ref_get_ptr"><span class="inlinemediaobject"><img src="../../../images/callouts/R.png" alt="R"></span></a>
<span class="keyword">bool</span> <span class="identifier">has_value</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="detailed_semantics___optional_references.html#reference_optional_ref_operator_bool"><span class="inlinemediaobject"><img src="../../../images/callouts/R.png" alt="R"></span></a> <span class="keyword">bool</span> <span class="identifier">has_value</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="detailed_semantics___optional_references.html#reference_optional_ref_operator_bool"><span class="inlinemediaobject"><img src="../../../images/callouts/R.png" alt="R"></span></a>

View File

@ -145,7 +145,7 @@
</div> </div>
</div> </div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"><p><small>Last revised: June 23, 2018 at 16:25:31 GMT</small></p></td> <td align="left"><p><small>Last revised: June 23, 2018 at 18:49:36 GMT</small></p></td>
<td align="right"><div class="copyright-footer"></div></td> <td align="right"><div class="copyright-footer"></div></td>
</tr></table> </tr></table>
<hr> <hr>

View File

@ -106,6 +106,34 @@ void test_map()
optional<Int> oI = oi.map(convert_t()); optional<Int> oI = oi.map(convert_t());
BOOST_TEST(bool(oI)); BOOST_TEST(bool(oI));
BOOST_TEST_EQ(1, oI->i); BOOST_TEST_EQ(1, oI->i);
optional<Int> o_ = optional<int>().map(convert_t());
BOOST_TEST(!o_);
}
optional<Int> make_opt_int(int i)
{
if (i != 0)
return Int(i);
else
return boost::none;
}
void test_map_optional()
{
optional<int> o9 (9), o0 (0), o_;
verify_type<optional<optional<Int>>>(o9.map(make_opt_int));
optional<optional<Int>> oo9 = o9.map(make_opt_int);
BOOST_TEST(bool(oo9));
BOOST_TEST(bool(*oo9));
BOOST_TEST_EQ(9, (**oo9).i);
optional<optional<Int>> oo0 = o0.map(make_opt_int);
BOOST_TEST(bool(oo0));
BOOST_TEST(!*oo0);
optional<optional<Int>> oo_ = o_.map(make_opt_int);
BOOST_TEST(!oo_);
} }
void test_map_with_lambda() void test_map_with_lambda()
@ -153,7 +181,9 @@ int main()
#endif #endif
test_map_with_lambda(); test_map_with_lambda();
test_map(); test_map();
test_map_optional();
test_map_to_ref(); test_map_to_ref();
test_map_optional();
test_map_optional_ref(); test_map_optional_ref();
return boost::report_errors(); return boost::report_errors();