123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- <?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/default.hpp">
- <namespace name="boost">
- <namespace name="proto">
- <struct name="_default">
- <template>
- <template-type-parameter name="Grammar">
- <default><replaceable>unspecified</replaceable></default>
- </template-type-parameter>
- </template>
- <inherit><classname>proto::transform</classname>< _default<Grammar> ></inherit>
- <purpose>A <conceptname>PrimitiveTransform</conceptname> that gives expressions their
- usual C++ behavior</purpose>
- <description>
- <para>
- For the complete description of the behavior of the <computeroutput>proto::_default</computeroutput>
- transform, see the documentation for the nested <computeroutput>
- <classname>proto::_default::impl<></classname>
- </computeroutput> class template.
- </para>
- <para>
- When used without specifying a <computeroutput>Grammar</computeroutput> parameter,
- <computeroutput>proto::_default</computeroutput> behaves as if the parameter were
- <computeroutput>proto::_default<></computeroutput>.
- </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="Tag">
- <purpose>For exposition only</purpose>
- <type>typename Expr::tag_type</type>
- </typedef>
- <data-member name="s_expr" specifiers="static">
- <purpose>For exposition only</purpose>
- <type>Expr</type>
- </data-member>
- <data-member name="s_state" specifiers="static">
- <purpose>For exposition only</purpose>
- <type>State</type>
- </data-member>
- <data-member name="s_data" specifiers="static">
- <purpose>For exposition only</purpose>
- <type>Data</type>
- </data-member>
- <typedef name="result_type">
- <type><emphasis>see-below</emphasis></type>
- <description>
- <itemizedlist>
- <listitem>
- <para>
- If <computeroutput>Tag</computeroutput> corresponds to a unary prefix operator,
- then the result type is
- <programlisting>decltype(
- OP Grammar()(<functionname>proto::child</functionname>(s_expr), s_state, s_data)
- )</programlisting>
- </para>
- </listitem>
- <listitem>
- <para>
- If <computeroutput>Tag</computeroutput> corresponds to a unary postfix operator,
- then the result type is
- <programlisting>decltype(
- Grammar()(<functionname>proto::child</functionname>(s_expr), s_state, s_data) OP
- )</programlisting>
- </para>
- </listitem>
- <listitem>
- <para>
- If <computeroutput>Tag</computeroutput> corresponds to a binary infix operator,
- then the result type is
- <programlisting>decltype(
- Grammar()(<functionname>proto::left</functionname>(s_expr), s_state, s_data) OP
- Grammar()(<functionname>proto::right</functionname>(s_expr), s_state, s_data)
- )</programlisting>
- </para>
- </listitem>
- <listitem>
- <para>
- If <computeroutput>Tag</computeroutput> is <computeroutput>
- <classname>proto::tag::subscript</classname>
- </computeroutput>,
- then the result type is
- <programlisting>decltype(
- Grammar()(<functionname>proto::left</functionname>(s_expr), s_state, s_data) [
- Grammar()(<functionname>proto::right</functionname>(s_expr), s_state, s_data) ]
- )</programlisting>
- </para>
- </listitem>
- <listitem>
- <para>
- If <computeroutput>Tag</computeroutput> is <computeroutput>
- <classname>proto::tag::if_else_</classname>
- </computeroutput>,
- then the result type is
- <programlisting>decltype(
- Grammar()(<functionname>proto::child_c</functionname><0>(s_expr), s_state, s_data) ?
- Grammar()(<functionname>proto::child_c</functionname><1>(s_expr), s_state, s_data) :
- Grammar()(<functionname>proto::child_c</functionname><2>(s_expr), s_state, s_data)
- )</programlisting>
- </para>
- </listitem>
- <listitem>
- <para>
- If <computeroutput>Tag</computeroutput> is <computeroutput>
- <classname>proto::tag::function</classname>
- </computeroutput>,
- then the result type is
- <programlisting>decltype(
- Grammar()(<functionname>proto::child_c</functionname><0>(s_expr), s_state, s_data) (
- Grammar()(<functionname>proto::child_c</functionname><1>(s_expr), s_state, s_data),
- ...
- Grammar()(<functionname>proto::child_c</functionname><N>(s_expr), s_state, s_data) )
- )</programlisting>
- </para>
- </listitem>
- </itemizedlist>
- </description>
- </typedef>
- <description>
- <para>
- Let <computeroutput><computeroutput>OP</computeroutput></computeroutput> be the C++ operator
- corresponding to <computeroutput>Expr::proto_tag</computeroutput>. (For example, if
- <computeroutput>Tag</computeroutput> is <computeroutput>
- <classname>proto::tag::plus</classname></computeroutput>, let <computeroutput>
- <computeroutput>OP</computeroutput></computeroutput> be <computeroutput>+</computeroutput>.)
- </para>
- </description>
- <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>
- <description>
- <computeroutput>
- <classname>proto::_default</classname><Grammar>::impl<Expr, State, Data>::operator()
- </computeroutput> returns the following:
- <itemizedlist>
- <listitem>
- <para>
- If <computeroutput>Tag</computeroutput> corresponds to a unary prefix operator,
- then return
- <programlisting>OP Grammar()(<functionname>proto::child</functionname>(expr), state, data)</programlisting>
- </para>
- </listitem>
- <listitem>
- <para>
- If <computeroutput>Tag</computeroutput> corresponds to a unary postfix operator,
- then return
- <programlisting>Grammar()(<functionname>proto::child</functionname>(expr), state, data) OP</programlisting>
- </para>
- </listitem>
- <listitem>
- <para>
- If <computeroutput>Tag</computeroutput> corresponds to a binary infix operator,
- then return
- <programlisting>Grammar()(<functionname>proto::left</functionname>(expr), state, data) OP
- Grammar()(<functionname>proto::right</functionname>(expr), state, data)</programlisting>
- </para>
- </listitem>
- <listitem>
- <para>
- If <computeroutput>Tag</computeroutput> is <computeroutput>
- <classname>proto::tag::subscript</classname>
- </computeroutput>,
- then return
- <programlisting>Grammar()(<functionname>proto::left</functionname>(expr), state, data) [
- Grammar()(<functionname>proto::right</functionname>(expr), state, data) ]</programlisting>
- </para>
- </listitem>
- <listitem>
- <para>
- If <computeroutput>Tag</computeroutput> is <computeroutput>
- <classname>proto::tag::if_else_</classname>
- </computeroutput>,
- then return
- <programlisting>Grammar()(<functionname>proto::child_c</functionname><0>(expr), state, data) ?
- Grammar()(<functionname>proto::child_c</functionname><1>(expr), state, data) :
- Grammar()(<functionname>proto::child_c</functionname><2>(expr), state, data)</programlisting>
- </para>
- </listitem>
- <listitem>
- <para>
- If <computeroutput>Tag</computeroutput> is <computeroutput>
- <classname>proto::tag::function</classname>
- </computeroutput>,
- then return
- <programlisting>Grammar()(<functionname>proto::child_c</functionname><0>(expr), state, data) (
- Grammar()(<functionname>proto::child_c</functionname><1>(expr), state, data),
- ...
- Grammar()(<functionname>proto::child_c</functionname><N>(expr), state, data) )</programlisting>
- </para>
- </listitem>
- </itemizedlist>
- </description>
- </method>
- </method-group>
- <description>
- <para>
- The behavior of this class is specified in terms of the C++0x <computeroutput>decltype</computeroutput>
- keyword. In systems where this keyword is not available, Proto uses the Boost.Typeof library to
- approximate the behavior.
- </para>
- </description>
- </struct>
- </struct>
- </namespace>
- </namespace>
- </header>
|