blob: 51d6414630558e08dce16fb0c1e6ef180dc68d00 [file] [log] [blame]
<?xml version="1.0" encoding="utf-8"?>
<header name="boost/proto/repeat.hpp">
<para>
Contains macros to ease the generation of repetitious code constructs.
</para>
<macro name="BOOST_PROTO_REPEAT" kind="functionlike">
<macro-parameter name="MACRO"/>
<purpose>Repeatedly invoke the specified macro.</purpose>
<description>
<para>
<computeroutput>BOOST_PROTO_REPEAT()</computeroutput> is used to generate the kind of repetitive
code that is typical of DSELs built with Proto.
<computeroutput>BOOST_PROTO_REPEAT(<replaceable>MACRO</replaceable>)</computeroutput>
is equivalent to:
</para>
<para>
<programlisting><replaceable>MACRO</replaceable>(1, <macroname>BOOST_PROTO_typename_A</macroname>, <macroname>BOOST_PROTO_A_const_ref</macroname>, <macroname>BOOST_PROTO_A_const_ref_a</macroname>, <macroname>BOOST_PROTO_ref_a</macroname>)
<replaceable>MACRO</replaceable>(2, <macroname>BOOST_PROTO_typename_A</macroname>, <macroname>BOOST_PROTO_A_const_ref</macroname>, <macroname>BOOST_PROTO_A_const_ref_a</macroname>, <macroname>BOOST_PROTO_ref_a</macroname>)
...
<replaceable>MACRO</replaceable>(<macroname>BOOST_PROTO_MAX_ARITY</macroname>, <macroname>BOOST_PROTO_typename_A</macroname>, <macroname>BOOST_PROTO_A_const_ref</macroname>, <macroname>BOOST_PROTO_A_const_ref_a</macroname>, <macroname>BOOST_PROTO_ref_a</macroname>)</programlisting>
</para>
<para>
<emphasis role="bold">Example:</emphasis>
</para>
<para>
See <computeroutput><macroname>BOOST_PROTO_REPEAT_FROM_TO</macroname>()</computeroutput>.
</para>
</description>
</macro>
<macro name="BOOST_PROTO_REPEAT_FROM_TO" kind="functionlike">
<macro-parameter name="FROM"/>
<macro-parameter name="TO"/>
<macro-parameter name="MACRO"/>
<purpose>Repeatedly invoke the specified macro.</purpose>
<description>
<para>
<computeroutput>BOOST_PROTO_REPEAT_FROM_TO()</computeroutput> is used to generate the kind of repetitive
code that is typical of DSELs built with Proto.
<computeroutput>BOOST_PROTO_REPEAT_FROM_TO(<replaceable>FROM</replaceable>, <replaceable>TO</replaceable>, <replaceable>MACRO</replaceable>)</computeroutput>
is equivalent to:
</para>
<para>
<programlisting><replaceable>MACRO</replaceable>(<replaceable>FROM</replaceable>, <macroname>BOOST_PROTO_typename_A</macroname>, <macroname>BOOST_PROTO_A_const_ref</macroname>, <macroname>BOOST_PROTO_A_const_ref_a</macroname>, <macroname>BOOST_PROTO_ref_a</macroname>)
<replaceable>MACRO</replaceable>(<replaceable>FROM+1</replaceable>, <macroname>BOOST_PROTO_typename_A</macroname>, <macroname>BOOST_PROTO_A_const_ref</macroname>, <macroname>BOOST_PROTO_A_const_ref_a</macroname>, <macroname>BOOST_PROTO_ref_a</macroname>)
...
<replaceable>MACRO</replaceable>(<replaceable>TO-1</replaceable>, <macroname>BOOST_PROTO_typename_A</macroname>, <macroname>BOOST_PROTO_A_const_ref</macroname>, <macroname>BOOST_PROTO_A_const_ref_a</macroname>, <macroname>BOOST_PROTO_ref_a</macroname>)</programlisting>
</para>
<para>
<emphasis role="bold">Example:</emphasis>
</para>
<para>
<programlisting>// Generate BOOST_PROTO_MAX_ARITY-1 overloads of the
// following construct() function template.
#define M0(N, typename_A, A_const_ref, A_const_ref_a, ref_a) \
template&lt;typename T, typename_A(N)&gt; \
typename <classname alt="boost::proto::result_of::make_expr">proto::result_of::make_expr</classname>&lt; \
<classname alt="boost::proto::tag::function">proto::tag::function</classname> \
, construct_helper&lt;T&gt; \
, A_const_ref(N) \
>::type const \
construct(A_const_ref_a(N)) \
{ \
return <functionname alt="boost::proto::make_expr">proto::make_expr</functionname>&lt; \
<classname alt="boost::proto::tag::function">proto::tag::function</classname> \
&gt;( \
construct_helper&lt;T&gt;() \
, ref_a(N) \
); \
}
BOOST_PROTO_REPEAT_FROM_TO(1, BOOST_PROTO_MAX_ARITY, M0)
#undef M0</programlisting>
</para>
<para>
The above invocation of <computeroutput>BOOST_PROTO_REPEAT_FROM_TO()</computeroutput>
will generate the following code:
</para>
<para>
<programlisting>template&lt;typename T, typename A0&gt;
typename <classname alt="boost::proto::result_of::make_expr">proto::result_of::make_expr</classname>&lt;
<classname alt="boost::proto::tag::function">proto::tag::function</classname>
, construct_helper&lt;T&gt;
, A0 const &amp;
&gt;::type const
construct(A0 const &amp; a0)
{
return <functionname alt="boost::proto::make_expr">proto::make_expr</functionname>&lt;
<classname alt="boost::proto::tag::function">proto::tag::function</classname>
&gt;(
construct_helper&lt;T&gt;()
, boost::ref(a0)
);
}
template&lt;typename T, typename A0, typename A1&gt;
typename <classname alt="boost::proto::result_of::make_expr">proto::result_of::make_expr</classname>&lt;
<classname alt="boost::proto::tag::function">proto::tag::function</classname>
, construct_helper&lt;T&gt;
, A0 const &amp;
, A1 const &amp;
&gt;::type const
construct(A0 const &amp; a0, A1 const &amp; a1)
{
return <functionname alt="boost::proto::make_expr">proto::make_expr</functionname>&lt;
<classname alt="boost::proto::tag::function">proto::tag::function</classname>
&gt;(
construct_helper&lt;T&gt;()
, boost::ref(a0)
, boost::ref(a1)
);
}
// ... and so on, up to BOOST_PROTO_MAX_ARITY-1 arguments ...</programlisting>
</para>
</description>
</macro>
<macro name="BOOST_PROTO_REPEAT_EX" kind="functionlike">
<macro-parameter name="MACRO"/>
<macro-parameter name="typename_A"/>
<macro-parameter name="A"/>
<macro-parameter name="A_a"/>
<macro-parameter name="a"/>
<purpose>Repeatedly invoke the specified macro.</purpose>
<description>
<para>
<computeroutput>BOOST_PROTO_REPEAT_EX()</computeroutput> is used to generate the kind of repetitive
code that is typical of DSELs built with Proto.
<computeroutput>BOOST_PROTO_REPEAT_EX(<replaceable>MACRO</replaceable>, <replaceable>typename_A</replaceable>, <replaceable>A</replaceable>, <replaceable>A_a</replaceable>, <replaceable>a</replaceable>)</computeroutput>
is equivalent to:
</para>
<para>
<programlisting><replaceable>MACRO</replaceable>(1, typename_A, A, A_a, a)
<replaceable>MACRO</replaceable>(2, typename_A, A, A_a, a)
...
<replaceable>MACRO</replaceable>(<macroname>BOOST_PROTO_MAX_ARITY</macroname>, typename_A, A, A_a, a)</programlisting>
</para>
<para>
<emphasis role="bold">Example:</emphasis>
</para>
<para>
See <computeroutput><macroname>BOOST_PROTO_REPEAT_FROM_TO</macroname>()</computeroutput>.
</para>
</description>
</macro>
<macro name="BOOST_PROTO_REPEAT_FROM_TO_EX" kind="functionlike">
<macro-parameter name="FROM"/>
<macro-parameter name="TO"/>
<macro-parameter name="MACRO"/>
<macro-parameter name="typename_A"/>
<macro-parameter name="A"/>
<macro-parameter name="A_a"/>
<macro-parameter name="a"/>
<purpose>Repeatedly invoke the specified macro.</purpose>
<description>
<para>
<computeroutput>BOOST_PROTO_REPEAT_FROM_TO_EX()</computeroutput> is used to generate the kind of repetitive
code that is typical of DSELs built with Proto.
<computeroutput>BOOST_PROTO_REPEAT_FROM_TO_EX(<replaceable>FROM</replaceable>, <replaceable>TO</replaceable>, <replaceable>MACRO</replaceable>, <replaceable>typename_A</replaceable>, <replaceable>A</replaceable>, <replaceable>A_a</replaceable>, <replaceable>a</replaceable>)</computeroutput>
is equivalent to:
</para>
<para>
<programlisting><replaceable>MACRO</replaceable>(<replaceable>FROM</replaceable>, typename_A, A, A_a, a)
<replaceable>MACRO</replaceable>(<replaceable>FROM+1</replaceable>, typename_A, A, A_a, a)
...
<replaceable>MACRO</replaceable>(<replaceable>TO-1</replaceable>, typename_A, A, A_a, a)</programlisting>
</para>
<para>
<emphasis role="bold">Example:</emphasis>
</para>
<para>
See <computeroutput><macroname>BOOST_PROTO_REPEAT_FROM_TO</macroname>()</computeroutput>.
</para>
</description>
</macro>
<macro name="BOOST_PROTO_LOCAL_ITERATE" kind="functionlike">
<purpose>Vertical repetition of a user-supplied macro.</purpose>
<description>
<para>
<computeroutput>BOOST_PROTO_LOCAL_ITERATE()</computeroutput> is used generate the kind of repetitive code that is typical
of DSELs built with Proto. This macro causes the user-defined macro <computeroutput>BOOST_PROTO_LOCAL_MACRO()</computeroutput> to
be expanded with values in the range specified by <computeroutput>BOOST_PROTO_LOCAL_LIMITS</computeroutput>.
</para>
<para>
<emphasis role="bold">Usage:</emphasis>
</para>
<para>
<programlisting>#include BOOST_PROTO_LOCAL_ITERATE()</programlisting>
</para>
<para>
<emphasis role="bold">Example:</emphasis>
</para>
<para>
<programlisting>// Generate BOOST_PROTO_MAX_ARITY-1 overloads of the
// following construct() function template.
#define BOOST_PROTO_LOCAL_MACRO(N, typename_A, A_const_ref, A_const_ref_a, ref_a)\
template&lt;typename T, typename_A(N)&gt; \
typename <classname alt="boost::proto::result_of::make_expr">proto::result_of::make_expr</classname>&lt; \
<classname alt="boost::proto::tag::function">proto::tag::function</classname> \
, construct_helper&lt;T&gt; \
, A_const_ref(N) \
>::type const \
construct(A_const_ref_a(N)) \
{ \
return <functionname alt="boost::proto::make_expr">proto::make_expr</functionname>&lt; \
<classname alt="boost::proto::tag::function">proto::tag::function</classname> \
&gt;( \
construct_helper&lt;T&gt;() \
, ref_a(N) \
); \
}
#define BOOST_PROTO_LOCAL_LIMITS (1, BOOST_PP_DEC(BOOST_PROTO_MAX_ARITY))
#include BOOST_PROTO_LOCAL_ITERATE()</programlisting>
</para>
<para>
The above inclusion of <computeroutput>BOOST_PROTO_LOCAL_ITERATE()</computeroutput>
will generate the following code:
</para>
<para>
<programlisting>template&lt;typename T, typename A0&gt;
typename <classname alt="boost::proto::result_of::make_expr">proto::result_of::make_expr</classname>&lt;
<classname alt="boost::proto::tag::function">proto::tag::function</classname>
, construct_helper&lt;T&gt;
, A0 const &amp;
&gt;::type const
construct(A0 const &amp; a0)
{
return <functionname alt="boost::proto::make_expr">proto::make_expr</functionname>&lt;
<classname alt="boost::proto::tag::function">proto::tag::function</classname>
&gt;(
construct_helper&lt;T&gt;()
, boost::ref(a0)
);
}
template&lt;typename T, typename A0, typename A1&gt;
typename <classname alt="boost::proto::result_of::make_expr">proto::result_of::make_expr</classname>&lt;
<classname alt="boost::proto::tag::function">proto::tag::function</classname>
, construct_helper&lt;T&gt;
, A0 const &amp;
, A1 const &amp;
&gt;::type const
construct(A0 const &amp; a0, A1 const &amp; a1)
{
return <functionname alt="boost::proto::make_expr">proto::make_expr</functionname>&lt;
<classname alt="boost::proto::tag::function">proto::tag::function</classname>
&gt;(
construct_helper&lt;T&gt;()
, boost::ref(a0)
, boost::ref(a1)
);
}
// ... and so on, up to BOOST_PROTO_MAX_ARITY-1 arguments ...</programlisting>
</para>
<para>
If <computeroutput>BOOST_PROTO_LOCAL_LIMITS</computeroutput> is not defined by the user, it defaults
to <computeroutput>(1, BOOST_PROTO_MAX_ARITY)</computeroutput>.
</para>
<para>
At each iteration, <computeroutput>BOOST_PROTO_LOCAL_MACRO()</computeroutput> is invoked with the current
iteration number and the following 4 macro parameters:
<itemizedlist>
<listitem><computeroutput>BOOST_PROTO_LOCAL_typename_A</computeroutput></listitem>
<listitem><computeroutput>BOOST_PROTO_LOCAL_A</computeroutput></listitem>
<listitem><computeroutput>BOOST_PROTO_LOCAL_A_a</computeroutput></listitem>
<listitem><computeroutput>BOOST_PROTO_LOCAL_a</computeroutput></listitem>
</itemizedlist>
If these macros are not defined by the user, they default respectively to:
<itemizedlist>
<listitem><computeroutput><macroname>BOOST_PROTO_typename_A</macroname></computeroutput></listitem>
<listitem><computeroutput><macroname>BOOST_PROTO_A_const_ref</macroname></computeroutput></listitem>
<listitem><computeroutput><macroname>BOOST_PROTO_A_const_ref_a</macroname></computeroutput></listitem>
<listitem><computeroutput><macroname>BOOST_PROTO_ref_a</macroname></computeroutput></listitem>
</itemizedlist>
</para>
<para>
After including <computeroutput>BOOST_PROTO_LOCAL_ITERATE()</computeroutput>, the
following macros are automatically undefined:
<itemizedlist>
<listitem><computeroutput>BOOST_PROTO_LOCAL_MACRO</computeroutput></listitem>
<listitem><computeroutput>BOOST_PROTO_LOCAL_LIMITS</computeroutput></listitem>
<listitem><computeroutput>BOOST_PROTO_LOCAL_typename_A</computeroutput></listitem>
<listitem><computeroutput>BOOST_PROTO_LOCAL_A</computeroutput></listitem>
<listitem><computeroutput>BOOST_PROTO_LOCAL_A_a</computeroutput></listitem>
<listitem><computeroutput>BOOST_PROTO_LOCAL_a</computeroutput></listitem>
</itemizedlist>
</para>
</description>
</macro>
<macro name="BOOST_PROTO_typename_A" kind="functionlike">
<macro-parameter name="N"/>
<purpose>
Generates sequences like
<computeroutput>
typename A<subscript>0</subscript>,
typename A<subscript>1</subscript>, ...
typename A<subscript>N-1</subscript>
</computeroutput>.
</purpose>
<description>
<para>
Intended for use with the <computeroutput><macroname>BOOST_PROTO_REPEAT</macroname>()</computeroutput>
and <computeroutput><macroname>BOOST_PROTO_LOCAL_ITERATE</macroname>()</computeroutput> macros.
</para>
<para>
<computeroutput>BOOST_PROTO_typename_A(<replaceable>N</replaceable>)</computeroutput> generates sequences like:
</para>
<para>
<programlisting>typename A<subscript>0</subscript>, typename A<subscript>1</subscript>, ... typename A<subscript>N-1</subscript></programlisting>
</para>
</description>
</macro>
<macro name="BOOST_PROTO_A_const_ref" kind="functionlike">
<macro-parameter name="N"/>
<purpose>
Generates sequences like
<computeroutput>
A<subscript>0</subscript> const &amp;,
A<subscript>1</subscript> const &amp;, ...
A<subscript>N-1</subscript> const &amp;
</computeroutput>.
</purpose>
<description>
<para>
Intended for use with the <computeroutput><macroname>BOOST_PROTO_REPEAT</macroname>()</computeroutput>
and <computeroutput><macroname>BOOST_PROTO_LOCAL_ITERATE</macroname>()</computeroutput> macros.
</para>
<para>
<computeroutput>BOOST_PROTO_A_const_ref(<replaceable>N</replaceable>)</computeroutput> generates sequences like:
</para>
<para>
<programlisting>A<subscript>0</subscript> const &amp;, A<subscript>1</subscript> const &amp;, ... A<subscript>N-1</subscript> const &amp;</programlisting>
</para>
</description>
</macro>
<macro name="BOOST_PROTO_A_ref" kind="functionlike">
<macro-parameter name="N"/>
<purpose>
Generates sequences like
<computeroutput>
A<subscript>0</subscript> &amp;,
A<subscript>1</subscript> &amp;, ...
A<subscript>N-1</subscript> &amp;
</computeroutput>.
</purpose>
<description>
<para>
Intended for use with the <computeroutput><macroname>BOOST_PROTO_REPEAT</macroname>()</computeroutput>
and <computeroutput><macroname>BOOST_PROTO_LOCAL_ITERATE</macroname>()</computeroutput> macros.
</para>
<para>
<computeroutput>BOOST_PROTO_A_ref(<replaceable>N</replaceable>)</computeroutput> generates sequences like:
</para>
<para>
<programlisting>A<subscript>0</subscript> &amp;, A<subscript>1</subscript> &amp;, ... A<subscript>N-1</subscript> &amp;</programlisting>
</para>
</description>
</macro>
<macro name="BOOST_PROTO_A" kind="functionlike">
<macro-parameter name="N"/>
<purpose>
Generates sequences like
<computeroutput>
A<subscript>0</subscript>,
A<subscript>1</subscript>, ...
A<subscript>N-1</subscript>
</computeroutput>.
</purpose>
<description>
<para>
Intended for use with the <computeroutput><macroname>BOOST_PROTO_REPEAT</macroname>()</computeroutput>
and <computeroutput><macroname>BOOST_PROTO_LOCAL_ITERATE</macroname>()</computeroutput> macros.
</para>
<para>
<computeroutput>BOOST_PROTO_A(<replaceable>N</replaceable>)</computeroutput> generates sequences like:
</para>
<para>
<programlisting>A<subscript>0</subscript>, A<subscript>1</subscript>, ... A<subscript>N-1</subscript></programlisting>
</para>
</description>
</macro>
<macro name="BOOST_PROTO_A_const" kind="functionlike">
<macro-parameter name="N"/>
<purpose>
Generates sequences like
<computeroutput>
A<subscript>0</subscript> const,
A<subscript>1</subscript> const, ...
A<subscript>N-1</subscript> const
</computeroutput>.
</purpose>
<description>
<para>
Intended for use with the <computeroutput><macroname>BOOST_PROTO_REPEAT</macroname>()</computeroutput>
and <computeroutput><macroname>BOOST_PROTO_LOCAL_ITERATE</macroname>()</computeroutput> macros.
</para>
<para>
<computeroutput>BOOST_PROTO_A_const(<replaceable>N</replaceable>)</computeroutput> generates sequences like:
</para>
<para>
<programlisting>A<subscript>0</subscript> const, A<subscript>1</subscript> const, ... A<subscript>N-1</subscript> const</programlisting>
</para>
</description>
</macro>
<macro name="BOOST_PROTO_A_const_ref_a" kind="functionlike">
<macro-parameter name="N"/>
<purpose>
Generates sequences like
<computeroutput>
A<subscript>0</subscript> const &amp; a<subscript>0</subscript>,
A<subscript>1</subscript> const &amp; a<subscript>1</subscript>, ...
A<subscript>N-1</subscript> const &amp; a<subscript>N-1</subscript>
</computeroutput>.
</purpose>
<description>
<para>
Intended for use with the <computeroutput><macroname>BOOST_PROTO_REPEAT</macroname>()</computeroutput>
and <computeroutput><macroname>BOOST_PROTO_LOCAL_ITERATE</macroname>()</computeroutput> macros.
</para>
<para>
<computeroutput>BOOST_PROTO_A_const_ref_a(<replaceable>N</replaceable>)</computeroutput> generates sequences like:
</para>
<para>
<programlisting>A<subscript>0</subscript> const &amp; a<subscript>0</subscript>, A<subscript>1</subscript> const &amp; a<subscript>1</subscript>, ... A<subscript>N-1</subscript> const &amp; a<subscript>N-1</subscript></programlisting>
</para>
</description>
</macro>
<macro name="BOOST_PROTO_A_ref_a" kind="functionlike">
<macro-parameter name="N"/>
<purpose>
Generates sequences like
<computeroutput>
A<subscript>0</subscript> &amp; a<subscript>0</subscript>,
A<subscript>1</subscript> &amp; a<subscript>1</subscript>, ...
A<subscript>N-1</subscript> &amp; a<subscript>N-1</subscript>
</computeroutput>.
</purpose>
<description>
<para>
Intended for use with the <computeroutput><macroname>BOOST_PROTO_REPEAT</macroname>()</computeroutput>
and <computeroutput><macroname>BOOST_PROTO_LOCAL_ITERATE</macroname>()</computeroutput> macros.
</para>
<para>
<computeroutput>BOOST_PROTO_A_ref_a(<replaceable>N</replaceable>)</computeroutput> generates sequences like:
</para>
<para>
<programlisting>A<subscript>0</subscript> &amp; a<subscript>0</subscript>, A<subscript>1</subscript> &amp; a<subscript>1</subscript>, ... A<subscript>N-1</subscript> &amp; a<subscript>N-1</subscript></programlisting>
</para>
</description>
</macro>
<macro name="BOOST_PROTO_ref_a" kind="functionlike">
<macro-parameter name="N"/>
<purpose>
Generates sequences like
<computeroutput>
boost::ref(a<subscript>0</subscript>),
boost::ref(a<subscript>1</subscript>), ...
boost::ref(a<subscript>N-1</subscript>)
</computeroutput>.
</purpose>
<description>
<para>
Intended for use with the <computeroutput><macroname>BOOST_PROTO_REPEAT</macroname>()</computeroutput>
and <computeroutput><macroname>BOOST_PROTO_LOCAL_ITERATE</macroname>()</computeroutput> macros.
</para>
<para>
<computeroutput>BOOST_PROTO_ref_a(<replaceable>N</replaceable>)</computeroutput> generates sequences like:
</para>
<para>
<programlisting>boost::ref(a<subscript>0</subscript>), boost::ref(a<subscript>1</subscript>), ... boost::ref(a<subscript>N-1</subscript>)</programlisting>
</para>
</description>
</macro>
<macro name="BOOST_PROTO_a" kind="functionlike">
<macro-parameter name="N"/>
<purpose>
Generates sequences like
<computeroutput>
a<subscript>0</subscript>,
a<subscript>1</subscript>, ...
a<subscript>N-1</subscript>
</computeroutput>.
</purpose>
<description>
<para>
Intended for use with the <computeroutput><macroname>BOOST_PROTO_REPEAT</macroname>()</computeroutput>
and <computeroutput><macroname>BOOST_PROTO_LOCAL_ITERATE</macroname>()</computeroutput> macros.
</para>
<para>
<computeroutput>BOOST_PROTO_a(<replaceable>N</replaceable>)</computeroutput> generates sequences like:
</para>
<para>
<programlisting>a<subscript>0</subscript>, a<subscript>1</subscript>, ... a<subscript>N-1</subscript></programlisting>
</para>
</description>
</macro>
</header>