summaryrefslogtreecommitdiff
path: root/libs/fusion/doc/html/fusion/notes.html
diff options
context:
space:
mode:
Diffstat (limited to 'libs/fusion/doc/html/fusion/notes.html')
-rwxr-xr-xlibs/fusion/doc/html/fusion/notes.html484
1 files changed, 484 insertions, 0 deletions
diff --git a/libs/fusion/doc/html/fusion/notes.html b/libs/fusion/doc/html/fusion/notes.html
new file mode 100755
index 0000000000..9442cae53e
--- /dev/null
+++ b/libs/fusion/doc/html/fusion/notes.html
@@ -0,0 +1,484 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Notes</title>
+<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Fusion 2.1">
+<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Fusion 2.1">
+<link rel="prev" href="functional/generation/metafunctions/mk_unfused.html" title="make_unfused">
+<link rel="next" href="change_log.html" title="Change log">
+</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="functional/generation/metafunctions/mk_unfused.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.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="change_log.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="fusion.notes"></a><a class="link" href="notes.html" title="Notes">Notes</a>
+</h2></div></div></div>
+<h4>
+<a name="fusion.notes.h0"></a>
+ <span><a name="fusion.notes.recursive_inlined_functions"></a></span><a class="link" href="notes.html#fusion.notes.recursive_inlined_functions">Recursive
+ Inlined Functions</a>
+ </h4>
+<p>
+ An interesting peculiarity of functions like <a class="link" href="sequence/intrinsic/functions/at.html" title="at"><code class="computeroutput"><span class="identifier">at</span></code></a> when applied to a <a class="link" href="sequence/concepts/forward_sequence.html" title="Forward Sequence">Forward
+ Sequence</a> like <a class="link" href="container/list.html" title="list"><code class="computeroutput"><span class="identifier">list</span></code></a>
+ is that what could have been linear runtime complexity effectively becomes
+ constant O(1) due to compiler optimization of C++ inlined functions, however
+ deeply recursive (up to a certain compiler limit of course). Compile time complexity
+ remains linear.
+ </p>
+<h4>
+<a name="fusion.notes.h1"></a>
+ <span><a name="fusion.notes.overloaded_functions"></a></span><a class="link" href="notes.html#fusion.notes.overloaded_functions">Overloaded
+ Functions</a>
+ </h4>
+<p>
+ Associative sequences use function overloading to implement membership testing
+ and type associated key lookup. This amounts to constant runtime and amortized
+ constant compile time complexities. There is an overloaded function, <code class="computeroutput"><span class="identifier">f</span><span class="special">(</span><span class="identifier">k</span><span class="special">)</span></code>, for each key <span class="emphasis"><em>type</em></span> <code class="computeroutput"><span class="identifier">k</span></code>. The compiler chooses the appropriate function
+ given a key, <code class="computeroutput"><span class="identifier">k</span></code>.
+ </p>
+<h4>
+<a name="fusion.notes.h2"></a>
+ <span><a name="fusion.notes.tag_dispatching"></a></span><a class="link" href="notes.html#fusion.notes.tag_dispatching">Tag
+ Dispatching</a>
+ </h4>
+<p>
+ Tag dispatching is a generic programming technique for selecting template specializations.
+ There are typically 3 components involved in the tag dispatching mechanism:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ A type for which an appropriate template specialization is required
+ </li>
+<li class="listitem">
+ A metafunction that associates the type with a tag type
+ </li>
+<li class="listitem">
+ A template that is specialized for the tag type
+ </li>
+</ol></div>
+<p>
+ For example, the fusion <code class="computeroutput"><span class="identifier">result_of</span><span class="special">::</span><span class="identifier">begin</span></code> metafunction
+ is implemented as follows:
+ </p>
+<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Sequence</span><span class="special">&gt;</span>
+<span class="keyword">struct</span> <span class="identifier">begin</span>
+<span class="special">{</span>
+ <span class="keyword">typedef</span> <span class="keyword">typename</span>
+ <span class="identifier">result_of</span><span class="special">::</span><span class="identifier">begin_impl</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">traits</span><span class="special">::</span><span class="identifier">tag_of</span><span class="special">&lt;</span><span class="identifier">Sequence</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">&gt;::</span>
+ <span class="keyword">template</span> <span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">Sequence</span><span class="special">&gt;::</span><span class="identifier">type</span>
+ <span class="identifier">type</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<p>
+ In the case:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ <code class="computeroutput"><span class="identifier">Sequence</span></code> is the type for
+ which a suitable implementation of <code class="computeroutput"><span class="identifier">result_of</span><span class="special">::</span><span class="identifier">begin_impl</span></code>
+ is required
+ </li>
+<li class="listitem">
+ <code class="computeroutput"><span class="identifier">traits</span><span class="special">::</span><span class="identifier">tag_of</span></code> is the metafunction that associates
+ <code class="computeroutput"><span class="identifier">Sequence</span></code> with an appropriate
+ tag
+ </li>
+<li class="listitem">
+ <code class="computeroutput"><span class="identifier">result_of</span><span class="special">::</span><span class="identifier">begin_impl</span></code> is the template which is specialized
+ to provide an implementation for each tag type
+ </li>
+</ol></div>
+<h4>
+<a name="fusion.notes.h3"></a>
+ <span><a name="fusion.notes.extensibility"></a></span><a class="link" href="notes.html#fusion.notes.extensibility">Extensibility</a>
+ </h4>
+<p>
+ Unlike <a href="http://www.boost.org/libs/mpl/index.html" target="_top">MPL</a>, there
+ is no extensibe sequence concept in fusion. This does not mean that Fusion
+ sequences are not extensible. In fact, all Fusion sequences are inherently
+ extensible. It is just that the manner of sequence extension in Fusion is diferent
+ from both <a href="http://en.wikipedia.org/wiki/Standard_Template_Library" target="_top">STL</a>
+ and <a href="http://www.boost.org/libs/mpl/index.html" target="_top">MPL</a> on account
+ of the lazy nature of fusion <a class="link" href="algorithm.html" title="Algorithm">Algorithms</a>.
+ <a href="http://en.wikipedia.org/wiki/Standard_Template_Library" target="_top">STL</a>
+ containers extend themselves in place though member functions such as <a class="link" href="algorithm/transformation/functions/push_back.html" title="push_back"><code class="computeroutput"><span class="identifier">push_back</span></code></a> and <a class="link" href="algorithm/transformation/functions/insert.html" title="insert"><code class="computeroutput"><span class="identifier">insert</span></code></a>. <a href="http://www.boost.org/libs/mpl/index.html" target="_top">MPL</a>
+ sequences, on the other hand, are extended through "intrinsic" functions
+ that actually return whole sequences. <a href="http://www.boost.org/libs/mpl/index.html" target="_top">MPL</a>
+ is purely functional and can not have side effects. For example, <a href="http://www.boost.org/libs/mpl/index.html" target="_top">MPL</a>'s
+ <code class="computeroutput"><span class="identifier">push_back</span></code> does not actually
+ mutate an <code class="computeroutput"><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span></code>. It can't do that. Instead, it returns
+ an extended <code class="computeroutput"><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span></code>.
+ </p>
+<p>
+ Like <a href="http://www.boost.org/libs/mpl/index.html" target="_top">MPL</a>, Fusion
+ too is purely functional and can not have side effects. With runtime efficiency
+ in mind, Fusion sequences are extended through generic functions that return
+ <a class="link" href="view.html" title="View">Views</a>. <a class="link" href="view.html" title="View">Views</a>
+ are sequences that do not actually contain data, but instead impart an alternative
+ presentation over the data from one or more underlying sequences. <a class="link" href="view.html" title="View">Views</a>
+ are proxies. They provide an efficient yet purely functional way to work on
+ potentially expensive sequence operations. For example, given a <a class="link" href="container/vector.html" title="vector"><code class="computeroutput"><span class="identifier">vector</span></code></a>, Fusion's <a class="link" href="algorithm/transformation/functions/push_back.html" title="push_back"><code class="computeroutput"><span class="identifier">push_back</span></code></a> returns a <a class="link" href="view/joint_view.html" title="joint_view"><code class="computeroutput"><span class="identifier">joint_view</span></code></a>, instead of an actual extended
+ <a class="link" href="container/vector.html" title="vector"><code class="computeroutput"><span class="identifier">vector</span></code></a>.
+ A <a class="link" href="view/joint_view.html" title="joint_view"><code class="computeroutput"><span class="identifier">joint_view</span></code></a>
+ holds a reference to the original sequence plus the appended data --making
+ it very cheap to pass around.
+ </p>
+<h4>
+<a name="fusion.notes.h4"></a>
+ <span><a name="fusion.notes.element_conversion"></a></span><a class="link" href="notes.html#fusion.notes.element_conversion">Element
+ Conversion</a>
+ </h4>
+<p>
+ Functions that take in elemental values to form sequences (e.g. <a class="link" href="container/generation/functions/make_list.html" title="make_list"><code class="computeroutput"><span class="identifier">make_list</span></code></a>) convert their arguments
+ to something suitable to be stored as a sequence element. In general, the element
+ types are stored as plain values. Example:
+ </p>
+<pre class="programlisting"><a class="link" href="container/generation/functions/make_list.html" title="make_list"><code class="computeroutput"><span class="identifier">make_list</span></code></a><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="char">'x'</span><span class="special">)</span>
+</pre>
+<p>
+ returns a <a class="link" href="container/list.html" title="list"><code class="computeroutput"><span class="identifier">list</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span>
+ <span class="keyword">char</span><span class="special">&gt;</span></code>.
+ </p>
+<p>
+ There are a few exceptions, however.
+ </p>
+<p>
+ <span class="bold"><strong>Arrays:</strong></span>
+ </p>
+<p>
+ Array arguments are deduced to reference to const types. For example <sup>[<a name="fusion.notes.f0" href="#ftn.fusion.notes.f0" class="footnote">13</a>]</sup>:
+ </p>
+<pre class="programlisting"><a class="link" href="container/generation/functions/make_list.html" title="make_list"><code class="computeroutput"><span class="identifier">make_list</span></code></a><span class="special">(</span><span class="string">"Donald"</span><span class="special">,</span> <span class="string">"Daisy"</span><span class="special">)</span>
+</pre>
+<p>
+ creates a <a class="link" href="container/list.html" title="list"><code class="computeroutput"><span class="identifier">list</span></code></a>
+ of type
+ </p>
+<pre class="programlisting"><a class="link" href="container/list.html" title="list"><code class="computeroutput"><span class="identifier">list</span></code></a><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">char</span> <span class="special">(&amp;)[</span><span class="number">7</span><span class="special">],</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">(&amp;)[</span><span class="number">6</span><span class="special">]&gt;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Function pointers:</strong></span>
+ </p>
+<p>
+ Function pointers are deduced to the plain non-reference type (i.e. to plain
+ function pointer). Example:
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span><span class="special">);</span>
+ <span class="special">...</span>
+<a class="link" href="container/generation/functions/make_list.html" title="make_list"><code class="computeroutput"><span class="identifier">make_list</span></code></a><span class="special">(&amp;</span><span class="identifier">f</span><span class="special">);</span>
+</pre>
+<p>
+ creates a <a class="link" href="container/list.html" title="list"><code class="computeroutput"><span class="identifier">list</span></code></a>
+ of type
+ </p>
+<pre class="programlisting"><a class="link" href="container/list.html" title="list"><code class="computeroutput"><span class="identifier">list</span></code></a><span class="special">&lt;</span><span class="keyword">void</span> <span class="special">(*)(</span><span class="keyword">int</span><span class="special">)&gt;</span>
+</pre>
+<h4>
+<a name="fusion.notes.h5"></a>
+ <span><a name="fusion.notes.boost__ref"></a></span><a class="link" href="notes.html#fusion.notes.boost__ref">boost::ref</a>
+ </h4>
+<p>
+ Fusion's generation functions (e.g. <a class="link" href="container/generation/functions/make_list.html" title="make_list"><code class="computeroutput"><span class="identifier">make_list</span></code></a>) by default stores the element
+ types as plain non-reference types. Example:
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">A</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">B</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="special">{</span>
+ <span class="special">...</span>
+ <a class="link" href="container/generation/functions/make_list.html" title="make_list"><code class="computeroutput"><span class="identifier">make_list</span></code></a><span class="special">(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">)</span>
+</pre>
+<p>
+ creates a <a class="link" href="container/list.html" title="list"><code class="computeroutput"><span class="identifier">list</span></code></a>
+ of type
+ </p>
+<pre class="programlisting"><a class="link" href="container/list.html" title="list"><code class="computeroutput"><span class="identifier">list</span></code></a><span class="special">&lt;</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">&gt;</span>
+</pre>
+<p>
+ Sometimes the plain non-reference type is not desired. You can use <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span></code>
+ and <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span></code> to store references or const references
+ (respectively) instead. The mechanism does not compromise const correctness
+ since a const object wrapped with ref results in a tuple element with const
+ reference type (see the fifth code line below). Examples:
+ </p>
+<p>
+ For example:
+ </p>
+<pre class="programlisting"><span class="identifier">A</span> <span class="identifier">a</span><span class="special">;</span> <span class="identifier">B</span> <span class="identifier">b</span><span class="special">;</span> <span class="keyword">const</span> <span class="identifier">A</span> <span class="identifier">ca</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span>
+<a class="link" href="container/generation/functions/make_list.html" title="make_list"><code class="computeroutput"><span class="identifier">make_list</span></code></a><span class="special">(</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">a</span><span class="special">),</span> <span class="identifier">b</span><span class="special">);</span> <span class="comment">// creates list&lt;const A&amp;, B&gt;</span>
+<a class="link" href="container/generation/functions/make_list.html" title="make_list"><code class="computeroutput"><span class="identifier">make_list</span></code></a><span class="special">(</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">a</span><span class="special">),</span> <span class="identifier">b</span><span class="special">);</span> <span class="comment">// creates list&lt;A&amp;, B&gt;</span>
+<a class="link" href="container/generation/functions/make_list.html" title="make_list"><code class="computeroutput"><span class="identifier">make_list</span></code></a><span class="special">(</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">a</span><span class="special">),</span> <span class="identifier">cref</span><span class="special">(</span><span class="identifier">b</span><span class="special">));</span> <span class="comment">// creates list&lt;A&amp;, const B&amp;&gt;</span>
+<a class="link" href="container/generation/functions/make_list.html" title="make_list"><code class="computeroutput"><span class="identifier">make_list</span></code></a><span class="special">(</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">ca</span><span class="special">));</span> <span class="comment">// creates list&lt;const A&amp;&gt;</span>
+<a class="link" href="container/generation/functions/make_list.html" title="make_list"><code class="computeroutput"><span class="identifier">make_list</span></code></a><span class="special">(</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">ca</span><span class="special">));</span> <span class="comment">// creates list&lt;const A&amp;&gt;</span>
+</pre>
+<p>
+ See <a href="http://www.boost.org/doc/html/ref.html" target="_top">Boost.Ref</a> for
+ details.
+ </p>
+<h4>
+<a name="fusion.notes.h6"></a>
+ <span><a name="fusion.notes.adt_attribute_proxy"></a></span><a class="link" href="notes.html#fusion.notes.adt_attribute_proxy">adt_attribute_proxy</a>
+ </h4>
+<p>
+ To adapt arbitrary data types that do not allow direct access to their members,
+ but allow indirect access via expressions (such as invocations of get- and
+ set-methods), fusion's <code class="literal">BOOST_FUSION_ADAPT_<span class="emphasis"><em>xxx</em></span>ADT<span class="emphasis"><em>xxx</em></span></code>-family
+ (e.g. <a class="link" href="adapted/adapt_adt.html" title="BOOST_FUSION_ADAPT_ADT"><code class="computeroutput"><span class="identifier">BOOST_FUSION_ADAPT_ADT</span></code></a>)
+ may be used. To bypass the restriction of not having actual lvalues that represent
+ the elements of the fusion sequence, but rather a sequence of paired expressions
+ that access the elements, the actual return type of fusion's intrinsic sequence
+ access functions (<a class="link" href="sequence/intrinsic/functions/at.html" title="at"><code class="computeroutput"><span class="identifier">at</span></code></a>, <a class="link" href="sequence/intrinsic/functions/at_c.html" title="at_c"><code class="computeroutput"><span class="identifier">at_c</span></code></a>, <a class="link" href="sequence/intrinsic/functions/at_key.html" title="at_key"><code class="computeroutput"><span class="identifier">at_key</span></code></a>, <a class="link" href="iterator/functions/deref.html" title="deref"><code class="computeroutput"><span class="identifier">deref</span></code></a>, and <a class="link" href="iterator/functions/deref_data.html" title="deref_data"><code class="computeroutput"><span class="identifier">deref_data</span></code></a>) is a proxy type, an instance
+ of <code class="computeroutput"><span class="identifier">adt_attribute_proxy</span></code>, that
+ encapsulates these expressions.
+ </p>
+<p>
+ <code class="computeroutput"><span class="identifier">adt_attribute_proxy</span></code> is defined
+ in the namespace <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">fusion</span><span class="special">::</span><span class="identifier">extension</span></code> and has three template arguments:
+ </p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">fusion</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">extension</span>
+<span class="special">{</span>
+ <span class="keyword">template</span><span class="special">&lt;</span>
+ <span class="keyword">typename</span> <span class="identifier">Type</span>
+ <span class="special">,</span> <span class="keyword">int</span> <span class="identifier">Index</span>
+ <span class="special">,</span> <span class="keyword">bool</span> <span class="identifier">Const</span>
+ <span class="special">&gt;</span>
+ <span class="keyword">struct</span> <span class="identifier">adt_attribute_proxy</span><span class="special">;</span>
+<span class="special">}}}</span>
+</pre>
+<p>
+ When adapting a class type, <code class="computeroutput"><span class="identifier">adt_attribute_proxy</span></code>
+ is specialized for every element of the adapted sequence, with <code class="computeroutput"><span class="identifier">Type</span></code> being the class type that is adapted,
+ <code class="computeroutput"><span class="identifier">Index</span></code> the 0-based indices of
+ the elements, and <code class="computeroutput"><span class="identifier">Const</span></code> both
+ <code class="computeroutput"><span class="keyword">true</span></code> and <code class="computeroutput"><span class="keyword">false</span></code>.
+ The return type of fusion's intrinsic sequence access functions for the <span class="emphasis"><em>N</em></span>th
+ element of an adapted class type <code class="computeroutput"><span class="identifier">type_name</span></code>
+ is <code class="literal">adt_attribute_proxy&lt;type_name, <span class="emphasis"><em>N</em></span>, <span class="emphasis"><em>Const</em></span>&gt;</code>,
+ with <code class="literal"><span class="emphasis"><em>Const</em></span></code> being <code class="computeroutput"><span class="keyword">true</span></code>
+ for constant instances of <code class="computeroutput"><span class="identifier">type_name</span></code>
+ and <code class="computeroutput"><span class="keyword">false</span></code> for non-constant ones.
+ </p>
+<div class="variablelist">
+<p class="title"><b>Notation</b></p>
+<dl>
+<dt><span class="term"><code class="computeroutput"><span class="identifier">type_name</span></code></span></dt>
+<dd><p>
+ The type to be adapted, with M attributes
+ </p></dd>
+<dt><span class="term"><code class="computeroutput"><span class="identifier">inst</span></code></span></dt>
+<dd><p>
+ Object of type <code class="computeroutput"><span class="identifier">type_name</span></code>
+ </p></dd>
+<dt><span class="term"><code class="computeroutput"><span class="identifier">const_inst</span></code></span></dt>
+<dd><p>
+ Object of type <code class="computeroutput"><span class="identifier">type_name</span> <span class="keyword">const</span></code>
+ </p></dd>
+<dt><span class="term"><code class="literal">(attribute_type<span class="emphasis"><em>N</em></span>, attribute_const_type<span class="emphasis"><em>N</em></span>,
+ get_expr<span class="emphasis"><em>N</em></span>, set_expr<span class="emphasis"><em>N</em></span>)</code></span></dt>
+<dd><p>
+ Attribute descriptor of the <span class="emphasis"><em>N</em></span>th attribute of <code class="computeroutput"><span class="identifier">type_name</span></code> as passed to the adaption
+ macro, 0&#8804;<span class="emphasis"><em>N</em></span>&lt;M
+ </p></dd>
+<dt><span class="term"><code class="literal">proxy_type<span class="emphasis"><em>N</em></span></code></span></dt>
+<dd><p>
+ <code class="literal">adt_attribute_proxy&lt;type_name, <span class="emphasis"><em>N</em></span>, <code class="computeroutput"><span class="keyword">false</span></code>&gt;</code> with <span class="emphasis"><em>N</em></span>
+ being an integral constant, 0&#8804;<span class="emphasis"><em>N</em></span>&lt;M
+ </p></dd>
+<dt><span class="term"><code class="literal">const_proxy_type<span class="emphasis"><em>N</em></span></code></span></dt>
+<dd><p>
+ <code class="literal">adt_attribute_proxy&lt;type_name, <span class="emphasis"><em>N</em></span>, <code class="computeroutput"><span class="keyword">true</span></code>&gt;</code> with <span class="emphasis"><em>N</em></span>
+ being an integral constant, 0&#8804;<span class="emphasis"><em>N</em></span>&lt;M
+ </p></dd>
+<dt><span class="term"><code class="literal">proxy<span class="emphasis"><em>N</em></span></code></span></dt>
+<dd><p>
+ Object of type <code class="literal">proxy_type<span class="emphasis"><em>N</em></span></code>
+ </p></dd>
+<dt><span class="term"><code class="literal">const_proxy<span class="emphasis"><em>N</em></span></code></span></dt>
+<dd><p>
+ Object of type <code class="literal">const_proxy_type<span class="emphasis"><em>N</em></span></code>
+ </p></dd>
+</dl>
+</div>
+<p>
+ <span class="bold"><strong>Expression Semantics</strong></span>
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ Expression
+ </p>
+ </th>
+<th>
+ <p>
+ Semantics
+ </p>
+ </th>
+</tr></thead>
+<tbody>
+<tr>
+<td>
+ <p>
+ <code class="literal">proxy_type<span class="emphasis"><em>N</em></span>(inst)</code>
+ </p>
+ </td>
+<td>
+ <p>
+ Creates an instance of <code class="literal">proxy_type<span class="emphasis"><em>N</em></span></code>
+ with underlying object <code class="computeroutput"><span class="identifier">inst</span></code>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="literal">const_proxy_type<span class="emphasis"><em>N</em></span>(const_inst)</code>
+ </p>
+ </td>
+<td>
+ <p>
+ Creates an instance of <code class="literal">const_proxy_type<span class="emphasis"><em>N</em></span></code>
+ with underlying object <code class="computeroutput"><span class="identifier">const_inst</span></code>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="literal">proxy_type<span class="emphasis"><em>N</em></span>::type</code>
+ </p>
+ </td>
+<td>
+ <p>
+ Another name for <code class="literal">attribute_type<span class="emphasis"><em>N</em></span></code>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="literal">const_proxy_type<span class="emphasis"><em>N</em></span>::type</code>
+ </p>
+ </td>
+<td>
+ <p>
+ Another name for <code class="literal">const_attribute_type<span class="emphasis"><em>N</em></span></code>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="literal">proxy<span class="emphasis"><em>N</em></span>=t</code>
+ </p>
+ </td>
+<td>
+ <p>
+ Invokes <code class="literal">set_expr<span class="emphasis"><em>N</em></span></code>, with
+ <code class="computeroutput"><span class="identifier">t</span></code> being an arbitrary
+ object. <code class="literal">set_expr<span class="emphasis"><em>N</em></span></code> may access
+ the variables named <code class="computeroutput"><span class="identifier">obj</span></code>
+ of type <code class="computeroutput"><span class="identifier">type_name</span><span class="special">&amp;</span></code>, which represent the corresponding
+ instance of <code class="computeroutput"><span class="identifier">type_name</span></code>,
+ and <code class="computeroutput"><span class="identifier">val</span></code> of an arbitrary
+ const-qualified reference template type parameter <code class="computeroutput"><span class="identifier">Val</span></code>,
+ which represents <code class="computeroutput"><span class="identifier">t</span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="literal">proxy<span class="emphasis"><em>N</em></span>.get()</code>
+ </p>
+ </td>
+<td>
+ <p>
+ Invokes <code class="literal">get_expr<span class="emphasis"><em>N</em></span></code> and forwards
+ its return value. <code class="literal">get_expr<span class="emphasis"><em>N</em></span></code>
+ may access the variable named <code class="computeroutput"><span class="identifier">obj</span></code>
+ of type <code class="computeroutput"><span class="identifier">type_name</span><span class="special">&amp;</span></code> which represents the underlying
+ instance of <code class="computeroutput"><span class="identifier">type_name</span></code>.
+ <code class="literal">attribute_type<span class="emphasis"><em>N</em></span></code> may specify
+ the type that <code class="literal">get_expr<span class="emphasis"><em>N</em></span></code> denotes
+ to.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="literal">const_proxy<span class="emphasis"><em>N</em></span>.get()</code>
+ </p>
+ </td>
+<td>
+ <p>
+ Invokes <code class="literal">get_expr<span class="emphasis"><em>N</em></span></code> and forwards
+ its return value. <code class="literal">get_expr<span class="emphasis"><em>N</em></span></code>
+ may access the variable named <code class="computeroutput"><span class="identifier">obj</span></code>
+ of type <code class="computeroutput"><span class="identifier">type_name</span> <span class="keyword">const</span><span class="special">&amp;</span></code>
+ which represents the underlying instance of <code class="computeroutput"><span class="identifier">type_name</span></code>.
+ <code class="literal">attribute_const_type<span class="emphasis"><em>N</em></span></code> may
+ specify the type that <code class="literal">get_expr<span class="emphasis"><em>N</em></span></code>
+ denotes to.
+ </p>
+ </td>
+</tr>
+</tbody>
+</table></div>
+<p>
+ Additionally, <code class="literal">proxy_type<span class="emphasis"><em>N</em></span></code> and <code class="literal">const_proxy_type<span class="emphasis"><em>N</em></span></code>
+ are copy constructible, copy assignable and implicitly convertible to <code class="literal">proxy_type<span class="emphasis"><em>N</em></span>::type</code>
+ or <code class="literal">const_proxy_type<span class="emphasis"><em>N</em></span>::type</code>.
+ </p>
+<div class="tip"><table border="0" summary="Tip">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../../../doc/src/images/tip.png"></td>
+<th align="left">Tip</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ To avoid the pitfalls of the proxy type, an arbitrary class type may also
+ be adapted directly using fusion's <a class="link" href="extension.html" title="Extension">intrinsic
+ extension mechanism</a>.
+ </p></td></tr>
+</table></div>
+<div class="footnotes">
+<br><hr width="100" align="left">
+<div class="footnote"><p><sup>[<a id="ftn.fusion.notes.f0" href="#fusion.notes.f0" class="para">13</a>] </sup>
+ Note that the type of a string literal is an array of const characters, not
+ <code class="computeroutput"><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span></code>. To get <a class="link" href="container/generation/functions/make_list.html" title="make_list"><code class="computeroutput"><span class="identifier">make_list</span></code></a> to create a <a class="link" href="container/list.html" title="list"><code class="computeroutput"><span class="identifier">list</span></code></a> with an element of a non-const
+ array type one must use the <code class="computeroutput"><span class="identifier">ref</span></code>
+ wrapper (see <a class="link" href="notes.html#fusion.notes.boost__ref"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span></code></a>).
+ </p></div>
+</div>
+</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 &#169; 2001-2006, 2011 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="functional/generation/metafunctions/mk_unfused.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.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="change_log.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>