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/fold.hpp"> 10 <para>Contains definition of the 11 <computeroutput> 12 <classname alt="boost::proto::fold">proto::fold<></classname> 13 </computeroutput> and 14 <computeroutput> 15 <classname alt="boost::proto::reverse_fold">proto::reverse_fold<></classname> 16 </computeroutput> 17 transforms.</para> 18 <namespace name="boost"> 19 <namespace name="proto"> 20 <struct name="fold"> 21 <template> 22 <template-type-parameter name="Sequence"/> 23 <template-type-parameter name="State0"/> 24 <template-type-parameter name="Fun"/> 25 </template> 26 <inherit> 27 <classname>proto::transform</classname>< fold<Sequence, State0, Fun> ></inherit> 28 <purpose>A <conceptname>PrimitiveTransform</conceptname> that invokes the 29 <computeroutput>fusion::fold<></computeroutput> algorithm to accumulate a value.</purpose> 30 <description> 31 <para> 32 For the complete description of the behavior of the <computeroutput>proto::fold<></computeroutput> 33 transform, see the documentation for the nested <computeroutput> 34 <classname>proto::fold::impl<></classname> 35 </computeroutput> class template. 36 </para> 37 </description> 38 <struct name="impl"> 39 <template> 40 <template-type-parameter name="Expr"/> 41 <template-type-parameter name="State"/> 42 <template-type-parameter name="Data"/> 43 </template> 44 <inherit><classname>proto::transform_impl</classname>< Expr, State, Data ></inherit> 45 <typedef name="X"> 46 <purpose>For exposition only</purpose> 47 <type><classname>when</classname><<classname>_</classname>, Sequence></type> 48 </typedef> 49 <typedef name="Y"> 50 <purpose>For exposition only</purpose> 51 <type><classname>when</classname><<classname>_</classname>, State0></type> 52 </typedef> 53 <typedef name="seq"> 54 <purpose>A Fusion sequence, for exposition only</purpose> 55 <type>typename boost::result_of<X(Expr, State, Data)>::type</type> 56 </typedef> 57 <typedef name="state0"> 58 <purpose>An initial state for the fold, for exposition only</purpose> 59 <type>typename boost::result_of<Y(Expr, State, Data)>::type</type> 60 </typedef> 61 <typedef name="fun"> 62 <purpose><computeroutput>fun(d)(s,e) == when<_,Fun>()(e,s,d)</computeroutput></purpose> 63 <type><emphasis>unspecified</emphasis></type> 64 </typedef> 65 <typedef name="result_type"> 66 <type>typename fusion::result_of::fold<seq, state0, fun>::type</type> 67 </typedef> 68 <method-group name="public member functions"> 69 <method name="operator()" cv="const"> 70 <type>result_type</type> 71 <parameter name="expr"> 72 <paramtype>typename impl::expr_param</paramtype> 73 <description> 74 <para>The current expression </para> 75 </description> 76 </parameter> 77 <parameter name="state"> 78 <paramtype>typename impl::state_param</paramtype> 79 <description> 80 <para>The current state </para> 81 </description> 82 </parameter> 83 <parameter name="data"> 84 <paramtype>typename impl::data_param</paramtype> 85 <description> 86 <para>An arbitrary data </para> 87 </description> 88 </parameter> 89 <description> 90 <para> 91 Let <computeroutput>seq</computeroutput> be 92 <computeroutput><classname>when</classname><<classname>_</classname>, Sequence>()(expr, state, data)</computeroutput>, 93 let <computeroutput>state0</computeroutput> be 94 <computeroutput><classname>when</classname><<classname>_</classname>, State0>()(expr, state, data)</computeroutput>, 95 and let <computeroutput>fun(data)</computeroutput> be an object such that 96 <computeroutput>fun(data)(state, expr)</computeroutput> is equivalent to 97 <computeroutput><classname>when</classname><<classname>_</classname>, Fun>()(expr, state, data)</computeroutput>. Then, 98 this function returns <computeroutput>fusion::fold(seq, state0, fun(data))</computeroutput>. 99 </para> 100 </description> 101 </method> 102 </method-group> 103 </struct> 104 </struct> 105 106 <struct name="reverse_fold"> 107 <template> 108 <template-type-parameter name="Sequence"/> 109 <template-type-parameter name="State0"/> 110 <template-type-parameter name="Fun"/> 111 </template> 112 <inherit><classname>proto::fold</classname>< <classname>proto::_reverse</classname>(Sequence), State0, Fun ></inherit> 113 <purpose> 114 A <conceptname>PrimitiveTransform</conceptname> that is the same as the <computeroutput><classname>proto::fold<></classname></computeroutput> 115 transform, except that it folds back-to-front instead of front-to-back. It uses the 116 <computeroutput> 117 <classname>proto::_reverse</classname> 118 </computeroutput> callable <conceptname>PolymorphicFunctionObject</conceptname> to create a 119 <computeroutput>fusion::reverse_view<></computeroutput> of the sequence before invoking 120 <computeroutput>fusion::fold<></computeroutput>. 121 </purpose> 122 </struct> 123 </namespace> 124 </namespace> 125</header> 126