123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489 |
- <?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/make_expr.hpp">
- <para>
- Definition of the <computeroutput><functionname alt="boost::proto::make_expr">proto::make_expr()</functionname>
- </computeroutput> and <computeroutput><functionname alt="boost::proto::unpack_expr">proto::unpack_expr()</functionname>
- </computeroutput> utilities for building Proto expression nodes from child nodes or from a Fusion sequence of child
- nodes, respectively.
- </para>
- <namespace name="boost">
- <namespace name="proto">
- <namespace name="functional">
- <!-- proto::functional::make_expr -->
- <struct name="make_expr">
- <template>
- <template-type-parameter name="Tag"/>
- <template-type-parameter name="Domain">
- <default><classname>proto::deduce_domain</classname></default>
- </template-type-parameter>
- </template>
- <purpose>A <conceptname>PolymorphicFunctionObject</conceptname> equivalent to the <computeroutput>
- <functionname alt="proto::make_expr">proto::make_expr()</functionname></computeroutput> function.</purpose>
- <description>
- <para>
- In all cases, <computeroutput>proto::functional::make_expr<Tag, Domain>()(a...)</computeroutput>
- is equivalent to <computeroutput><functionname>proto::make_expr</functionname><Tag, Domain>(a...)</computeroutput>.
- </para>
- <para>
- <computeroutput>proto::functional::make_expr<Tag>()(a...)</computeroutput> is equivalent to
- <computeroutput><functionname>proto::make_expr</functionname><Tag>(a...)</computeroutput>.
- </para>
- </description>
- <inherit>
- <type><classname>proto::callable</classname></type>
- </inherit>
- <struct-specialization name="result">
- <template>
- <template-type-parameter name="This"/>
- <template-type-parameter name="A" pack="1"/>
- </template>
- <specialization>
- <template-arg>This(A...)</template-arg>
- </specialization>
- <inherit>
- <type>
- <classname>proto::result_of::make_expr</classname>< Tag, Domain, A... ></type>
- </inherit>
- </struct-specialization>
- <method-group name="public member functions">
- <method name="operator()" cv="const">
- <type>typename <classname>proto::result_of::make_expr</classname>< Tag, Domain, A const... >::type const</type>
- <template>
- <template-type-parameter name="A" pack="1"/>
- </template>
- <parameter name="a" pack="1">
- <paramtype>A const &</paramtype>
- </parameter>
- <description>
- <para>
- Construct an expression node with tag type <computeroutput>Tag</computeroutput> and in the
- domain <computeroutput>Domain</computeroutput>.
- </para>
- <para>
- </para>
- </description>
- <returns>
- <para>
- <computeroutput><functionname>proto::make_expr</functionname><Tag, Domain>(a...)</computeroutput>
- </para>
- </returns>
- </method>
- </method-group>
- </struct>
-
- <!-- proto::functional::unpack_expr -->
- <struct name="unpack_expr">
- <template>
- <template-type-parameter name="Tag"/>
- <template-type-parameter name="Domain">
- <default><classname>proto::deduce_domain</classname></default>
- </template-type-parameter>
- </template>
- <purpose>A <conceptname>PolymorphicFunctionObject</conceptname> equivalent to the
- <computeroutput><functionname alt="proto::unpack_expr">proto::unpack_expr()</functionname></computeroutput> function.
- </purpose>
- <description>
- <para>
- In all cases, <computeroutput>proto::functional::unpack_expr<Tag, Domain>()(seq)</computeroutput> is
- equivalent to <computeroutput><functionname alt="proto::unpack_expr">proto::unpack_expr()</functionname><Tag,
- Domain>(seq)</computeroutput>.
- </para>
- <para>
- <computeroutput>proto::functional::unpack_expr<Tag>()(seq)</computeroutput> is equivalent to
- <computeroutput><functionname alt="proto::unpack_expr">proto::unpack_expr()</functionname><Tag>(seq)</computeroutput>.
- </para>
- </description>
- <inherit>
- <type><classname>proto::callable</classname></type>
- </inherit>
- <struct-specialization name="result">
- <template>
- <template-type-parameter name="This"/>
- <template-type-parameter name="Sequence"/>
- </template>
- <specialization>
- <template-arg>This(Sequence)</template-arg>
- </specialization>
- <inherit>
- <type>
- <classname>proto::result_of::unpack_expr</classname><
- Tag,
- Domain,
- typename boost::remove_reference< Sequence >::type
- ></type>
- </inherit>
- </struct-specialization>
- <method-group name="public member functions">
- <method name="operator()" cv="const">
- <type>typename <classname>proto::result_of::unpack_expr</classname>< Tag, Domain, Sequence const >::type const</type>
- <template>
- <template-type-parameter name="Sequence"/>
- </template>
- <parameter name="sequence">
- <paramtype>Sequence const &</paramtype>
- <description>
- <para>A Fusion Forward Sequence </para>
- </description>
- </parameter>
- <description>
- <para>
- Construct an expression node with tag type <computeroutput>Tag</computeroutput> and in the
- domain <computeroutput>Domain</computeroutput>.
- </para>
- </description>
- <returns>
- <para>
- <computeroutput><functionname>proto::unpack_expr</functionname><Tag, Domain>(sequence)</computeroutput>
- </para>
- </returns>
- </method>
- </method-group>
- </struct>
- </namespace>
-
- <namespace name="result_of">
- <!-- proto::result_of::make_expr -->
- <struct name="make_expr">
- <template>
- <template-type-parameter name="Tag"/>
- <template-type-parameter name="A" pack="1"/>
- </template>
- <purpose>Metafunction that computes the return type of the
- <computeroutput><functionname alt="proto::make_expr">proto::make_expr()</functionname></computeroutput>
- function, with a domain deduced from the domains of the children.</purpose>
- <description>
- <para>
- Computes the return type of the
- <computeroutput><functionname alt="proto::make_expr">proto::make_expr()</functionname></computeroutput> function.
- </para>
- <para>
- In this specialization, the domain is deduced from the domains of the child types.
- If <computeroutput><classname>proto::is_domain</classname><A<subscript>0</subscript>>::value</computeroutput>
- is <computeroutput>true</computeroutput>, then another specialization is selected.
- </para>
- </description>
- <typedef name="D">
- <purpose>For exposition only</purpose>
- <type><replaceable>domain-deduced-from-child-types</replaceable></type>
- <description>
- <para>
- In this specialization, Proto uses the domains of the child expressions to compute the
- domain of the parent. See
- <computeroutput><classname>proto::deduce_domain</classname></computeroutput> for a full
- description of the procedure used.
- </para>
- </description>
- </typedef>
- <typedef name="type">
- <type>typename <classname>proto::result_of::make_expr</classname><Tag, D, A...>::type</type>
- </typedef>
- </struct>
- <struct-specialization name="make_expr">
- <template>
- <template-type-parameter name="Tag"/>
- <template-type-parameter name="Domain"/>
- <template-type-parameter name="A" pack="1"/>
- </template>
- <specialization>
- <template-arg>Tag</template-arg>
- <template-arg>Domain</template-arg>
- <template-arg pack="1">A</template-arg>
- </specialization>
- <purpose>Metafunction that computes the return type of the
- <computeroutput><functionname alt="proto::make_expr">proto::make_expr()</functionname></computeroutput>
- function, within the specified domain.</purpose>
- <description>
- <para>
- Computes the return type of the
- <computeroutput><functionname alt="proto::make_expr">proto::make_expr()</functionname></computeroutput>
- function.
- </para>
- </description>
- <typedef name="type">
- <description>
- <para>
- Let <computeroutput><replaceable>WRAP<X></replaceable></computeroutput> be defined such that:
- <itemizedlist>
- <listitem>
- <para>
- If <computeroutput>X</computeroutput> is <computeroutput>Y &</computeroutput>
- or (possibly cv-qualified) <computeroutput>boost::reference_wrapper<Y></computeroutput>,
- then <computeroutput><replaceable>WRAP<X></replaceable></computeroutput> is equivalent to
- <computeroutput><classname>proto::result_of::as_child</classname><Y, Domain></computeroutput>.
- </para>
- </listitem>
- <listitem>
- <para>
- Otherwise, <computeroutput><replaceable>WRAP<X></replaceable></computeroutput> is equivalent to
- <computeroutput><classname>proto::result_of::as_expr</classname><X, Domain></computeroutput>.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- If <computeroutput><classname>proto::wants_basic_expr</classname><typename Domain::proto_generator>::value</computeroutput>
- is true, then let <computeroutput><replaceable>E</replaceable></computeroutput> be
- <computeroutput><classname>proto::basic_expr</classname></computeroutput>; otherwise,
- let <computeroutput><replaceable>E</replaceable></computeroutput> be
- <computeroutput><classname>proto::expr</classname></computeroutput>.
- </para>
- <para>
- If <computeroutput>Tag</computeroutput> is
- <computeroutput><classname>proto::tag::terminal</classname></computeroutput>, then
- <computeroutput>type</computeroutput> is a typedef for
- <computeroutput>typename <replaceable>WRAP<A<subscript>0</subscript>></replaceable>::type</computeroutput>.
- </para>
- <para>
- Otherwise, <computeroutput>type</computeroutput> is a typedef for
- <computeroutput>boost::result_of<Domain(<replaceable>E</replaceable><
- Tag, <classname alt="proto::listN">proto::list<emphasis>N</emphasis></classname><
- typename <replaceable>WRAP<A></replaceable>::type...> >)>::type</computeroutput>
- </para>
- </description>
- <type><emphasis>see-below</emphasis></type>
- </typedef>
- </struct-specialization>
- <!-- proto::result_of::unpack_expr -->
- <struct name="unpack_expr">
- <template>
- <template-type-parameter name="Tag"/>
- <template-type-parameter name="Sequence"/>
- <template-type-parameter name="Void">
- <default><type>void</type></default>
- </template-type-parameter>
- </template>
- <purpose>Metafunction that computes the return type of the
- <computeroutput><functionname alt="proto::unpack_expr">proto::unpack_expr()</functionname></computeroutput>
- function, with a domain deduced from the domains of the children.
- </purpose>
- <description>
- <para>
- Compute the return type of the
- <computeroutput><functionname alt="proto::unpack_expr">proto::unpack_expr()</functionname></computeroutput>
- function.
- </para>
- <para>
- <computeroutput>Sequence</computeroutput> is a Fusion Forward Sequence.
- </para>
- <para>
- In this specialization, the domain is deduced from the domains of the child types.
- If <computeroutput><classname>proto::is_domain</classname><Sequence>::value</computeroutput>
- is <computeroutput>true</computeroutput>, then another specialization is selected.
- </para>
- </description>
- <typedef name="type">
- <purpose>Where S is a Fusion RandomAccessSequence equivalent to Sequence, and N is the size of S.</purpose>
- <type>
- typename <classname>proto::result_of::make_expr</classname><
- Tag,
- typename fusion::result_of::value_at_c<<replaceable>S</replaceable>, 0>::type,
- ...
- typename fusion::result_of::value_at_c<<replaceable>S</replaceable>, <replaceable>N</replaceable>-1>::type
- >::type
- </type>
- </typedef>
- </struct>
- <struct-specialization name="unpack_expr">
- <template>
- <template-type-parameter name="Tag"/>
- <template-type-parameter name="Domain"/>
- <template-type-parameter name="Sequence"/>
- </template>
- <specialization>
- <template-arg>Tag</template-arg>
- <template-arg>Domain</template-arg>
- <template-arg>Sequence</template-arg>
- </specialization>
- <purpose>Metafunction that computes the return type of the
- <computeroutput><functionname alt="proto::unpack_expr">proto::unpack_expr()</functionname></computeroutput>
- function, within the specified domain.
- </purpose>
- <description>
- <para>
- Computes the return type of the
- <computeroutput><functionname alt="proto::unpack_expr">proto::unpack_expr()</functionname></computeroutput>
- function.
- </para>
- </description>
- <typedef name="type">
- <purpose>Where S is a RandomAccessSequence equivalent to Sequence, and N is the size of S.</purpose>
- <type>
- typename <classname>proto::result_of::make_expr</classname><
- Tag,
- Domain,
- typename fusion::result_of::value_at_c<<replaceable>S</replaceable>, 0>::type,
- ...
- typename fusion::result_of::value_at_c<<replaceable>S</replaceable>, <replaceable>N</replaceable>-1>::type
- >::type
- </type>
- </typedef>
- </struct-specialization>
- </namespace>
- <!-- proto::make_expr() -->
- <overloaded-function name="make_expr">
- <signature>
- <type>typename <classname>proto::result_of::make_expr</classname><Tag, A const...>::type const</type>
- <template>
- <template-type-parameter name="Tag"/>
- <template-type-parameter name="A" pack="1"/>
- </template>
- <parameter name="a" pack="1">
- <paramtype>A const &</paramtype>
- </parameter>
- </signature>
- <signature>
- <type>typename <classname>proto::result_of::make_expr</classname><Tag, Domain, A const...>::type const</type>
- <template>
- <template-type-parameter name="Tag"/>
- <template-type-parameter name="Domain"/>
- <template-type-parameter name="A" pack="1"/>
- </template>
- <parameter name="a" pack="1">
- <paramtype>A const &</paramtype>
- </parameter>
- </signature>
- <purpose>Construct an expression of the requested tag type with a domain and with the specified
- arguments as children.</purpose>
- <description>
- <para>
- This function template may be invoked either with or without specifying a
- <computeroutput>Domain</computeroutput> template parameter. If no domain is specified, the domain
- is deduced by examining domains of the given arguments. See
- <computeroutput><classname>proto::deduce_domain</classname></computeroutput> for a full
- description of the procedure used.
- </para>
- <para>
- Let <computeroutput><replaceable>WRAP</replaceable>(x)</computeroutput> be defined such that:
- <itemizedlist>
- <listitem>
- <para>
- If <computeroutput>x</computeroutput> is a <computeroutput>boost::reference_wrapper<></computeroutput>,
- <computeroutput><replaceable>WRAP</replaceable>(x)</computeroutput> is equivalent to
- <computeroutput><functionname>proto::as_child</functionname><Domain>(x.get())</computeroutput>.
- </para>
- </listitem>
- <listitem>
- <para>
- Otherwise, <computeroutput><replaceable>WRAP</replaceable>(x)</computeroutput> is equivalent to
- <computeroutput><functionname>proto::as_expr</functionname><Domain>(x)</computeroutput>.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- If <computeroutput><classname>proto::wants_basic_expr</classname><typename Domain::proto_generator>::value</computeroutput>
- is true, then let <computeroutput><replaceable>E</replaceable></computeroutput> be
- <computeroutput><classname>proto::basic_expr</classname></computeroutput>; otherwise,
- let <computeroutput><replaceable>E</replaceable></computeroutput> be
- <computeroutput><classname>proto::expr</classname></computeroutput>.
- </para>
- <para>
- Let <computeroutput><replaceable>MAKE</replaceable>(Tag, b...)</computeroutput> be defined as
- <computeroutput><replaceable>E</replaceable><Tag,
- <classname alt="proto::listN">proto::list<emphasis>N</emphasis></classname><decltype(b)...> >::make(b...)</computeroutput>.
- </para>
- <para>
- If <computeroutput>Tag</computeroutput> is
- <computeroutput><classname>proto::tag::terminal</classname></computeroutput>, then return
- <computeroutput><replaceable>WRAP</replaceable>(a<subscript>0</subscript>)</computeroutput>.
- </para>
- <para>
- Otherwise, return
- <computeroutput>Domain()(<replaceable>MAKE</replaceable>(Tag, <replaceable>WRAP</replaceable>(a)...))</computeroutput>.
- </para>
- </description>
- </overloaded-function>
- <!-- proto::unpack_expr() -->
- <overloaded-function name="unpack_expr">
- <signature>
- <type>typename <classname>proto::result_of::unpack_expr</classname><Tag, Sequence const>::type const</type>
- <template>
- <template-type-parameter name="Tag"/>
- <template-type-parameter name="Sequence"/>
- </template>
- <parameter name="sequence">
- <paramtype>Sequence const &</paramtype>
- <description>
- <para>A Fusion Forward Sequence.</para>
- </description>
- </parameter>
- </signature>
- <signature>
- <type>typename <classname>proto::result_of::unpack_expr</classname><Tag, Domain, Sequence const>::type const</type>
- <template>
- <template-type-parameter name="Tag"/>
- <template-type-parameter name="Domain"/>
- <template-type-parameter name="Sequence"/>
- </template>
- <parameter name="sequence">
- <paramtype>Sequence const &</paramtype>
- </parameter>
- </signature>
- <purpose>Construct an expression of the requested tag type with a domain and with children
- from the specified Fusion Forward Sequence.</purpose>
- <description>
- <para>
- This function template may be invoked either with or without specifying a
- <computeroutput>Domain</computeroutput> argument. If no domain is specified, the domain
- is deduced by examining domains of each element of the sequence. See
- <computeroutput><classname>proto::deduce_domain</classname></computeroutput> for a full
- description of the procedure used.
- </para>
- <para>
- Let <computeroutput>s</computeroutput> be a Fusion RandomAccessSequence equivalent to
- <computeroutput>sequence</computeroutput>.
- Let <computeroutput><replaceable>WRAP</replaceable>(N, s)</computeroutput> be defined such that:
- <itemizedlist>
- <listitem>
- <para>
- If <computeroutput>fusion::result_of::value_at_c<decltype(s),N>::type</computeroutput> is a reference type
- or an instantiation of <computeroutput>boost::reference_wrapper<></computeroutput>,
- <computeroutput><replaceable>WRAP</replaceable>(N, s)</computeroutput> is equivalent to
- <computeroutput><functionname>proto::as_child</functionname><Domain>(fusion::at_c<N>(s))</computeroutput>.
- </para>
- </listitem>
- <listitem>
- <para>
- Otherwise, <computeroutput><replaceable>WRAP</replaceable>(N, s)</computeroutput> is equivalent to
- <computeroutput><functionname>proto::as_expr</functionname><Domain>(fusion::at_c<N>(s))</computeroutput>.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- If <computeroutput><classname>proto::wants_basic_expr</classname><typename Domain::proto_generator>::value</computeroutput>
- is true, then let <computeroutput><replaceable>E</replaceable></computeroutput> be
- <computeroutput><classname>proto::basic_expr</classname></computeroutput>; otherwise,
- let <computeroutput><replaceable>E</replaceable></computeroutput> be
- <computeroutput><classname>proto::expr</classname></computeroutput>.
- </para>
- <para>
- Let <computeroutput><replaceable>MAKE</replaceable>(Tag, b...)</computeroutput> be defined as
- <computeroutput><replaceable>E</replaceable><Tag,
- <classname alt="proto::listN">proto::list<emphasis>N</emphasis></classname><decltype(b)...> >::make(b...)</computeroutput>.
- </para>
- <para>
- If <computeroutput>Tag</computeroutput> is
- <computeroutput><classname>proto::tag::terminal</classname></computeroutput>, then return
- <computeroutput><replaceable>WRAP</replaceable>(0, s)</computeroutput>.
- </para>
- <para>
- Otherwise, return
- <computeroutput>Domain()(<replaceable>MAKE</replaceable>(Tag, <replaceable>WRAP</replaceable>(0, s),...
- <replaceable>WRAP</replaceable>(<replaceable>N</replaceable>-1, s)))</computeroutput>, where
- <replaceable>N</replaceable> is the size of <computeroutput>Sequence</computeroutput>.
- </para>
- </description>
- </overloaded-function>
- </namespace>
- </namespace>
- </header>
|