xref: /trunk/main/autodoc/inc/cosv/tpl/funcall.hxx (revision 914d351e5f5b84e4342a86d6ab8d4aca7308b9bd)
1*11c03c6dSDamjan Jovanovic /**************************************************************
2*11c03c6dSDamjan Jovanovic  *
3*11c03c6dSDamjan Jovanovic  * Licensed to the Apache Software Foundation (ASF) under one
4*11c03c6dSDamjan Jovanovic  * or more contributor license agreements.  See the NOTICE file
5*11c03c6dSDamjan Jovanovic  * distributed with this work for additional information
6*11c03c6dSDamjan Jovanovic  * regarding copyright ownership.  The ASF licenses this file
7*11c03c6dSDamjan Jovanovic  * to you under the Apache License, Version 2.0 (the
8*11c03c6dSDamjan Jovanovic  * "License"); you may not use this file except in compliance
9*11c03c6dSDamjan Jovanovic  * with the License.  You may obtain a copy of the License at
10*11c03c6dSDamjan Jovanovic  *
11*11c03c6dSDamjan Jovanovic  *   http://www.apache.org/licenses/LICENSE-2.0
12*11c03c6dSDamjan Jovanovic  *
13*11c03c6dSDamjan Jovanovic  * Unless required by applicable law or agreed to in writing,
14*11c03c6dSDamjan Jovanovic  * software distributed under the License is distributed on an
15*11c03c6dSDamjan Jovanovic  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*11c03c6dSDamjan Jovanovic  * KIND, either express or implied.  See the License for the
17*11c03c6dSDamjan Jovanovic  * specific language governing permissions and limitations
18*11c03c6dSDamjan Jovanovic  * under the License.
19*11c03c6dSDamjan Jovanovic  *
20*11c03c6dSDamjan Jovanovic  *************************************************************/
21*11c03c6dSDamjan Jovanovic 
22*11c03c6dSDamjan Jovanovic 
23*11c03c6dSDamjan Jovanovic 
24*11c03c6dSDamjan Jovanovic #ifndef CSV_TPL_FUNCALL_HXX
25*11c03c6dSDamjan Jovanovic #define CSV_TPL_FUNCALL_HXX
26*11c03c6dSDamjan Jovanovic 
27*11c03c6dSDamjan Jovanovic // BASE CLASSES
28*11c03c6dSDamjan Jovanovic #include <algorithm>
29*11c03c6dSDamjan Jovanovic 
30*11c03c6dSDamjan Jovanovic 
31*11c03c6dSDamjan Jovanovic 
32*11c03c6dSDamjan Jovanovic 
33*11c03c6dSDamjan Jovanovic namespace csv
34*11c03c6dSDamjan Jovanovic {
35*11c03c6dSDamjan Jovanovic namespace func
36*11c03c6dSDamjan Jovanovic {
37*11c03c6dSDamjan Jovanovic 
38*11c03c6dSDamjan Jovanovic 
39*11c03c6dSDamjan Jovanovic /** @concept "csv:: Function Objects"
40*11c03c6dSDamjan Jovanovic 
41*11c03c6dSDamjan Jovanovic     A set of function objects that can be generated from any kind of
42*11c03c6dSDamjan Jovanovic     function or member function with none or one parameter by the
43*11c03c6dSDamjan Jovanovic     helper function ->make_func().
44*11c03c6dSDamjan Jovanovic 
45*11c03c6dSDamjan Jovanovic     Naming Scheme
46*11c03c6dSDamjan Jovanovic     =============
47*11c03c6dSDamjan Jovanovic 
48*11c03c6dSDamjan Jovanovic     The naming scheme consists of three variables
49*11c03c6dSDamjan Jovanovic       f - the kind of function
50*11c03c6dSDamjan Jovanovic       p - the parameter of the function
51*11c03c6dSDamjan Jovanovic       c - call operator() of the function object with these arguments
52*11c03c6dSDamjan Jovanovic 
53*11c03c6dSDamjan Jovanovic     Each of those may have the following values:
54*11c03c6dSDamjan Jovanovic       f:
55*11c03c6dSDamjan Jovanovic         f - free, no owning class
56*11c03c6dSDamjan Jovanovic         c - const member function of a class
57*11c03c6dSDamjan Jovanovic         m - modifying member function of a class
58*11c03c6dSDamjan Jovanovic       p:
59*11c03c6dSDamjan Jovanovic         n - no parameter
60*11c03c6dSDamjan Jovanovic         c - const parameter by reference
61*11c03c6dSDamjan Jovanovic         m - modifyable parameter by reference,
62*11c03c6dSDamjan Jovanovic         v - parameter by value
63*11c03c6dSDamjan Jovanovic       c:
64*11c03c6dSDamjan Jovanovic         n - none
65*11c03c6dSDamjan Jovanovic         o - the owning object on which the function shall be called
66*11c03c6dSDamjan Jovanovic         a - the argument of the function
67*11c03c6dSDamjan Jovanovic         b - both, the object on which the function shall be called
68*11c03c6dSDamjan Jovanovic             and the argument of the function
69*11c03c6dSDamjan Jovanovic 
70*11c03c6dSDamjan Jovanovic     Which gives the following 35 possible combinations:
71*11c03c6dSDamjan Jovanovic     ff_pn_cn
72*11c03c6dSDamjan Jovanovic     ff_pc_cn
73*11c03c6dSDamjan Jovanovic     ff_pc_ca
74*11c03c6dSDamjan Jovanovic     ff_pm_cn
75*11c03c6dSDamjan Jovanovic     ff_pm_ca
76*11c03c6dSDamjan Jovanovic     ff_pv_cn
77*11c03c6dSDamjan Jovanovic     ff_pv_ca
78*11c03c6dSDamjan Jovanovic 
79*11c03c6dSDamjan Jovanovic     fc_pn_cn
80*11c03c6dSDamjan Jovanovic     fc_pn_co
81*11c03c6dSDamjan Jovanovic     fc_pc_cn
82*11c03c6dSDamjan Jovanovic     fc_pc_co
83*11c03c6dSDamjan Jovanovic     fc_pc_ca
84*11c03c6dSDamjan Jovanovic     fc_pc_cb
85*11c03c6dSDamjan Jovanovic     fc_pm_cn
86*11c03c6dSDamjan Jovanovic     fc_pm_co
87*11c03c6dSDamjan Jovanovic     fc_pm_ca
88*11c03c6dSDamjan Jovanovic     fc_pm_cb
89*11c03c6dSDamjan Jovanovic     fc_pv_cn
90*11c03c6dSDamjan Jovanovic     fc_pv_co
91*11c03c6dSDamjan Jovanovic     fc_pv_ca
92*11c03c6dSDamjan Jovanovic     fc_pv_cb
93*11c03c6dSDamjan Jovanovic 
94*11c03c6dSDamjan Jovanovic     fm_pn_cn
95*11c03c6dSDamjan Jovanovic     fm_pn_co
96*11c03c6dSDamjan Jovanovic     fm_pc_cn
97*11c03c6dSDamjan Jovanovic     fm_pc_co
98*11c03c6dSDamjan Jovanovic     fm_pc_ca
99*11c03c6dSDamjan Jovanovic     fm_pc_cb
100*11c03c6dSDamjan Jovanovic     fm_pm_cn
101*11c03c6dSDamjan Jovanovic     fm_pm_co
102*11c03c6dSDamjan Jovanovic     fm_pm_ca
103*11c03c6dSDamjan Jovanovic     fm_pm_cb
104*11c03c6dSDamjan Jovanovic     fm_pv_cn
105*11c03c6dSDamjan Jovanovic     fm_pv_co
106*11c03c6dSDamjan Jovanovic     fm_pv_ca
107*11c03c6dSDamjan Jovanovic     fm_pv_cb
108*11c03c6dSDamjan Jovanovic 
109*11c03c6dSDamjan Jovanovic     These function objects are complicate to handle, so they can be created
110*11c03c6dSDamjan Jovanovic     with the overloaded function
111*11c03c6dSDamjan Jovanovic         <function_object> csv::make_func(<function_type>, <argument_types>);
112*11c03c6dSDamjan Jovanovic 
113*11c03c6dSDamjan Jovanovic     For the rare, but possible case that the owning class and the function
114*11c03c6dSDamjan Jovanovic     argument have the same type, these clarifying variations to make_func()
115*11c03c6dSDamjan Jovanovic     can be used:
116*11c03c6dSDamjan Jovanovic         make_func_callwith_obj(), make_func_callwith_arg().
117*11c03c6dSDamjan Jovanovic */
118*11c03c6dSDamjan Jovanovic 
119*11c03c6dSDamjan Jovanovic 
120*11c03c6dSDamjan Jovanovic /** Function object.
121*11c03c6dSDamjan Jovanovic 
122*11c03c6dSDamjan Jovanovic     @concept ->"csv::func Function Objects"
123*11c03c6dSDamjan Jovanovic     @see    csv::make_func()
124*11c03c6dSDamjan Jovanovic */
125*11c03c6dSDamjan Jovanovic template <class R>
126*11c03c6dSDamjan Jovanovic struct ff_pn_cn
127*11c03c6dSDamjan Jovanovic {
128*11c03c6dSDamjan Jovanovic     typedef R           result_type;
129*11c03c6dSDamjan Jovanovic     typedef R (*        function_type )();
130*11c03c6dSDamjan Jovanovic 
operator ()csv::func::ff_pn_cn131*11c03c6dSDamjan Jovanovic     R                   operator()() const
132*11c03c6dSDamjan Jovanovic                             { return (*f)(); }
133*11c03c6dSDamjan Jovanovic 
ff_pn_cncsv::func::ff_pn_cn134*11c03c6dSDamjan Jovanovic                         ff_pn_cn(
135*11c03c6dSDamjan Jovanovic                             function_type       i_f)
136*11c03c6dSDamjan Jovanovic                             :   f(i_f)  {}
137*11c03c6dSDamjan Jovanovic   private:
138*11c03c6dSDamjan Jovanovic     function_type       f;
139*11c03c6dSDamjan Jovanovic };
140*11c03c6dSDamjan Jovanovic 
141*11c03c6dSDamjan Jovanovic 
142*11c03c6dSDamjan Jovanovic /** Function object.
143*11c03c6dSDamjan Jovanovic 
144*11c03c6dSDamjan Jovanovic     @concept ->"csv::func Function Objects"
145*11c03c6dSDamjan Jovanovic     @see    csv::make_func()
146*11c03c6dSDamjan Jovanovic */
147*11c03c6dSDamjan Jovanovic template <class R, class C>
148*11c03c6dSDamjan Jovanovic struct fc_pn_co
149*11c03c6dSDamjan Jovanovic {
150*11c03c6dSDamjan Jovanovic     typedef R           result_type;
151*11c03c6dSDamjan Jovanovic     typedef R (C::*     function_type )() const;
152*11c03c6dSDamjan Jovanovic 
operator ()csv::func::fc_pn_co153*11c03c6dSDamjan Jovanovic     R                   operator()(
154*11c03c6dSDamjan Jovanovic                             const C &           i_c ) const
155*11c03c6dSDamjan Jovanovic                             { return (i_c.*f)(); }
156*11c03c6dSDamjan Jovanovic 
fc_pn_cocsv::func::fc_pn_co157*11c03c6dSDamjan Jovanovic                         fc_pn_co(
158*11c03c6dSDamjan Jovanovic                             function_type       i_f)
159*11c03c6dSDamjan Jovanovic                             :   f(i_f)  {}
160*11c03c6dSDamjan Jovanovic   private:
161*11c03c6dSDamjan Jovanovic     function_type       f;
162*11c03c6dSDamjan Jovanovic };
163*11c03c6dSDamjan Jovanovic 
164*11c03c6dSDamjan Jovanovic 
165*11c03c6dSDamjan Jovanovic 
166*11c03c6dSDamjan Jovanovic /** Function object.
167*11c03c6dSDamjan Jovanovic 
168*11c03c6dSDamjan Jovanovic     @concept ->"csv::func Function Objects"
169*11c03c6dSDamjan Jovanovic     @see    csv::make_func()
170*11c03c6dSDamjan Jovanovic */
171*11c03c6dSDamjan Jovanovic template <class R, class C, class P>
172*11c03c6dSDamjan Jovanovic struct fc_pm_co
173*11c03c6dSDamjan Jovanovic {
174*11c03c6dSDamjan Jovanovic     typedef R           result_type;
175*11c03c6dSDamjan Jovanovic     typedef R (C::*     function_type )(P&) const;
176*11c03c6dSDamjan Jovanovic 
operator ()csv::func::fc_pm_co177*11c03c6dSDamjan Jovanovic     R                   operator()(
178*11c03c6dSDamjan Jovanovic                             const C &           i_c ) const
179*11c03c6dSDamjan Jovanovic                             { return (i_c.*f)(p); }
180*11c03c6dSDamjan Jovanovic 
fc_pm_cocsv::func::fc_pm_co181*11c03c6dSDamjan Jovanovic                         fc_pm_co(
182*11c03c6dSDamjan Jovanovic                             function_type       i_f,
183*11c03c6dSDamjan Jovanovic                             P &                 i_p)
184*11c03c6dSDamjan Jovanovic                             :   f(i_f), p(i_p) {}
185*11c03c6dSDamjan Jovanovic   private:
186*11c03c6dSDamjan Jovanovic     function_type       f;
187*11c03c6dSDamjan Jovanovic     P &                 p;
188*11c03c6dSDamjan Jovanovic };
189*11c03c6dSDamjan Jovanovic 
190*11c03c6dSDamjan Jovanovic 
191*11c03c6dSDamjan Jovanovic 
192*11c03c6dSDamjan Jovanovic 
193*11c03c6dSDamjan Jovanovic 
194*11c03c6dSDamjan Jovanovic 
195*11c03c6dSDamjan Jovanovic 
196*11c03c6dSDamjan Jovanovic }   // namespace func
197*11c03c6dSDamjan Jovanovic 
198*11c03c6dSDamjan Jovanovic 
199*11c03c6dSDamjan Jovanovic /** Creates a function object of type ff_pn_cn.
200*11c03c6dSDamjan Jovanovic     @concept ->"csv::func Function Objects"
201*11c03c6dSDamjan Jovanovic */
202*11c03c6dSDamjan Jovanovic template <class R>
203*11c03c6dSDamjan Jovanovic inline func::ff_pn_cn<R>
make_func(R (* i_f)())204*11c03c6dSDamjan Jovanovic make_func( R(*i_f)() )
205*11c03c6dSDamjan Jovanovic {
206*11c03c6dSDamjan Jovanovic     return func::ff_pn_cn<R>(i_f);
207*11c03c6dSDamjan Jovanovic }
208*11c03c6dSDamjan Jovanovic 
209*11c03c6dSDamjan Jovanovic ///** Creates a function object of type ff_py_cn.
210*11c03c6dSDamjan Jovanovic //    @concept ->"csv::func Function Objects"
211*11c03c6dSDamjan Jovanovic //*/
212*11c03c6dSDamjan Jovanovic //template <class R, class P>
213*11c03c6dSDamjan Jovanovic //inline func::ff_py_cn<R,P>
214*11c03c6dSDamjan Jovanovic //make_func( R(*i_f)(P), P i_p )
215*11c03c6dSDamjan Jovanovic //{
216*11c03c6dSDamjan Jovanovic //    return func::ff_py_cn<R,A>(i_f, i_p);
217*11c03c6dSDamjan Jovanovic //}
218*11c03c6dSDamjan Jovanovic //
219*11c03c6dSDamjan Jovanovic ///** Creates a function object of type ff_py_ca.
220*11c03c6dSDamjan Jovanovic //    @concept ->"csv::func Function Objects"
221*11c03c6dSDamjan Jovanovic //*/
222*11c03c6dSDamjan Jovanovic //template <class R, class P>
223*11c03c6dSDamjan Jovanovic //inline func::ff_py_ca<R,P>
224*11c03c6dSDamjan Jovanovic //make_func( R(*i_f)(P) )
225*11c03c6dSDamjan Jovanovic //{
226*11c03c6dSDamjan Jovanovic //    return func::ff_py_ca<R,P>(i_f);
227*11c03c6dSDamjan Jovanovic //}
228*11c03c6dSDamjan Jovanovic 
229*11c03c6dSDamjan Jovanovic 
230*11c03c6dSDamjan Jovanovic /** Creates a function object of type fc_pn_co.
231*11c03c6dSDamjan Jovanovic     @concept ->"csv::func Function Objects"
232*11c03c6dSDamjan Jovanovic */
233*11c03c6dSDamjan Jovanovic template <class R, class C>
234*11c03c6dSDamjan Jovanovic inline func::fc_pn_co<R,C>
make_func(R (C::* i_f)()const)235*11c03c6dSDamjan Jovanovic make_func( R(C::*i_f)() const )
236*11c03c6dSDamjan Jovanovic {
237*11c03c6dSDamjan Jovanovic     return func::fc_pn_co<R,C>(i_f);
238*11c03c6dSDamjan Jovanovic }
239*11c03c6dSDamjan Jovanovic 
240*11c03c6dSDamjan Jovanovic 
241*11c03c6dSDamjan Jovanovic 
242*11c03c6dSDamjan Jovanovic /** Creates a function object of type fc_pm_co.
243*11c03c6dSDamjan Jovanovic     @concept ->"csv::func Function Objects"
244*11c03c6dSDamjan Jovanovic */
245*11c03c6dSDamjan Jovanovic template <class R, class C, class P>
246*11c03c6dSDamjan Jovanovic inline func::fc_pm_co<R,C,P>
make_func(R (C::* i_f)(P &)const,P & i_p)247*11c03c6dSDamjan Jovanovic make_func( R(C::*i_f)(P &) const, P & i_p)
248*11c03c6dSDamjan Jovanovic {
249*11c03c6dSDamjan Jovanovic     return func::fc_pm_co<R,C,P>(i_f, i_p);
250*11c03c6dSDamjan Jovanovic }
251*11c03c6dSDamjan Jovanovic 
252*11c03c6dSDamjan Jovanovic 
253*11c03c6dSDamjan Jovanovic 
254*11c03c6dSDamjan Jovanovic /* Because std::for_each is defined as a non-modifying algorithm
255*11c03c6dSDamjan Jovanovic    it is redefined here. It is also provided for containers.
256*11c03c6dSDamjan Jovanovic */
257*11c03c6dSDamjan Jovanovic 
258*11c03c6dSDamjan Jovanovic template <class I, class F>
259*11c03c6dSDamjan Jovanovic F
for_each(I i_itBegin,I i_itEnd,F io_functionToBeCalled)260*11c03c6dSDamjan Jovanovic for_each(I i_itBegin, I i_itEnd, F io_functionToBeCalled)
261*11c03c6dSDamjan Jovanovic {
262*11c03c6dSDamjan Jovanovic     for (I it = i_itBegin; it != i_itEnd; ++it)
263*11c03c6dSDamjan Jovanovic     {
264*11c03c6dSDamjan Jovanovic         io_functionToBeCalled(*it);
265*11c03c6dSDamjan Jovanovic     }
266*11c03c6dSDamjan Jovanovic     return io_functionToBeCalled;
267*11c03c6dSDamjan Jovanovic }
268*11c03c6dSDamjan Jovanovic 
269*11c03c6dSDamjan Jovanovic template <class C, class F>
270*11c03c6dSDamjan Jovanovic F
for_each_in(const C & i_container,F io_functionToBeCalled)271*11c03c6dSDamjan Jovanovic for_each_in(const C & i_container, F io_functionToBeCalled)
272*11c03c6dSDamjan Jovanovic {
273*11c03c6dSDamjan Jovanovic     typename C::const_iterator const
274*11c03c6dSDamjan Jovanovic         itEnd = i_container.end();
275*11c03c6dSDamjan Jovanovic     for ( typename C::const_iterator it = i_container.begin();
276*11c03c6dSDamjan Jovanovic           it != itEnd;
277*11c03c6dSDamjan Jovanovic           ++it )
278*11c03c6dSDamjan Jovanovic     {
279*11c03c6dSDamjan Jovanovic         io_functionToBeCalled(*it);
280*11c03c6dSDamjan Jovanovic     }
281*11c03c6dSDamjan Jovanovic     return io_functionToBeCalled;
282*11c03c6dSDamjan Jovanovic }
283*11c03c6dSDamjan Jovanovic 
284*11c03c6dSDamjan Jovanovic template <class C, class F>
285*11c03c6dSDamjan Jovanovic F
for_each_in(C & i_container,F io_functionToBeCalled)286*11c03c6dSDamjan Jovanovic for_each_in(C & i_container, F io_functionToBeCalled)
287*11c03c6dSDamjan Jovanovic {
288*11c03c6dSDamjan Jovanovic     typename C::iterator const
289*11c03c6dSDamjan Jovanovic         itEnd = i_container.end();
290*11c03c6dSDamjan Jovanovic     for ( typename C::iterator it = i_container.begin();
291*11c03c6dSDamjan Jovanovic           it != itEnd;
292*11c03c6dSDamjan Jovanovic           ++it )
293*11c03c6dSDamjan Jovanovic     {
294*11c03c6dSDamjan Jovanovic         io_functionToBeCalled(*it);
295*11c03c6dSDamjan Jovanovic     }
296*11c03c6dSDamjan Jovanovic     return io_functionToBeCalled;
297*11c03c6dSDamjan Jovanovic }
298*11c03c6dSDamjan Jovanovic 
299*11c03c6dSDamjan Jovanovic 
300*11c03c6dSDamjan Jovanovic 
301*11c03c6dSDamjan Jovanovic 
302*11c03c6dSDamjan Jovanovic }   // namespace csv
303*11c03c6dSDamjan Jovanovic #endif
304