• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Implementation Details</title>
5<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.2.0">
8<link rel="up" href="../lazy_list.html" title="Lazy List">
9<link rel="prev" href="exceptions.html" title="Exceptions">
10<link rel="next" href="testing.html" title="Testing">
11</head>
12<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13<table cellpadding="2" width="100%"><tr>
14<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
15<td align="center"><a href="../../../../../../index.html">Home</a></td>
16<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
17<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
20</tr></table>
21<hr>
22<div class="spirit-nav">
23<a accesskey="p" href="exceptions.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../lazy_list.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="testing.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
24</div>
25<div class="section">
26<div class="titlepage"><div><div><h3 class="title">
27<a name="phoenix.lazy_list.implementation_details"></a><a class="link" href="implementation_details.html" title="Implementation Details">Implementation
28      Details</a>
29</h3></div></div></div>
30<h3>
31<a name="phoenix.lazy_list.implementation_details.h0"></a>
32        <span class="phrase"><a name="phoenix.lazy_list.implementation_details.introduction"></a></span><a class="link" href="implementation_details.html#phoenix.lazy_list.implementation_details.introduction">Introduction</a>
33      </h3>
34<p>
35        The implementation has depended on close study of the existing code of <a href="http://cgi.di.uoa.gr/~smaragd/fc++/" target="_top">FC++</a>. The <a href="http://people.cs.umass.edu/~yannis/fc++/New/new_list_implementation.html" target="_top">FC++
36        List Implementation</a> is a carefully crafted code which allows for
37        efficient processing of a number of different cases. In particular it makes
38        use of the <a href="http://people.cs.umass.edu/~yannis/fc++/New/reusers.html" target="_top">FC++
39        Reuser Implementation</a> for processing of repetitive evaluations.
40      </p>
41<p>
42        <a href="http://cgi.di.uoa.gr/~smaragd/fc++/" target="_top">FC++</a> uses a combination
43        of polymorphic and single type functions which can be passed as arguments
44        to other functions.
45      </p>
46<p>
47        The implementation of list&lt;T&gt; has needed new implementations of the
48        strategy using the facilities of Boost Phoenix and also Boost Function. It
49        turns out that a combination of both can be used to meet the needs of list&lt;T&gt;.
50      </p>
51<p>
52        The fact that the functions are defined by boost::phoenix::function means
53        that they work with phoenix arguments such as 'arg1'. This is the fact which
54        ensures the flexibility needed for the user to build new functions as needed.
55      </p>
56<h3>
57<a name="phoenix.lazy_list.implementation_details.h1"></a>
58        <span class="phrase"><a name="phoenix.lazy_list.implementation_details.fc___legacy"></a></span><a class="link" href="implementation_details.html#phoenix.lazy_list.implementation_details.fc___legacy">FC++ legacy</a>
59      </h3>
60<p>
61        The <a href="http://people.cs.umass.edu/~yannis/fc++/New/new_list_implementation.html" target="_top">FC++
62        List Implementation</a> and the <a href="http://people.cs.umass.edu/~yannis/fc++/New/reusers.html" target="_top">FC++
63        Reuser Implementation</a> have been followed very closely in building
64        this code. The version used as the starting point was the <a href="http://cgi.di.uoa.gr/~smaragd/fc++/boostpaper/" target="_top">Boost
65        FC++</a> version.
66      </p>
67<h3>
68<a name="phoenix.lazy_list.implementation_details.h2"></a>
69        <span class="phrase"><a name="phoenix.lazy_list.implementation_details.polymorphic_function_types"></a></span><a class="link" href="implementation_details.html#phoenix.lazy_list.implementation_details.polymorphic_function_types">Polymorphic
70        Function Types</a>
71      </h3>
72<p>
73        Functions are implemented as a struct within namespace impl. For an example
74        funcion 'x' the type is defined like this:
75      </p>
76<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">function</span><span class="special">&lt;</span><span class="identifier">impl</span><span class="special">::</span><span class="identifier">X</span><span class="special">&gt;</span> <span class="identifier">X</span><span class="special">;</span>
77<span class="identifier">X</span> <span class="identifier">x</span>
78</pre>
79<p>
80        This alternative will work to provide a function 'x' but it is not then possible
81        to pass it as an argument.
82      </p>
83<pre class="programlisting"><span class="identifier">BOOST_PHOENIX_ADAPT_CALLABLE</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">impl</span><span class="special">::</span><span class="identifier">X</span><span class="special">,</span> <span class="number">1</span><span class="special">)</span>
84</pre>
85<h4>
86<a name="phoenix.lazy_list.implementation_details.h3"></a>
87        <span class="phrase"><a name="phoenix.lazy_list.implementation_details.implementation_example"></a></span><a class="link" href="implementation_details.html#phoenix.lazy_list.implementation_details.implementation_example">Implementation
88        Example</a>
89      </h4>
90<p>
91        This example implements id() which simply returns its argument:
92      </p>
93<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">impl</span> <span class="special">{</span>
94
95  <span class="keyword">struct</span> <span class="identifier">Id</span>
96  <span class="special">{</span>
97    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Sig</span><span class="special">&gt;</span>
98    <span class="keyword">struct</span> <span class="identifier">result</span><span class="special">;</span>
99
100    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">This</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">&gt;</span>
101    <span class="keyword">struct</span> <span class="identifier">result</span><span class="special">&lt;</span><span class="identifier">This</span><span class="special">(</span><span class="identifier">A0</span><span class="special">)&gt;</span>
102       <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">remove_reference</span><span class="special">&lt;</span><span class="identifier">A0</span><span class="special">&gt;</span>
103    <span class="special">{};</span>
104
105    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">&gt;</span>
106    <span class="identifier">A0</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">A0</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">a0</span><span class="special">)</span> <span class="keyword">const</span>
107    <span class="special">{</span>
108        <span class="keyword">return</span> <span class="identifier">a0</span><span class="special">;</span>
109    <span class="special">}</span>
110
111  <span class="special">};</span>
112
113<span class="special">}</span>
114
115<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">function</span><span class="special">&lt;</span><span class="identifier">impl</span><span class="special">::</span><span class="identifier">Id</span><span class="special">&gt;</span> <span class="identifier">Id</span><span class="special">;</span>
116<span class="identifier">Id</span> <span class="identifier">id</span><span class="special">;</span>
117</pre>
118<h3>
119<a name="phoenix.lazy_list.implementation_details.h4"></a>
120        <span class="phrase"><a name="phoenix.lazy_list.implementation_details.functions_with_defined_return_type"></a></span><a class="link" href="implementation_details.html#phoenix.lazy_list.implementation_details.functions_with_defined_return_type">Functions
121        with defined return type</a>
122      </h3>
123<p>
124        Sometimes it is necessary to define a function using a templated struct,
125        where the template parameter type defines the return type.
126      </p>
127<h4>
128<a name="phoenix.lazy_list.implementation_details.h5"></a>
129        <span class="phrase"><a name="phoenix.lazy_list.implementation_details.example_with_one_argument"></a></span><a class="link" href="implementation_details.html#phoenix.lazy_list.implementation_details.example_with_one_argument">Example
130        with one argument</a>
131      </h4>
132<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">impl</span> <span class="special">{</span>
133
134  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Result</span><span class="special">&gt;</span>
135  <span class="keyword">struct</span> <span class="identifier">what</span> <span class="special">{</span>
136
137    <span class="keyword">typedef</span> <span class="identifier">Result</span> <span class="identifier">result_type</span><span class="special">;</span>
138
139    <span class="identifier">Result</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Result</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">r</span><span class="special">)</span> <span class="keyword">const</span>
140    <span class="special">{</span>
141      <span class="keyword">return</span> <span class="identifier">r</span><span class="special">;</span>
142    <span class="special">}</span>
143  <span class="special">};</span>
144
145<span class="special">}</span>
146
147<span class="identifier">boost</span><span class="special">::</span><span class="identifier">function1</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span> <span class="special">&gt;</span> <span class="identifier">what_int</span> <span class="special">=</span> <span class="identifier">impl</span><span class="special">::</span><span class="identifier">what</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;();</span>
148<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">function1</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">fun1_int_int</span><span class="special">;</span>
149<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">function</span><span class="special">&lt;</span><span class="identifier">fun1_int_int</span><span class="special">&gt;</span> <span class="identifier">What_arg</span><span class="special">;</span>
150<span class="identifier">What_arg</span> <span class="identifier">what_arg</span><span class="special">(</span><span class="identifier">what_int</span><span class="special">);</span>
151</pre>
152<h4>
153<a name="phoenix.lazy_list.implementation_details.h6"></a>
154        <span class="phrase"><a name="phoenix.lazy_list.implementation_details.example_with_zero_arguments"></a></span><a class="link" href="implementation_details.html#phoenix.lazy_list.implementation_details.example_with_zero_arguments">Example
155        with zero arguments</a>
156      </h4>
157<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">impl</span> <span class="special">{</span>
158  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Result</span><span class="special">&gt;</span>
159  <span class="keyword">struct</span> <span class="identifier">what0</span> <span class="special">{</span>
160
161    <span class="keyword">typedef</span> <span class="identifier">Result</span> <span class="identifier">result_type</span><span class="special">;</span>
162
163    <span class="identifier">Result</span> <span class="keyword">operator</span><span class="special">()()</span> <span class="keyword">const</span>
164    <span class="special">{</span>
165      <span class="keyword">return</span> <span class="identifier">Result</span><span class="special">(</span><span class="number">100</span><span class="special">);</span>
166    <span class="special">}</span>
167
168  <span class="special">};</span>
169<span class="special">}</span>
170
171<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">function0</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">fun0_int</span><span class="special">;</span>
172<span class="identifier">boost</span><span class="special">::</span><span class="identifier">function0</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">what0_int</span> <span class="special">=</span> <span class="identifier">impl</span><span class="special">::</span><span class="identifier">what0</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;();</span>
173<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">function</span><span class="special">&lt;</span><span class="identifier">fun0_int</span><span class="special">&gt;</span> <span class="identifier">What0_arg</span><span class="special">;</span>
174<span class="identifier">What0_arg</span> <span class="identifier">what0_arg</span><span class="special">(</span><span class="identifier">what0_int</span><span class="special">);</span>
175</pre>
176<h3>
177<a name="phoenix.lazy_list.implementation_details.h7"></a>
178        <span class="phrase"><a name="phoenix.lazy_list.implementation_details.list_generation_implementation"></a></span><a class="link" href="implementation_details.html#phoenix.lazy_list.implementation_details.list_generation_implementation">List
179        Generation Implementation</a>
180      </h3>
181<p>
182        The implementation of the function
183      </p>
184<pre class="programlisting"><span class="identifier">enum_from</span><span class="special">(</span><span class="number">1</span><span class="special">)</span>
185</pre>
186<p>
187        requires a functor which will evaluate the successive numbers on demand.
188        The code from <a href="http://cgi.di.uoa.gr/~smaragd/fc++/" target="_top">FC++</a>
189        has been reimplemented using internal functors as follows.
190      </p>
191<p>
192        This code has to carefully manipulate the input type T to construct the result
193        type which is a list.
194      </p>
195<p>
196        The code in EFH is used to build a series of objects which each add one element
197        to the list and return the function which will add the next element. That
198        only gets called when it is needed.
199      </p>
200<pre class="programlisting">      <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
201      <span class="keyword">struct</span> <span class="identifier">EFH</span>
202      <span class="special">{</span>
203          <span class="keyword">mutable</span> <span class="identifier">T</span> <span class="identifier">x</span><span class="special">;</span>
204          <span class="identifier">EFH</span><span class="special">(</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">xx</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">x</span><span class="special">(</span><span class="identifier">xx</span><span class="special">)</span> <span class="special">{}</span>
205          <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Sig</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">result</span><span class="special">;</span>
206
207          <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">This</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">TT</span><span class="special">&gt;</span>
208          <span class="keyword">struct</span> <span class="identifier">result</span><span class="special">&lt;</span><span class="identifier">This</span><span class="special">(</span><span class="identifier">TT</span><span class="special">)&gt;</span>
209          <span class="special">{</span>
210            <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">UseList</span><span class="special">::</span><span class="keyword">template</span>
211                    <span class="identifier">List</span><span class="special">&lt;</span><span class="identifier">TT</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">LType</span><span class="special">;</span>
212            <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">::</span>
213                    <span class="identifier">ListType</span><span class="special">&lt;</span><span class="identifier">LType</span><span class="special">&gt;::</span><span class="identifier">delay_result_type</span> <span class="identifier">type</span><span class="special">;</span>
214          <span class="special">};</span>
215          <span class="keyword">typename</span> <span class="identifier">result</span><span class="special">&lt;</span><span class="identifier">EFH</span><span class="special">(</span><span class="identifier">T</span><span class="special">)&gt;::</span><span class="identifier">type</span> <span class="keyword">operator</span><span class="special">()()</span> <span class="keyword">const</span> <span class="special">{</span>
216            <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">UseList</span><span class="special">::</span><span class="keyword">template</span> <span class="identifier">List</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">LType</span><span class="special">;</span>
217            <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">::</span><span class="identifier">ListType</span><span class="special">&lt;</span><span class="identifier">LType</span><span class="special">&gt;::</span>
218                    <span class="identifier">delay_result_type</span> <span class="identifier">result_type</span><span class="special">;</span>
219            <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">function0</span><span class="special">&lt;</span><span class="identifier">result_type</span><span class="special">&gt;</span> <span class="identifier">fun1_R_TTT</span><span class="special">;</span>
220            <span class="special">++</span><span class="identifier">x</span><span class="special">;</span>
221            <span class="identifier">fun1_R_TTT</span> <span class="identifier">efh_R_TTT</span> <span class="special">=</span> <span class="identifier">EFH</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(</span><span class="identifier">x</span><span class="special">);</span>
222            <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">function</span><span class="special">&lt;</span><span class="identifier">fun1_R_TTT</span><span class="special">&gt;</span> <span class="identifier">EFH_R_T</span><span class="special">;</span>
223            <span class="identifier">EFH_R_T</span> <span class="identifier">efh_R_T</span><span class="special">(</span><span class="identifier">efh_R_TTT</span><span class="special">);</span>
224<span class="preprocessor">#ifndef</span> <span class="identifier">BOOST_PHOENIX_NO_LAZY_EXCEPTIONS</span>
225            <span class="keyword">if</span> <span class="special">(</span><span class="identifier">x</span> <span class="special">&gt;</span> <span class="identifier">BOOST_PHOENIX_FUNCTION_MAX_LAZY_LIST_LENGTH</span><span class="special">)</span>
226                 <span class="keyword">throw</span> <span class="identifier">lazy_exception</span><span class="special">(</span><span class="string">"Running away in EFH!!"</span><span class="special">);</span>
227<span class="preprocessor">#endif</span>
228            <span class="keyword">return</span> <span class="identifier">cons</span><span class="special">(</span> <span class="identifier">x</span><span class="special">-</span><span class="number">1</span><span class="special">,</span> <span class="identifier">efh_R_T</span><span class="special">()</span> <span class="special">);</span>
229          <span class="special">}</span>
230      <span class="special">};</span>
231
232      <span class="keyword">struct</span> <span class="identifier">Enum_from</span> <span class="special">{</span>
233         <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Sig</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">result</span><span class="special">;</span>
234
235         <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">This</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
236         <span class="keyword">struct</span> <span class="identifier">result</span><span class="special">&lt;</span><span class="identifier">This</span><span class="special">(</span><span class="identifier">T</span><span class="special">)&gt;</span>
237         <span class="special">{</span>
238           <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">remove_reference</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">TT</span><span class="special">;</span>
239           <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">remove_const</span><span class="special">&lt;</span><span class="identifier">TT</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">TTT</span><span class="special">;</span>
240           <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">UseList</span><span class="special">::</span><span class="keyword">template</span> <span class="identifier">List</span><span class="special">&lt;</span><span class="identifier">TTT</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">LType</span><span class="special">;</span>
241           <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">::</span><span class="identifier">ListType</span><span class="special">&lt;</span><span class="identifier">LType</span><span class="special">&gt;::</span>
242                   <span class="identifier">delay_result_type</span> <span class="identifier">type</span><span class="special">;</span>
243         <span class="special">};</span>
244
245         <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
246         <span class="keyword">typename</span> <span class="identifier">result</span><span class="special">&lt;</span><span class="identifier">Enum_from</span><span class="special">(</span><span class="identifier">T</span><span class="special">)&gt;::</span><span class="identifier">type</span> <span class="keyword">operator</span><span class="special">()</span>
247            <span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span> <span class="special">&amp;</span> <span class="identifier">x</span><span class="special">)</span> <span class="keyword">const</span>
248          <span class="special">{</span>
249            <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">remove_reference</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">TT</span><span class="special">;</span>
250            <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">remove_const</span><span class="special">&lt;</span><span class="identifier">TT</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">TTT</span><span class="special">;</span>
251            <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">UseList</span><span class="special">::</span><span class="keyword">template</span> <span class="identifier">List</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">LType</span><span class="special">;</span>
252            <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">::</span><span class="identifier">ListType</span><span class="special">&lt;</span><span class="identifier">LType</span><span class="special">&gt;::</span>
253                    <span class="identifier">delay_result_type</span> <span class="identifier">result_type</span><span class="special">;</span>
254            <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">function0</span><span class="special">&lt;</span><span class="identifier">result_type</span><span class="special">&gt;</span> <span class="identifier">fun1_R_TTT</span><span class="special">;</span>
255            <span class="identifier">fun1_R_TTT</span> <span class="identifier">efh_R_TTT</span> <span class="special">=</span> <span class="identifier">EFH</span><span class="special">&lt;</span><span class="identifier">TTT</span><span class="special">&gt;(</span><span class="identifier">x</span><span class="special">);</span>
256            <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">function</span><span class="special">&lt;</span><span class="identifier">fun1_R_TTT</span><span class="special">&gt;</span> <span class="identifier">EFH_R_T</span><span class="special">;</span>
257            <span class="identifier">EFH_R_T</span> <span class="identifier">efh_R_T</span><span class="special">(</span><span class="identifier">efh_R_TTT</span><span class="special">);</span>
258            <span class="comment">//std::cout &lt;&lt; "enum_from (" &lt;&lt; x &lt;&lt; ")" &lt;&lt; std::endl;</span>
259            <span class="keyword">return</span> <span class="identifier">efh_R_T</span><span class="special">();</span>
260          <span class="special">}</span>
261      <span class="special">};</span>
262</pre>
263<p>
264        Similar code is used in the related functors
265      </p>
266<pre class="programlisting"><span class="identifier">enum_from_to</span>
267<span class="identifier">filter</span>
268</pre>
269<h3>
270<a name="phoenix.lazy_list.implementation_details.h8"></a>
271        <span class="phrase"><a name="phoenix.lazy_list.implementation_details.conclusion"></a></span><a class="link" href="implementation_details.html#phoenix.lazy_list.implementation_details.conclusion">Conclusion</a>
272      </h3>
273<p>
274        These implementation mechanisms have been carried through consistently in
275        the implementation.
276      </p>
277</div>
278<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
279<td align="left"></td>
280<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010, 2014, 2015 Joel de Guzman, Dan Marsden, Thomas
281      Heller, John Fletcher<p>
282        Distributed under the Boost Software License, Version 1.0. (See accompanying
283        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>)
284      </p>
285</div></td>
286</tr></table>
287<hr>
288<div class="spirit-nav">
289<a accesskey="p" href="exceptions.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../lazy_list.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="testing.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
290</div>
291</body>
292</html>
293