1 <?xml version=
"1.0" encoding=
"utf-8"?>
3 Copyright 2012 Eric Niebler
5 Distributed under the Boost
6 Software License, Version 1.0. (See accompanying
7 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 <header name=
"boost/proto/transform/call.hpp">
10 <para>Contains definition of the call
<> transform.
</para>
11 <namespace name=
"boost">
12 <namespace name=
"proto">
15 <template-type-parameter name=
"T"/>
17 <purpose>Make the given
<conceptname>CallableTransform
</conceptname> into a
<conceptname>PrimitiveTransform
</conceptname>.
</purpose>
21 The purpose of
<computeroutput>proto::call
<></computeroutput> is to annotate a transform as callable
22 so that
<computeroutput><classname alt=
"proto::when">proto::when
<></classname></computeroutput> knows
23 how to apply it. The template parameter must be either a
<conceptname>PrimitiveTransform
</conceptname> or a
24 <conceptname>CallableTransform
</conceptname>; that is, a function type for which the return type is a callable
25 <conceptname>PolymorphicFunctionObject
</conceptname>.
29 For the complete description of the behavior of the
<computeroutput>proto::call
<></computeroutput>
30 transform, see the documentation for the nested
32 <classname alt=
"proto::call::impl">proto::call::impl
<></classname>
38 <inherit><type><classname>proto::transform
</classname>< call
<T
> ></type></inherit>
42 <template-type-parameter name=
"Expr"/>
43 <template-type-parameter name=
"State"/>
44 <template-type-parameter name=
"Data"/>
46 <inherit><type><classname>proto::transform_impl
</classname><Expr, State, Data
></type></inherit>
47 <typedef name=
"result_type">
48 <type><replaceable>see-below
</replaceable></type>
51 In the description that follows, a type
<computeroutput>T
</computeroutput> is determined to model the
52 <conceptname>PrimitiveTransform
</conceptname> concept if
53 <computeroutput><classname>proto::is_transform
</classname><T
>::value
</computeroutput> is
54 <computeroutput>true
</computeroutput>.
57 <computeroutput><classname>proto::call
</classname><T
>::impl
<Expr,State,Data
>::result_type
</computeroutput>
58 is computed as follows:
62 If
<computeroutput>T
</computeroutput> if of the form
63 <computeroutput><conceptname>PrimitiveTransform
</conceptname></computeroutput> or
64 <computeroutput><conceptname>PrimitiveTransform
</conceptname>()
</computeroutput>, then
65 <computeroutput>result_type
</computeroutput> is:
66 <programlisting>typename boost::result_of
<PrimitiveTransform(Expr, State, Data)
>::type
</programlisting>
71 If
<computeroutput>T
</computeroutput> is of the form
72 <computeroutput><conceptname>PrimitiveTransform
</conceptname>(A
<subscript>0</subscript>)
</computeroutput>, then
73 <computeroutput>result_type
</computeroutput> is:
74 <programlisting>typename boost::result_of
<PrimitiveTransform(
75 typename boost::result_of
<<classname>when
</classname><<classname>_
</classname>,A
<subscript>0</subscript>>(Expr, State, Data)
>::type,
78 )
>::type
</programlisting>
83 If
<computeroutput>T
</computeroutput> is of the form
84 <computeroutput><conceptname>PrimitiveTransform
</conceptname>(A
<subscript>0</subscript>, A
<subscript>1</subscript>)
</computeroutput>, then
85 <computeroutput>result_type
</computeroutput> is:
86 <programlisting>typename boost::result_of
<PrimitiveTransform(
87 typename boost::result_of
<<classname>when
</classname><<classname>_
</classname>,A
<subscript>0</subscript>>(Expr, State, Data)
>::type,
88 typename boost::result_of
<<classname>when
</classname><<classname>_
</classname>,A
<subscript>1</subscript>>(Expr, State, Data)
>::type,
90 )
>::type
</programlisting>
95 If
<computeroutput>T
</computeroutput> is of the form
96 <computeroutput><conceptname>PrimitiveTransform
</conceptname>(A
<subscript>0</subscript>, A
<subscript>1</subscript>, A
<subscript>2</subscript>)
</computeroutput>, then
97 <computeroutput>result_type
</computeroutput> is:
98 <programlisting>typename boost::result_of
<PrimitiveTransform(
99 typename boost::result_of
<<classname>when
</classname><<classname>_
</classname>,A
<subscript>0</subscript>>(Expr, State, Data)
>::type,
100 typename boost::result_of
<<classname>when
</classname><<classname>_
</classname>,A
<subscript>1</subscript>>(Expr, State, Data)
>::type,
101 typename boost::result_of
<<classname>when
</classname><<classname>_
</classname>,A
<subscript>2</subscript>>(Expr, State, Data)
>::type
102 )
>::type
</programlisting>
107 If
<computeroutput>T
</computeroutput> is of the form
108 <computeroutput><conceptname>PolymorphicFunctionObject
</conceptname>(A
<subscript>0</subscript>,…A
<subscript>n
</subscript>)
</computeroutput>, then
109 <computeroutput>result_type
</computeroutput> is:
110 <programlisting>typename boost::result_of
<PolymorphicFunctionObject(
111 typename boost::result_of
<<classname>when
</classname><<classname>_
</classname>,A
<subscript>0</subscript>>(Expr, State, Data)
>::type,
113 typename boost::result_of
<<classname>when
</classname><<classname>_
</classname>,A
<subscript>n
</subscript>>(Expr, State, Data)
>::type
114 >::type
</programlisting>
119 If
<computeroutput>T
</computeroutput> is of the form
120 <computeroutput><conceptname>PolymorphicFunctionObject
</conceptname>(A
<subscript>0</subscript>,…A
<subscript>n
</subscript> ...)
</computeroutput>, then
121 let
<computeroutput>T
'</computeroutput> be
<computeroutput><conceptname>PolymorphicFunctionObject
</conceptname>(A
<subscript>0</subscript>,…A
<subscript>n-
1</subscript>,
<replaceable>S
</replaceable>)
</computeroutput>,
122 where
<replaceable>S
</replaceable> is a type sequence computed from the unpacking expression
<computeroutput>A
<subscript>n
</subscript></computeroutput>
123 as described in the reference for
<computeroutput><classname>proto::pack
</classname></computeroutput>.
124 Then,
<computeroutput>result_type
</computeroutput> is:
125 <programlisting><computeroutput>typename
<classname>proto::call
</classname><T
'>::impl
<Expr,State,Data
>::result_type
</computeroutput></programlisting>
132 <method-group name=
"public member functions">
133 <method name=
"operator()" cv=
"const">
134 <type>result_type
</type>
135 <parameter name=
"expr">
136 <paramtype>typename impl::expr_param
</paramtype>
138 <parameter name=
"state">
139 <paramtype>typename impl::state_param
</paramtype>
141 <parameter name=
"data">
142 <paramtype>typename impl::data_param
</paramtype>
146 In the description that follows, a type
<computeroutput>T
</computeroutput> is determined to model the
147 <conceptname>PrimitiveTransform
</conceptname> concept if
148 <computeroutput><classname>proto::is_transform
</classname><T
>::value
</computeroutput> is
149 <computeroutput>true
</computeroutput>.
152 <computeroutput><classname>proto::call
</classname><T
>::impl
<Expr,State,Data
>::operator()
</computeroutput> behaves as follows:
156 If
<computeroutput>T
</computeroutput> if of the form
157 <computeroutput><conceptname>PrimitiveTransform
</conceptname></computeroutput> or
158 <computeroutput><conceptname>PrimitiveTransform
</conceptname>()
</computeroutput>, then
160 <programlisting>PrimitiveTransform()(expr, state, data)
</programlisting>
165 If
<computeroutput>T
</computeroutput> is of the form
166 <computeroutput><conceptname>PrimitiveTransform
</conceptname>(A
<subscript>0</subscript>)
</computeroutput>, then
168 <programlisting>PrimitiveTransform()(
169 <classname>when
</classname><<classname>_
</classname>,A
<subscript>0</subscript>>()(expr, state, data),
177 If
<computeroutput>T
</computeroutput> is of the form
178 <computeroutput><conceptname>PrimitiveTransform
</conceptname>(A
<subscript>0</subscript>, A
<subscript>1</subscript>)
</computeroutput>, then
180 <programlisting>PrimitiveTransform()(
181 <classname>when
</classname><<classname>_
</classname>,A
<subscript>0</subscript>>()(expr, state, data),
182 <classname>when
</classname><<classname>_
</classname>,A
<subscript>1</subscript>>()(expr, state, data),
189 If
<computeroutput>T
</computeroutput> is of the form
190 <computeroutput><conceptname>PrimitiveTransform
</conceptname>(A
<subscript>0</subscript>, A
<subscript>1</subscript>, A
<subscript>2</subscript>)
</computeroutput>, then
192 <programlisting>PrimitiveTransform()(
193 <classname>when
</classname><<classname>_
</classname>,A
<subscript>0</subscript>>()(expr, state, data),
194 <classname>when
</classname><<classname>_
</classname>,A
<subscript>1</subscript>>()(expr, state, data),
195 <classname>when
</classname><<classname>_
</classname>,A
<subscript>2</subscript>>()(expr, state, data)
201 If
<computeroutput>T
</computeroutput> is of the form
202 <computeroutput><conceptname>PolymorphicFunctionObject
</conceptname>(A
<subscript>0</subscript>,…A
<subscript>n
</subscript>)
</computeroutput>, then
204 <programlisting>PolymorphicFunctionObject()(
205 <classname>when
</classname><<classname>_
</classname>,A
<subscript>0</subscript>>()(expr, state, data),
207 <classname>when
</classname><<classname>_
</classname>,A
<subscript>n
</subscript>>()(expr, state, data)
213 If
<computeroutput>T
</computeroutput> is of the form
214 <computeroutput><conceptname>PolymorphicFunctionObject
</conceptname>(A
<subscript>0</subscript>,…A
<subscript>n
</subscript> ...)
</computeroutput>, then
215 let
<computeroutput>T
'</computeroutput> be
<computeroutput><conceptname>PolymorphicFunctionObject
</conceptname>(A
<subscript>0</subscript>,…A
<subscript>n-
1</subscript>,
<replaceable>S
</replaceable>)
</computeroutput>,
216 where
<replaceable>S
</replaceable> is a type sequence computed from the unpacking expression
<computeroutput>A
<subscript>n
</subscript></computeroutput>
217 as described in the reference for
<computeroutput><classname>proto::pack
</classname></computeroutput>.
219 <programlisting><computeroutput><classname>proto::call
</classname><T
'>()(expr, state, data)
</computeroutput></programlisting>