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<T> 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<T>. 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"><</span><span class="identifier">impl</span><span class="special">::</span><span class="identifier">X</span><span class="special">></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"><</span><span class="keyword">typename</span> <span class="identifier">Sig</span><span class="special">></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"><</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">></span> 101 <span class="keyword">struct</span> <span class="identifier">result</span><span class="special"><</span><span class="identifier">This</span><span class="special">(</span><span class="identifier">A0</span><span class="special">)></span> 102 <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">remove_reference</span><span class="special"><</span><span class="identifier">A0</span><span class="special">></span> 103 <span class="special">{};</span> 104 105 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">></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">&</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"><</span><span class="identifier">impl</span><span class="special">::</span><span class="identifier">Id</span><span class="special">></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"><</span><span class="keyword">typename</span> <span class="identifier">Result</span><span class="special">></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">&</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span> <span class="special">></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"><</span><span class="keyword">int</span><span class="special">>();</span> 148<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">function1</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span><span class="keyword">int</span><span class="special">></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"><</span><span class="identifier">fun1_int_int</span><span class="special">></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"><</span><span class="keyword">typename</span> <span class="identifier">Result</span><span class="special">></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"><</span><span class="keyword">int</span><span class="special">></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"><</span><span class="keyword">int</span><span class="special">></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"><</span><span class="keyword">int</span><span class="special">>();</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"><</span><span class="identifier">fun0_int</span><span class="special">></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"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></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">&</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"><</span><span class="keyword">typename</span> <span class="identifier">Sig</span><span class="special">></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"><</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">></span> 208 <span class="keyword">struct</span> <span class="identifier">result</span><span class="special"><</span><span class="identifier">This</span><span class="special">(</span><span class="identifier">TT</span><span class="special">)></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"><</span><span class="identifier">TT</span><span class="special">>::</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"><</span><span class="identifier">LType</span><span class="special">>::</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"><</span><span class="identifier">EFH</span><span class="special">(</span><span class="identifier">T</span><span class="special">)>::</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"><</span><span class="identifier">T</span><span class="special">>::</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"><</span><span class="identifier">LType</span><span class="special">>::</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"><</span><span class="identifier">result_type</span><span class="special">></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"><</span><span class="identifier">T</span><span class="special">>(</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"><</span><span class="identifier">fun1_R_TTT</span><span class="special">></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">></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"><</span><span class="keyword">typename</span> <span class="identifier">Sig</span><span class="special">></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"><</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">></span> 236 <span class="keyword">struct</span> <span class="identifier">result</span><span class="special"><</span><span class="identifier">This</span><span class="special">(</span><span class="identifier">T</span><span class="special">)></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"><</span><span class="identifier">T</span><span class="special">>::</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"><</span><span class="identifier">TT</span><span class="special">>::</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"><</span><span class="identifier">TTT</span><span class="special">>::</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"><</span><span class="identifier">LType</span><span class="special">>::</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"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> 246 <span class="keyword">typename</span> <span class="identifier">result</span><span class="special"><</span><span class="identifier">Enum_from</span><span class="special">(</span><span class="identifier">T</span><span class="special">)>::</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">&</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"><</span><span class="identifier">T</span><span class="special">>::</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"><</span><span class="identifier">TT</span><span class="special">>::</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"><</span><span class="identifier">T</span><span class="special">>::</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"><</span><span class="identifier">LType</span><span class="special">>::</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"><</span><span class="identifier">result_type</span><span class="special">></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"><</span><span class="identifier">TTT</span><span class="special">>(</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"><</span><span class="identifier">fun1_R_TTT</span><span class="special">></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 << "enum_from (" << x << ")" << 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