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