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