123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- <?xml version="1.0" encoding="utf-8"?>
- <!--
- Copyright 2012 Eric Niebler
- Distributed under the Boost
- Software License, Version 1.0. (See accompanying
- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- -->
- <header name="boost/proto/transform/pass_through.hpp">
- <para>Definition of the
- <computeroutput><classname alt="boost::proto::pass_through">proto::pass_through<></classname></computeroutput>
- transform, which is the default transform of all of the expression generator metafunctions such as
- <computeroutput><classname alt="boost::proto::unary_plus">proto::unary_plus<></classname></computeroutput>,
- <computeroutput><classname alt="boost::proto::plus">proto::plus<></classname></computeroutput> and
- <computeroutput><classname alt="boost::proto::nary_expr">proto::nary_expr<></classname></computeroutput>.</para>
- <namespace name="boost">
- <namespace name="proto">
- <struct name="pass_through">
- <template>
- <template-type-parameter name="Grammar"/>
- <template-type-parameter name="Domain">
- <default><classname>proto::deduce_domain</classname></default>
- </template-type-parameter>
- </template>
- <inherit><type><classname>proto::transform</classname>< pass_through<Grammar, Domain> ></type></inherit>
- <purpose>A <conceptname>PrimitiveTransform</conceptname> that transforms the child expressions of an expression
- node according to the corresponding children of a Grammar. The resulting expression is in the specified domain.</purpose>
- <description>
- <para>
- Given a Grammar such as <computeroutput><classname>proto::plus</classname><T0, T1></computeroutput>,
- an expression type that matches the grammar such as
- <computeroutput><classname>proto::plus</classname><E0, E1>::type</computeroutput>, a state
- <computeroutput>S</computeroutput> and a data <computeroutput>D</computeroutput>, the result of applying
- the <computeroutput>proto::pass_through<<classname>proto::plus</classname><T0, T1> ></computeroutput>
- transform is: <programlisting><classname>proto::plus</classname><
- boost::result_of<T0(E0, S, D)>::type,
- boost::result_of<T1(E1, S, D)>::type
- >::type</programlisting>
- </para>
- <para>
- The above demonstrates how child transforms and child expressions are applied pairwise, and how the
- results are reassembled into a new expression node with the same tag type as the original.
- </para>
- <para>
- The <code>Domain</code> template parameter determines which domain the resulting expression should
- be in. If it is <code><classname>proto::deduce_domain</classname></code>, which is the default,
- the resulting expression is in the same domain as the expression passed in. Otherwise, the resulting
- expression is in the specified domain. Practically, that means the specified domain's generator is
- used to post-process the resulting expression.
- </para>
- <para>
- The explicit use of <computeroutput>proto::pass_through<></computeroutput> is not usually
- needed, since the expression generator metafunctions such as
- <computeroutput><classname>proto::plus</classname><></computeroutput> have
- <computeroutput>proto::pass_through<></computeroutput> as their default transform. So,
- for instance, these are equivalent:
- <itemizedlist>
- <listitem>
- <computeroutput>
- <classname>proto::when</classname>< <classname>proto::plus</classname><X, Y>, proto::pass_through< <classname>proto::plus</classname><X, Y> > >
- </computeroutput>
- </listitem>
- <listitem>
- <computeroutput>
- <classname>proto::when</classname>< <classname>proto::plus</classname><X, Y>, <classname>proto::plus</classname><X, Y> >
- </computeroutput>
- </listitem>
- <listitem>
- <computeroutput>
- <classname>proto::when</classname>< <classname>proto::plus</classname><X, Y> > // because of proto::when<class X, class Y=X>
- </computeroutput>
- </listitem>
- <listitem>
- <computeroutput>
- <classname>proto::plus</classname><X, Y> // because plus<> is both a grammar and a transform
- </computeroutput>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- For example, consider the following transform that promotes all
- <computeroutput>float</computeroutput> terminals in an expression to
- <computeroutput>double</computeroutput>.
- <programlisting>// This transform finds all float terminals in an expression and promotes
- // them to doubles.
- struct Promote :
- <classname>proto::or_</classname><
- <classname>proto::when</classname><<classname>proto::terminal</classname><float>, <classname>proto::terminal</classname><double>::type(<classname>proto::_value</classname>) >,
- // terminal<>'s default transform is a no-op:
- <classname>proto::terminal</classname><<classname>proto::_</classname>>,
- // nary_expr<> has a pass_through<> transform:
- <classname>proto::nary_expr</classname><<classname>proto::_</classname>, <classname>proto::vararg</classname><Promote> >
- >
- {};</programlisting>
- </para>
- </description>
- <struct name="impl">
- <template>
- <template-type-parameter name="Expr"/>
- <template-type-parameter name="State"/>
- <template-type-parameter name="Data"/>
- </template>
- <inherit><type><classname>proto::transform_impl</classname><Expr, State, Data></type></inherit>
- <typedef name="GN">
- <purpose>For each N in [0,Expr arity), for exposition only</purpose>
- <type>typename proto::result_of::child_c<Grammar, N>::type</type>
- </typedef>
- <typedef name="EN">
- <purpose>For each N in [0,Expr arity), for exposition only</purpose>
- <type>typename proto::result_of::child_c<Expr, N>::type</type>
- </typedef>
- <typedef name="RN">
- <purpose>For each N in [0,Expr arity), for exposition only</purpose>
- <type>typename boost::result_of<GN(EN,State,Data)>::type</type>
- </typedef>
- <typedef name="T">
- <purpose>For exposition only</purpose>
- <type>typename Expr::proto_tag</type>
- </typedef>
- <typedef name="Deduce">
- <purpose>For exposition only</purpose>
- <type>boost::is_same<Domain, <classname>deduce_domain</classname>></type>
- </typedef>
- <typedef name="DD">
- <purpose>For exposition only</purpose>
- <type>typename Expr::proto_domain</type>
- </typedef>
- <typedef name="D">
- <purpose>For exposition only</purpose>
- <type>typename mpl::if_<Deduce, DD, Domain>::type</type>
- </typedef>
- <typedef name="G">
- <purpose>For exposition only</purpose>
- <type>typename D::proto_generator</type>
- </typedef>
- <typedef name="A">
- <purpose>For exposition only</purpose>
- <type><classname>proto::listN</classname><R0,...RN></type>
- </typedef>
- <typedef name="E">
- <purpose>For exposition only</purpose>
- <type><classname>proto::expr</classname><T, A></type>
- </typedef>
- <typedef name="BE">
- <purpose>For exposition only</purpose>
- <type><classname>proto::basic_expr</classname><T, A></type>
- </typedef>
- <typedef name="expr_type">
- <purpose>For exposition only</purpose>
- <type>typename mpl::if_<<classname>proto::wants_basic_expr</classname><G>, BE, E>::type</type>
- </typedef>
- <typedef name="result_type">
- <type>typename boost::result_of<D(expr_type)>::type</type>
- </typedef>
- <method-group name="public member functions">
- <method name="operator()" cv="const">
- <type>result_type</type>
- <parameter name="expr">
- <paramtype>typename impl::expr_param</paramtype>
- </parameter>
- <parameter name="state">
- <paramtype>typename impl::state_param</paramtype>
- </parameter>
- <parameter name="data">
- <paramtype>typename impl::data_param</paramtype>
- </parameter>
- <requires>
- <para>
- <computeroutput>
- <classname>proto::matches</classname><Expr, Grammar>::value
- </computeroutput> is <computeroutput>true</computeroutput>.
- </para>
- </requires>
- <returns>
- <para>
- <programlisting>D()(expr_type::make(
- G0()(<functionname>proto::child_c</functionname><0>(expr), state, data),
- ...
- GN()(<functionname>proto::child_c</functionname><N>(expr), state, data)
- ))</programlisting>
- </para>
- </returns>
- </method>
- </method-group>
- </struct>
- </struct>
- </namespace>
- </namespace>
- </header>
|