diff options
Diffstat (limited to 'libs/optional/doc/html/boost_optional/tutorial')
13 files changed, 333 insertions, 23 deletions
diff --git a/libs/optional/doc/html/boost_optional/tutorial/a_note_about_optional_bool_.html b/libs/optional/doc/html/boost_optional/tutorial/a_note_about_optional_bool_.html index ea3618b87..def5bbfd2 100644 --- a/libs/optional/doc/html/boost_optional/tutorial/a_note_about_optional_bool_.html +++ b/libs/optional/doc/html/boost_optional/tutorial/a_note_about_optional_bool_.html @@ -94,7 +94,7 @@ </div> <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> <td align="left"></td> -<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014 Andrzej Krzemieński<p> +<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014, 2015 Andrzej Krzemieński<p> Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) </p> diff --git a/libs/optional/doc/html/boost_optional/tutorial/design_overview.html b/libs/optional/doc/html/boost_optional/tutorial/design_overview.html index d6598bca6..cc5e3b467 100644 --- a/libs/optional/doc/html/boost_optional/tutorial/design_overview.html +++ b/libs/optional/doc/html/boost_optional/tutorial/design_overview.html @@ -170,7 +170,7 @@ </div> <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> <td align="left"></td> -<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014 Andrzej Krzemieński<p> +<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014, 2015 Andrzej Krzemieński<p> Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) </p> diff --git a/libs/optional/doc/html/boost_optional/tutorial/design_overview/the_interface.html b/libs/optional/doc/html/boost_optional/tutorial/design_overview/the_interface.html index 984ae4bf1..c3833ffb8 100644 --- a/libs/optional/doc/html/boost_optional/tutorial/design_overview/the_interface.html +++ b/libs/optional/doc/html/boost_optional/tutorial/design_overview/the_interface.html @@ -63,8 +63,8 @@ </p> <h6> <a name="boost_optional.tutorial.design_overview.the_interface.h0"></a> - <span class="phrase"><a name="boost_optional.tutorial.design_overview.the_interface.lexically_hinted_value_access_in_the_presence_of_possibly_untitialized_optional_objects__the_operators___and___gt_"></a></span><a class="link" href="the_interface.html#boost_optional.tutorial.design_overview.the_interface.lexically_hinted_value_access_in_the_presence_of_possibly_untitialized_optional_objects__the_operators___and___gt_">Lexically-hinted - Value Access in the presence of possibly untitialized optional objects: + <span class="phrase"><a name="boost_optional.tutorial.design_overview.the_interface.lexically_hinted_value_access_in_the_presence_of_possibly_uninitialized_optional_objects__the_operators___and___gt_"></a></span><a class="link" href="the_interface.html#boost_optional.tutorial.design_overview.the_interface.lexically_hinted_value_access_in_the_presence_of_possibly_uninitialized_optional_objects__the_operators___and___gt_">Lexically-hinted + Value Access in the presence of possibly uninitialized optional objects: The operators * and -></a> </h6> <p> @@ -173,7 +173,7 @@ </div> <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> <td align="left"></td> -<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014 Andrzej Krzemieński<p> +<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014, 2015 Andrzej Krzemieński<p> Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) </p> diff --git a/libs/optional/doc/html/boost_optional/tutorial/design_overview/the_semantics.html b/libs/optional/doc/html/boost_optional/tutorial/design_overview/the_semantics.html index 5dbc63b32..9a38fefe8 100644 --- a/libs/optional/doc/html/boost_optional/tutorial/design_overview/the_semantics.html +++ b/libs/optional/doc/html/boost_optional/tutorial/design_overview/the_semantics.html @@ -107,7 +107,7 @@ </div> <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> <td align="left"></td> -<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014 Andrzej Krzemieński<p> +<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014, 2015 Andrzej Krzemieński<p> Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) </p> diff --git a/libs/optional/doc/html/boost_optional/tutorial/exception_safety_guarantees.html b/libs/optional/doc/html/boost_optional/tutorial/exception_safety_guarantees.html index ea3fa8f5e..dfa34c85c 100644 --- a/libs/optional/doc/html/boost_optional/tutorial/exception_safety_guarantees.html +++ b/libs/optional/doc/html/boost_optional/tutorial/exception_safety_guarantees.html @@ -161,7 +161,7 @@ </div> <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> <td align="left"></td> -<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014 Andrzej Krzemieński<p> +<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014, 2015 Andrzej Krzemieński<p> Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) </p> diff --git a/libs/optional/doc/html/boost_optional/tutorial/in_place_factories.html b/libs/optional/doc/html/boost_optional/tutorial/in_place_factories.html index d6907b9e3..4cfef3256 100644 --- a/libs/optional/doc/html/boost_optional/tutorial/in_place_factories.html +++ b/libs/optional/doc/html/boost_optional/tutorial/in_place_factories.html @@ -183,7 +183,7 @@ </div> <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> <td align="left"></td> -<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014 Andrzej Krzemieński<p> +<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014, 2015 Andrzej Krzemieński<p> Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) </p> diff --git a/libs/optional/doc/html/boost_optional/tutorial/io_operators.html b/libs/optional/doc/html/boost_optional/tutorial/io_operators.html new file mode 100644 index 000000000..8443a4922 --- /dev/null +++ b/libs/optional/doc/html/boost_optional/tutorial/io_operators.html @@ -0,0 +1,87 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>IO operators</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.78.1"> +<link rel="home" href="../../index.html" title="Boost.Optional"> +<link rel="up" href="../../optional/tutorial.html" title="Tutorial"> +<link rel="prev" href="relational_operators.html" title="Relational operators"> +<link rel="next" href="optional_references.html" title="Optional references"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="relational_operators.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="optional_references.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="boost_optional.tutorial.io_operators"></a><a class="link" href="io_operators.html" title="IO operators">IO operators</a> +</h3></div></div></div> +<p> + It is possible to use <code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code> + with IO streams, provided that <code class="computeroutput"><span class="identifier">T</span></code> + can be used with streams. IOStream operators are defined in a separate header. + </p> +<p> +</p> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> +<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">optional</span><span class="special">/</span><span class="identifier">optional_io</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> + +<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> +<span class="special">{</span> + <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">o1</span> <span class="special">=</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">oN</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">none</span><span class="special">;</span> + <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">o1</span><span class="special">;</span> + <span class="identifier">std</span><span class="special">::</span><span class="identifier">cin</span> <span class="special">>></span> <span class="identifier">oN</span><span class="special">;</span> +<span class="special">}</span> +</pre> +<p> + </p> +<p> + The current implementation does not guarantee any particular output. What + it guarantees is that if streaming out and then back in <code class="computeroutput"><span class="identifier">T</span></code> + gives the same value, then streaming out and then back in <code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code> + will also give back the same result: + </p> +<p> +</p> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span> +<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">sstream</span><span class="special">></span> +<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">optional</span><span class="special">/</span><span class="identifier">optional_io</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> + +<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> +<span class="special">{</span> + <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">o1</span> <span class="special">=</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">oN</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">none</span><span class="special">;</span> + <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">x1</span><span class="special">,</span> <span class="identifier">x2</span><span class="special">;</span> + <span class="identifier">std</span><span class="special">::</span><span class="identifier">stringstream</span> <span class="identifier">s</span><span class="special">;</span> + <span class="identifier">s</span> <span class="special"><<</span> <span class="identifier">o1</span> <span class="special"><<</span> <span class="identifier">oN</span><span class="special">;</span> + <span class="identifier">s</span> <span class="special">>></span> <span class="identifier">x1</span> <span class="special">>></span> <span class="identifier">x2</span><span class="special">;</span> + <span class="identifier">assert</span> <span class="special">(</span><span class="identifier">o1</span> <span class="special">==</span> <span class="identifier">x1</span><span class="special">);</span> + <span class="identifier">assert</span> <span class="special">(</span><span class="identifier">oN</span> <span class="special">==</span> <span class="identifier">x2</span><span class="special">);</span> +<span class="special">}</span> +</pre> +<p> + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014, 2015 Andrzej Krzemieński<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="relational_operators.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="optional_references.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/optional/doc/html/boost_optional/tutorial/optional_references.html b/libs/optional/doc/html/boost_optional/tutorial/optional_references.html index 4e067c2d9..13209411f 100644 --- a/libs/optional/doc/html/boost_optional/tutorial/optional_references.html +++ b/libs/optional/doc/html/boost_optional/tutorial/optional_references.html @@ -6,7 +6,7 @@ <meta name="generator" content="DocBook XSL Stylesheets V1.78.1"> <link rel="home" href="../../index.html" title="Boost.Optional"> <link rel="up" href="../../optional/tutorial.html" title="Tutorial"> -<link rel="prev" href="relational_operators.html" title="Relational operators"> +<link rel="prev" href="io_operators.html" title="IO operators"> <link rel="next" href="rebinding_semantics_for_assignment_of_optional_references.html" title="Rebinding semantics for assignment of optional references"> </head> <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> @@ -20,7 +20,7 @@ </tr></table> <hr> <div class="spirit-nav"> -<a accesskey="p" href="relational_operators.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="rebinding_semantics_for_assignment_of_optional_references.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +<a accesskey="p" href="io_operators.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="rebinding_semantics_for_assignment_of_optional_references.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> </div> <div class="section"> <div class="titlepage"><div><div><h3 class="title"> @@ -101,7 +101,7 @@ </div> <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> <td align="left"></td> -<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014 Andrzej Krzemieński<p> +<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014, 2015 Andrzej Krzemieński<p> Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) </p> @@ -109,7 +109,7 @@ </tr></table> <hr> <div class="spirit-nav"> -<a accesskey="p" href="relational_operators.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="rebinding_semantics_for_assignment_of_optional_references.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +<a accesskey="p" href="io_operators.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="rebinding_semantics_for_assignment_of_optional_references.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> </div> </body> </html> diff --git a/libs/optional/doc/html/boost_optional/tutorial/performance_considerations.html b/libs/optional/doc/html/boost_optional/tutorial/performance_considerations.html new file mode 100644 index 000000000..2e2d4ca72 --- /dev/null +++ b/libs/optional/doc/html/boost_optional/tutorial/performance_considerations.html @@ -0,0 +1,223 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Performance considerations</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.78.1"> +<link rel="home" href="../../index.html" title="Boost.Optional"> +<link rel="up" href="../../optional/tutorial.html" title="Tutorial"> +<link rel="prev" href="type_requirements.html" title="Type requirements"> +<link rel="next" href="../../optional/reference.html" title="Reference"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="type_requirements.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="boost_optional.tutorial.performance_considerations"></a><a class="link" href="performance_considerations.html" title="Performance considerations">Performance + considerations</a> +</h3></div></div></div> +<p> + Technical details aside, the memory layout of <code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code> + is more-less this: + </p> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> +<span class="keyword">class</span> <span class="identifier">optional</span> +<span class="special">{</span> + <span class="keyword">bool</span> <span class="identifier">_initialized</span><span class="special">;</span> + <span class="identifier">std</span><span class="special">::</span><span class="identifier">aligned_storage_t</span><span class="special"><</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">t</span><span class="special">),</span> <span class="keyword">alignof</span><span class="special">(</span><span class="identifier">T</span><span class="special">)></span> <span class="identifier">_storage</span><span class="special">;</span> +<span class="special">};</span> +</pre> +<p> + But for the purpose of this analysis, considering memory layouts, we can + think of it as: + </p> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> +<span class="keyword">class</span> <span class="identifier">optional</span> +<span class="special">{</span> + <span class="keyword">bool</span> <span class="identifier">_initialized</span><span class="special">;</span> + <span class="identifier">T</span> <span class="identifier">_storage</span><span class="special">;</span> +<span class="special">};</span> +</pre> +<p> + Given type <code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span></code>, and + assuming that <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="special">==</span> + <span class="number">4</span></code>, we will get <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">optional</span><span class="special"><</span><span class="keyword">int</span><span class="special">>)</span> + <span class="special">==</span> <span class="number">8</span></code>. + This is so because of the alignment rules, for our two members we get the + following alignment: + </p> +<p> + <span class="inlinemediaobject"><img src="../../images/opt_align1.png" alt="opt_align1"></span> + </p> +<p> + This means you can fit twice as many <code class="computeroutput"><span class="keyword">int</span></code>s + as <code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span></code>s into + the same space of memory. Therefore, if the size of the objects is critical + for your application (e.g., because you want to utilize your CPU cache in + order to gain performance) and you have determined you are willing to trade + the code clarity, it is recommended that you simply go with type <code class="computeroutput"><span class="keyword">int</span></code> and use some 'magic value' to represent + <span class="emphasis"><em>not-an-int</em></span>. + </p> +<p> + Even if you cannot spare any value of <code class="computeroutput"><span class="keyword">int</span></code> + to represent <span class="emphasis"><em>not-an-int</em></span> (e.g., because every value is + useful, or you do want to signal <span class="emphasis"><em>not-an-int</em></span> explicitly), + at least for <code class="computeroutput"><span class="identifier">Trivial</span></code> types + you should consider storing the value and the <code class="computeroutput"><span class="keyword">bool</span></code> + flag representing the <span class="emphasis"><em>null-state</em></span> separately. Consider + the following class: + </p> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">Record</span> +<span class="special">{</span> + <span class="identifier">optional</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">_min</span><span class="special">;</span> + <span class="identifier">optional</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">_max</span><span class="special">;</span> +<span class="special">};</span> +</pre> +<p> + Its memory layout can be depicted as follows: + </p> +<p> + <span class="inlinemediaobject"><img src="../../images/opt_align2.png" alt="opt_align2"></span> + </p> +<p> + This is exactly the same as if we had the following members: + </p> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">Record</span> +<span class="special">{</span> + <span class="keyword">bool</span> <span class="identifier">_has_min</span><span class="special">;</span> + <span class="keyword">int</span> <span class="identifier">_min</span><span class="special">;</span> + <span class="keyword">bool</span> <span class="identifier">_has_max</span><span class="special">;</span> + <span class="keyword">int</span> <span class="identifier">_max</span><span class="special">;</span> +<span class="special">};</span> +</pre> +<p> + But when they are stored separately, we at least have an option to reorder + them like this: + </p> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">Record</span> +<span class="special">{</span> + <span class="keyword">bool</span> <span class="identifier">_has_min</span><span class="special">;</span> + <span class="keyword">bool</span> <span class="identifier">_has_max</span><span class="special">;</span> + <span class="keyword">int</span> <span class="identifier">_min</span><span class="special">;</span> + <span class="keyword">int</span> <span class="identifier">_max</span><span class="special">;</span> +<span class="special">};</span> +</pre> +<p> + Which gives us the following layout (and smaller total size): + </p> +<p> + <span class="inlinemediaobject"><img src="../../images/opt_align3.png" alt="opt_align3"></span> + </p> +<p> + Sometimes it requires detailed consideration what data we make optional. + In our case above, if we determine that both minimum and maximum value can + be provided or not provided together, but one is never provided without the + other, we can make only one optional memebr: + </p> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">Limits</span> +<span class="special">{</span> + <span class="keyword">int</span> <span class="identifier">_min</span><span class="special">;</span> + <span class="keyword">int</span> <span class="identifier">_max</span><span class="special">;</span> +<span class="special">};</span> + +<span class="keyword">struct</span> <span class="identifier">Record</span> +<span class="special">{</span> + <span class="identifier">optional</span><span class="special"><</span><span class="identifier">Limits</span><span class="special">></span> <span class="identifier">_limits</span><span class="special">;</span> +<span class="special">};</span> +</pre> +<p> + This would give us the following layout: + </p> +<p> + <span class="inlinemediaobject"><img src="../../images/opt_align4.png" alt="opt_align4"></span> + </p> +<h5> +<a name="boost_optional.tutorial.performance_considerations.h0"></a> + <span class="phrase"><a name="boost_optional.tutorial.performance_considerations.optional_function_parameters"></a></span><a class="link" href="performance_considerations.html#boost_optional.tutorial.performance_considerations.optional_function_parameters">Optional + function parameters</a> + </h5> +<p> + Having function parameters of type <code class="computeroutput"><span class="keyword">const</span> + <span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span></code> + may incur certain unexpected run-time cost connected to copy construction + of <code class="computeroutput"><span class="identifier">T</span></code>. Consider the following + code. + </p> +<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">fun</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">optional</span><span class="special"><</span><span class="identifier">Big</span><span class="special">>&</span> <span class="identifier">v</span><span class="special">)</span> +<span class="special">{</span> + <span class="keyword">if</span> <span class="special">(</span><span class="identifier">v</span><span class="special">)</span> <span class="identifier">doSomethingWith</span><span class="special">(*</span><span class="identifier">v</span><span class="special">);</span> + <span class="keyword">else</span> <span class="identifier">doSomethingElse</span><span class="special">();</span> +<span class="special">}</span> + +<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> +<span class="special">{</span> + <span class="identifier">optional</span><span class="special"><</span><span class="identifier">Big</span><span class="special">></span> <span class="identifier">ov</span><span class="special">;</span> + <span class="identifier">Big</span> <span class="identifier">v</span><span class="special">;</span> + <span class="identifier">fun</span><span class="special">(</span><span class="identifier">none</span><span class="special">);</span> + <span class="identifier">fun</span><span class="special">(</span><span class="identifier">ov</span><span class="special">);</span> <span class="comment">// no copy</span> + <span class="identifier">fun</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span> <span class="comment">// copy constructor of Big</span> +<span class="special">}</span> +</pre> +<p> + No copy elision or move semantics can save us from copying type <code class="computeroutput"><span class="identifier">Big</span></code> here. Not that we need any copy, but + this is how <code class="computeroutput"><span class="identifier">optional</span></code> works. + In order to avoid copying in this case, one could provide second overload + of <code class="computeroutput"><span class="identifier">fun</span></code>: + </p> +<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">fun</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Big</span><span class="special">&</span> <span class="identifier">v</span><span class="special">)</span> +<span class="special">{</span> + <span class="identifier">doSomethingWith</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span> +<span class="special">}</span> + +<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> +<span class="special">{</span> + <span class="identifier">optional</span><span class="special"><</span><span class="identifier">Big</span><span class="special">></span> <span class="identifier">ov</span><span class="special">;</span> + <span class="identifier">Big</span> <span class="identifier">v</span><span class="special">;</span> + <span class="identifier">fun</span><span class="special">(</span><span class="identifier">ov</span><span class="special">);</span> <span class="comment">// no copy</span> + <span class="identifier">fun</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span> <span class="comment">// no copy: second overload selected</span> +<span class="special">}</span> +</pre> +<p> + Alternatively, you could consider using an optional reference instead: + </p> +<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">fun</span><span class="special">(</span><span class="identifier">optional</span><span class="special"><</span><span class="keyword">const</span> <span class="identifier">Big</span><span class="special">&></span> <span class="identifier">v</span><span class="special">)</span> <span class="comment">// note where the reference is</span> +<span class="special">{</span> + <span class="keyword">if</span> <span class="special">(</span><span class="identifier">v</span><span class="special">)</span> <span class="identifier">doSomethingWith</span><span class="special">(*</span><span class="identifier">v</span><span class="special">);</span> + <span class="keyword">else</span> <span class="identifier">doSomethingElse</span><span class="special">();</span> +<span class="special">}</span> + +<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> +<span class="special">{</span> + <span class="identifier">optional</span><span class="special"><</span><span class="identifier">Big</span><span class="special">></span> <span class="identifier">ov</span><span class="special">;</span> + <span class="identifier">Big</span> <span class="identifier">v</span><span class="special">;</span> + <span class="identifier">fun</span><span class="special">(</span><span class="identifier">none</span><span class="special">);</span> + <span class="identifier">fun</span><span class="special">(</span><span class="identifier">ov</span><span class="special">);</span> <span class="comment">// doesn't compile</span> + <span class="identifier">fun</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span> <span class="comment">// no copy</span> +<span class="special">}</span> +</pre> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014, 2015 Andrzej Krzemieński<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="type_requirements.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/optional/doc/html/boost_optional/tutorial/rebinding_semantics_for_assignment_of_optional_references.html b/libs/optional/doc/html/boost_optional/tutorial/rebinding_semantics_for_assignment_of_optional_references.html index 26bbf6600..a4c566ffc 100644 --- a/libs/optional/doc/html/boost_optional/tutorial/rebinding_semantics_for_assignment_of_optional_references.html +++ b/libs/optional/doc/html/boost_optional/tutorial/rebinding_semantics_for_assignment_of_optional_references.html @@ -135,7 +135,7 @@ </div> <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> <td align="left"></td> -<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014 Andrzej Krzemieński<p> +<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014, 2015 Andrzej Krzemieński<p> Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) </p> diff --git a/libs/optional/doc/html/boost_optional/tutorial/relational_operators.html b/libs/optional/doc/html/boost_optional/tutorial/relational_operators.html index bc97e7b72..31914272a 100644 --- a/libs/optional/doc/html/boost_optional/tutorial/relational_operators.html +++ b/libs/optional/doc/html/boost_optional/tutorial/relational_operators.html @@ -7,7 +7,7 @@ <link rel="home" href="../../index.html" title="Boost.Optional"> <link rel="up" href="../../optional/tutorial.html" title="Tutorial"> <link rel="prev" href="when_to_use_optional.html" title="When to use Optional"> -<link rel="next" href="optional_references.html" title="Optional references"> +<link rel="next" href="io_operators.html" title="IO operators"> </head> <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> <table cellpadding="2" width="100%"><tr> @@ -20,7 +20,7 @@ </tr></table> <hr> <div class="spirit-nav"> -<a accesskey="p" href="when_to_use_optional.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="optional_references.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +<a accesskey="p" href="when_to_use_optional.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="io_operators.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> </div> <div class="section"> <div class="titlepage"><div><div><h3 class="title"> @@ -30,7 +30,7 @@ <p> Type <code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code> is <a href="http://www.sgi.com/tech/stl/EqualityComparable.html" target="_top"><code class="computeroutput"><span class="identifier">EqualityComparable</span></code></a> whenever <code class="computeroutput"><span class="identifier">T</span></code> is <a href="http://www.sgi.com/tech/stl/EqualityComparable.html" target="_top"><code class="computeroutput"><span class="identifier">EqualityComparable</span></code></a>. Two optional - objects containing a value compare in the same as their contained values. + objects containing a value compare in the same way as their contained values. The uninitialized state of <code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code> is treated as a distinct value, equal to itself, and unequal to any value of type <code class="computeroutput"><span class="identifier">T</span></code>: @@ -99,7 +99,7 @@ </div> <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> <td align="left"></td> -<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014 Andrzej Krzemieński<p> +<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014, 2015 Andrzej Krzemieński<p> Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) </p> @@ -107,7 +107,7 @@ </tr></table> <hr> <div class="spirit-nav"> -<a accesskey="p" href="when_to_use_optional.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="optional_references.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +<a accesskey="p" href="when_to_use_optional.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="io_operators.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> </div> </body> </html> diff --git a/libs/optional/doc/html/boost_optional/tutorial/type_requirements.html b/libs/optional/doc/html/boost_optional/tutorial/type_requirements.html index 38a106d16..12cc30a59 100644 --- a/libs/optional/doc/html/boost_optional/tutorial/type_requirements.html +++ b/libs/optional/doc/html/boost_optional/tutorial/type_requirements.html @@ -7,7 +7,7 @@ <link rel="home" href="../../index.html" title="Boost.Optional"> <link rel="up" href="../../optional/tutorial.html" title="Tutorial"> <link rel="prev" href="exception_safety_guarantees.html" title="Exception Safety Guarantees"> -<link rel="next" href="../../optional/reference.html" title="Reference"> +<link rel="next" href="performance_considerations.html" title="Performance considerations"> </head> <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> <table cellpadding="2" width="100%"><tr> @@ -20,7 +20,7 @@ </tr></table> <hr> <div class="spirit-nav"> -<a accesskey="p" href="exception_safety_guarantees.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +<a accesskey="p" href="exception_safety_guarantees.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="performance_considerations.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> </div> <div class="section"> <div class="titlepage"><div><div><h3 class="title"> @@ -95,7 +95,7 @@ </div> <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> <td align="left"></td> -<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014 Andrzej Krzemieński<p> +<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014, 2015 Andrzej Krzemieński<p> Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) </p> @@ -103,7 +103,7 @@ </tr></table> <hr> <div class="spirit-nav"> -<a accesskey="p" href="exception_safety_guarantees.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +<a accesskey="p" href="exception_safety_guarantees.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="performance_considerations.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> </div> </body> </html> diff --git a/libs/optional/doc/html/boost_optional/tutorial/when_to_use_optional.html b/libs/optional/doc/html/boost_optional/tutorial/when_to_use_optional.html index 58834461d..fd27d8026 100644 --- a/libs/optional/doc/html/boost_optional/tutorial/when_to_use_optional.html +++ b/libs/optional/doc/html/boost_optional/tutorial/when_to_use_optional.html @@ -128,7 +128,7 @@ </div> <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> <td align="left"></td> -<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014 Andrzej Krzemieński<p> +<td align="right"><div class="copyright-footer">Copyright © 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright © 2014, 2015 Andrzej Krzemieński<p> Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) </p> |