1<?xml version="1.0" encoding="utf-8"?> 2<!-- 3 Copyright 2012 Eric Niebler 4 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) 8 --> 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"> 13 <struct name="call"> 14 <template> 15 <template-type-parameter name="T"/> 16 </template> 17 <purpose>Make the given <conceptname>CallableTransform</conceptname> into a <conceptname>PrimitiveTransform</conceptname>.</purpose> 18 19 <description> 20 <para> 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>. 26 </para> 27 28 <para> 29 For the complete description of the behavior of the <computeroutput>proto::call<></computeroutput> 30 transform, see the documentation for the nested 31 <computeroutput> 32 <classname alt="proto::call::impl">proto::call::impl<></classname> 33 </computeroutput> 34 class template. 35 </para> 36 </description> 37 38 <inherit><type><classname>proto::transform</classname>< call<T> ></type></inherit> 39 40 <struct name="impl"> 41 <template> 42 <template-type-parameter name="Expr"/> 43 <template-type-parameter name="State"/> 44 <template-type-parameter name="Data"/> 45 </template> 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> 49 <description> 50 <para> 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>. 55 </para> 56 <para> 57 <computeroutput><classname>proto::call</classname><T>::impl<Expr,State,Data>::result_type</computeroutput> 58 is computed as follows: 59 <itemizedlist> 60 <listitem> 61 <para> 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> 67 </para> 68 </listitem> 69 <listitem> 70 <para> 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, 76 State, 77 Data 78)>::type</programlisting> 79 </para> 80 </listitem> 81 <listitem> 82 <para> 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, 89 Data 90)>::type</programlisting> 91 </para> 92 </listitem> 93 <listitem> 94 <para> 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> 103 </para> 104 </listitem> 105 <listitem> 106 <para> 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, 112 … 113 typename boost::result_of<<classname>when</classname><<classname>_</classname>,A<subscript>n</subscript>>(Expr, State, Data)>::type 114>::type</programlisting> 115 </para> 116 </listitem> 117 <listitem> 118 <para> 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> 126 </para> 127 </listitem> 128 </itemizedlist> 129 </para> 130 </description> 131 </typedef> 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> 137 </parameter> 138 <parameter name="state"> 139 <paramtype>typename impl::state_param</paramtype> 140 </parameter> 141 <parameter name="data"> 142 <paramtype>typename impl::data_param</paramtype> 143 </parameter> 144 <description> 145 <para> 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>. 150 </para> 151 <para> 152 <computeroutput><classname>proto::call</classname><T>::impl<Expr,State,Data>::operator()</computeroutput> behaves as follows: 153 <itemizedlist> 154 <listitem> 155 <para> 156 If <computeroutput>T</computeroutput> if of the form 157 <computeroutput><conceptname>PrimitiveTransform</conceptname></computeroutput> or 158 <computeroutput><conceptname>PrimitiveTransform</conceptname>()</computeroutput>, then 159 return 160 <programlisting>PrimitiveTransform()(expr, state, data)</programlisting> 161 </para> 162 </listitem> 163 <listitem> 164 <para> 165 If <computeroutput>T</computeroutput> is of the form 166 <computeroutput><conceptname>PrimitiveTransform</conceptname>(A<subscript>0</subscript>)</computeroutput>, then 167 return 168 <programlisting>PrimitiveTransform()( 169 <classname>when</classname><<classname>_</classname>,A<subscript>0</subscript>>()(expr, state, data), 170 state, 171 sata 172)</programlisting> 173 </para> 174 </listitem> 175 <listitem> 176 <para> 177 If <computeroutput>T</computeroutput> is of the form 178 <computeroutput><conceptname>PrimitiveTransform</conceptname>(A<subscript>0</subscript>, A<subscript>1</subscript>)</computeroutput>, then 179 return: 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), 183 Data 184)</programlisting> 185 </para> 186 </listitem> 187 <listitem> 188 <para> 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 191 return 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) 196)</programlisting> 197 </para> 198 </listitem> 199 <listitem> 200 <para> 201 If <computeroutput>T</computeroutput> is of the form 202 <computeroutput><conceptname>PolymorphicFunctionObject</conceptname>(A<subscript>0</subscript>,…A<subscript>n</subscript>)</computeroutput>, then 203 return: 204 <programlisting>PolymorphicFunctionObject()( 205 <classname>when</classname><<classname>_</classname>,A<subscript>0</subscript>>()(expr, state, data), 206 ... 207 <classname>when</classname><<classname>_</classname>,A<subscript>n</subscript>>()(expr, state, data) 208)</programlisting> 209 </para> 210 </listitem> 211 <listitem> 212 <para> 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>. 218 Then, return: 219 <programlisting><computeroutput><classname>proto::call</classname><T'>()(expr, state, data)</computeroutput></programlisting> 220 </para> 221 </listitem> 222 </itemizedlist> 223 </para> 224 </description> 225 </method> 226 </method-group> 227 </struct> 228 </struct> 229 </namespace> 230 </namespace> 231</header> 232