3 <meta http-equiv=
"Content-Type" content=
"text/html; charset=US-ASCII">
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.75.2">
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">
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>
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>
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
29 </h3></div></div></div>
31 <a name=
"phoenix.lazy_list.implementation_details.h0"></a>
32 <span><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>
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.
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
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
>.
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.
57 <a name=
"phoenix.lazy_list.implementation_details.h1"></a>
58 <span><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>
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
68 <a name=
"phoenix.lazy_list.implementation_details.h2"></a>
69 <span><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
73 Functions are implemented as a struct within namespace impl. For an example
74 funcion 'x' the type is defined like this:
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>
80 This alternative will work to provide a function 'x' but it is not then possible
81 to pass it as an argument.
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>
86 <a name=
"phoenix.lazy_list.implementation_details.h3"></a>
87 <span><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
91 This example implements id() which simply returns its argument:
93 <pre class=
"programlisting"><span class=
"keyword">namespace
</span> <span class=
"identifier">impl
</span> <span class=
"special">{
</span>
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>
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>
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>
111 <span class=
"special">};
</span>
113 <span class=
"special">}
</span>
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>
119 <a name=
"phoenix.lazy_list.implementation_details.h4"></a>
120 <span><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>
124 Sometimes it is necessary to define a function using a templated struct,
125 where the template parameter type defines the return type.
128 <a name=
"phoenix.lazy_list.implementation_details.h5"></a>
129 <span><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>
132 <pre class=
"programlisting"><span class=
"keyword">namespace
</span> <span class=
"identifier">impl
</span> <span class=
"special">{
</span>
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>
137 <span class=
"keyword">typedef
</span> <span class=
"identifier">Result
</span> <span class=
"identifier">result_type
</span><span class=
"special">;
</span>
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>
145 <span class=
"special">}
</span>
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>
153 <a name=
"phoenix.lazy_list.implementation_details.h6"></a>
154 <span><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>
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>
161 <span class=
"keyword">typedef
</span> <span class=
"identifier">Result
</span> <span class=
"identifier">result_type
</span><span class=
"special">;
</span>
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>
168 <span class=
"special">};
</span>
169 <span class=
"special">}
</span>
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>
177 <a name=
"phoenix.lazy_list.implementation_details.h7"></a>
178 <span><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>
182 The implementation of the function
184 <pre class=
"programlisting"><span class=
"identifier">enum_from
</span><span class=
"special">(
</span><span class=
"number">1</span><span class=
"special">)
</span>
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.
192 This code has to carefully manipulate the input type T to construct the result
193 type which is a list.
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.
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>
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>
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>
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>
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>
264 Similar code is used in the related functors
266 <pre class=
"programlisting"><span class=
"identifier">enum_from_to
</span>
267 <span class=
"identifier">filter
</span>
270 <a name=
"phoenix.lazy_list.implementation_details.h8"></a>
271 <span><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>
274 These implementation mechanisms have been carried through consistently in
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>)
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>