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