forked from boostorg/fusion
https://svn.boost.org/svn/boost/trunk ........ r42194 | anthonyw | 2007-12-19 23:46:00 -0800 (Wed, 19 Dec 2007) | 1 line added missing parentheses ........ r42195 | anthonyw | 2007-12-20 00:37:02 -0800 (Thu, 20 Dec 2007) | 1 line added hardware_concurrency support for apple, freebsd and sun platforms ........ r42196 | niels_dekker | 2007-12-20 01:09:44 -0800 (Thu, 20 Dec 2007) | 1 line Removed "mark-expected-failures" from value_init_test, for both Borland and GCC, as value_init.hpp changeset [41942] provides a workaround for them. ........ r42202 | fmhess | 2007-12-20 06:39:53 -0800 (Thu, 20 Dec 2007) | 6 lines Made putting the name of a typedef inside a "classname" element successfully produce a link to the typedef's reference documentation, or to the typedef's synopsis if that is all it has. ........ r42217 | vladimir_prus | 2007-12-20 13:18:47 -0800 (Thu, 20 Dec 2007) | 1 line Explain a couple of gcc limitations with precompiled headers ........ r42220 | matias | 2007-12-20 13:56:39 -0800 (Thu, 20 Dec 2007) | 1 line add explicit std::string initialization ........ r42221 | matias | 2007-12-20 13:59:18 -0800 (Thu, 20 Dec 2007) | 1 line add license to each html page ........ r42222 | matias | 2007-12-20 14:15:11 -0800 (Thu, 20 Dec 2007) | 1 line Time out: test_bimap_property_map @ gcc-3.4.6_linux_x86_64 ........ r42223 | djowel | 2007-12-20 15:24:28 -0800 (Thu, 20 Dec 2007) | 1 line Removing fusion variant adapter ........ r42224 | djowel | 2007-12-20 15:28:26 -0800 (Thu, 20 Dec 2007) | 1 line Removing fusion variant adapter ........ r42227 | nmusatti | 2007-12-20 23:03:44 -0800 (Thu, 20 Dec 2007) | 1 line Increased the latest supported version to 5.9.3, corresponding to the December 2007 update. ........ r42228 | anthonyw | 2007-12-21 02:54:59 -0800 (Fri, 21 Dec 2007) | 1 line Updated thread ID test ........ r42229 | anthonyw | 2007-12-21 03:05:37 -0800 (Fri, 21 Dec 2007) | 1 line Markup hardware_concurrency failure as expected on tru64 platforms, as support is not implemented ........ r42234 | dgregor | 2007-12-21 13:18:17 -0800 (Fri, 21 Dec 2007) | 1 line Reduce header dependencies, from Shunsuke Sogame. Fixes #1535 ........ [SVN r42236]
115 lines
9.3 KiB
HTML
115 lines
9.3 KiB
HTML
<html>
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||
<title>Algorithm</title>
|
||
<link rel="stylesheet" href="../../../../../doc/html/boostbook.css" type="text/css">
|
||
<meta name="generator" content="DocBook XSL Stylesheets V1.66.1">
|
||
<link rel="start" href="../index.html" title="Chapter 1. Fusion 2.0">
|
||
<link rel="up" href="../index.html" title="Chapter 1. Fusion 2.0">
|
||
<link rel="prev" href="adapted/adapt_assoc.html" title=" BOOST_FUSION_ADAPT_ASSOC_STRUCT">
|
||
<link rel="next" href="algorithm/iteration.html" title="Iteration">
|
||
</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.htm">Home</a></td>
|
||
<td align="center"><a href="../../../../libraries.htm">Libraries</a></td>
|
||
<td align="center"><a href="../../../../../people/people.htm">People</a></td>
|
||
<td align="center"><a href="../../../../../more/faq.htm">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="adapted/adapt_assoc.html"><img src="../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="algorithm/iteration.html"><img src="../../../../../doc/html/images/next.png" alt="Next"></a>
|
||
</div>
|
||
<div class="section" lang="en">
|
||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||
<a name="fusion.algorithm"></a><a href="algorithm.html" title="Algorithm">Algorithm</a></h2></div></div></div>
|
||
<div class="toc"><dl>
|
||
<dt><span class="section"><a href="algorithm/iteration.html">Iteration</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="section"><a href="algorithm/iteration/functions.html">Functions</a></span></dt>
|
||
<dt><span class="section"><a href="algorithm/iteration/metafunctions.html">Metafunctions</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="section"><a href="algorithm/query.html">Query</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="section"><a href="algorithm/query/functions.html">Functions</a></span></dt>
|
||
<dt><span class="section"><a href="algorithm/query/metafunctions.html">Metafunctions</a></span></dt>
|
||
</dl></dd>
|
||
<dt><span class="section"><a href="algorithm/transformation.html">Transformation</a></span></dt>
|
||
<dd><dl>
|
||
<dt><span class="section"><a href="algorithm/transformation/functions.html">Functions</a></span></dt>
|
||
<dt><span class="section"><a href="algorithm/transformation/metafunctions.html">Metafunctions</a></span></dt>
|
||
</dl></dd>
|
||
</dl></div>
|
||
<a name="fusion.algorithm.lazy_evaluation"></a><h3>
|
||
<a name="id578704"></a>
|
||
<a href="algorithm.html#fusion.algorithm.lazy_evaluation">Lazy Evaluation</a>
|
||
</h3>
|
||
<p>
|
||
Unlike <a href="http://www.boost.org/libs/mpl/index.html" target="_top">MPL</a>, Fusion
|
||
algorithms are lazy and non sequence-type preserving. What does that mean?
|
||
It means that when you operate on a sequence through a Fusion algorithm that
|
||
returns a sequence, the sequence returned may not be of the same class as the
|
||
original. This is by design. Runtime efficiency is given a high priority. Like
|
||
<a href="http://www.boost.org/libs/mpl/index.html" target="_top">MPL</a>, and unlike
|
||
<a href="http://en.wikipedia.org/wiki/Standard_Template_Library" target="_top">STL</a>,
|
||
fusion algorithms are functional in nature such that algorithms are non mutating
|
||
(no side effects). However, due to the high cost of returning full sequences
|
||
such as vectors and lists, <span class="emphasis"><em>Views</em></span> are returned from Fusion
|
||
algorithms instead. For example, the <a href="algorithm/transformation/functions/transform.html" title="transform"><tt class="computeroutput"><span class="identifier">transform</span></tt></a> algorithm does not actually
|
||
return a transformed version of the original sequence. <a href="algorithm/transformation/functions/transform.html" title="transform"><tt class="computeroutput"><span class="identifier">transform</span></tt></a> returns a <a href="view/transform_view.html" title="transform_view"><tt class="computeroutput"><span class="identifier">transform_view</span></tt></a>. This view holds a
|
||
reference to the original sequence plus the transform function. Iteration over
|
||
the <a href="view/transform_view.html" title="transform_view"><tt class="computeroutput"><span class="identifier">transform_view</span></tt></a>
|
||
will apply the transform function over the sequence elements on demand. This
|
||
<span class="emphasis"><em>lazy</em></span> evaluation scheme allows us to chain as many algorithms
|
||
as we want without incurring a high runtime penalty.
|
||
</p>
|
||
<a name="fusion.algorithm.sequence_extension"></a><h3>
|
||
<a name="id578852"></a>
|
||
<a href="algorithm.html#fusion.algorithm.sequence_extension">Sequence Extension</a>
|
||
</h3>
|
||
<p>
|
||
The <span class="emphasis"><em>lazy</em></span> evaluation scheme where <a href="algorithm.html" title="Algorithm">Algorithms</a>
|
||
return <a href="view.html" title="View">Views</a> also allows operations such
|
||
as <a href="algorithm/transformation/functions/push_back.html" title="push_back"><tt class="computeroutput"><span class="identifier">push_back</span></tt></a> to be totally generic. In
|
||
Fusion, <a href="algorithm/transformation/functions/push_back.html" title="push_back"><tt class="computeroutput"><span class="identifier">push_back</span></tt></a> is actually a generic algorithm
|
||
that works on all sequences. Given an input sequence <tt class="computeroutput"><span class="identifier">s</span></tt>
|
||
and a value <tt class="computeroutput"><span class="identifier">x</span></tt>, Fusion's <a href="algorithm/transformation/functions/push_back.html" title="push_back"><tt class="computeroutput"><span class="identifier">push_back</span></tt></a> algorithm simply returns
|
||
a <a href="view/joint_view.html" title="joint_view"><tt class="computeroutput"><span class="identifier">joint_view</span></tt></a>:
|
||
a view that holds a reference to the original sequence <tt class="computeroutput"><span class="identifier">s</span></tt>
|
||
and the value <tt class="computeroutput"><span class="identifier">x</span></tt>. Functions
|
||
that were once sequence specific and need to be implemented N times over N
|
||
different sequences are now implemented only once. That is to say that Fusion
|
||
sequences are cheaply extensible. However, an important caveat is that the
|
||
result of a sequence extending operation like <a href="algorithm/transformation/functions/push_back.html" title="push_back"><tt class="computeroutput"><span class="identifier">push_back</span></tt></a> does not retain the properties
|
||
of the original sequence such as associativity of <a href="container/set.html" title="set"><tt class="computeroutput"><span class="identifier">set</span></tt></a>(s). To regain the original sequence,
|
||
<a href="container/conversion/functions.html" title="Functions">Conversion</a> functions
|
||
are provided. You may use one of the <a href="container/conversion/functions.html" title="Functions">Conversion</a>
|
||
functions to convert back to the original sequence type.
|
||
</p>
|
||
<a name="fusion.algorithm.header"></a><h3>
|
||
<a name="id579085"></a>
|
||
<a href="algorithm.html#fusion.algorithm.header">Header</a>
|
||
</h3>
|
||
<pre class="programlisting">
|
||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fusion</span><span class="special">/</span><span class="identifier">algorithm</span><span class="special">.</span><span class="identifier">hpp</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">fusion</span><span class="special">/</span><span class="identifier">include</span><span class="special">/</span><span class="identifier">algorithm</span><span class="special">.</span><span class="identifier">hpp</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 © 2001-2007 Joel de Guzman, Dan Marsden, Tobias
|
||
Schwinger<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="adapted/adapt_assoc.html"><img src="../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="algorithm/iteration.html"><img src="../../../../../doc/html/images/next.png" alt="Next"></a>
|
||
</div>
|
||
</body>
|
||
</html>
|