blob: 238af9e5a6758c999f2b0993e6b5f0247e73c591 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef CSV_TPL_FUNCALL_HXX
#define CSV_TPL_FUNCALL_HXX
// BASE CLASSES
#include <algorithm>
namespace csv
{
namespace func
{
/** @concept "csv:: Function Objects"
A set of function objects that can be generated from any kind of
function or member function with none or one parameter by the
helper function ->make_func().
Naming Scheme
=============
The naming scheme consists of three variables
f - the kind of function
p - the parameter of the function
c - call operator() of the function object with these arguments
Each of those may have the following values:
f:
f - free, no owning class
c - const member function of a class
m - modifying member function of a class
p:
n - no parameter
c - const parameter by reference
m - modifyable parameter by reference,
v - parameter by value
c:
n - none
o - the owning object on which the function shall be called
a - the argument of the function
b - both, the object on which the function shall be called
and the argument of the function
Which gives the following 35 possible combinations:
ff_pn_cn
ff_pc_cn
ff_pc_ca
ff_pm_cn
ff_pm_ca
ff_pv_cn
ff_pv_ca
fc_pn_cn
fc_pn_co
fc_pc_cn
fc_pc_co
fc_pc_ca
fc_pc_cb
fc_pm_cn
fc_pm_co
fc_pm_ca
fc_pm_cb
fc_pv_cn
fc_pv_co
fc_pv_ca
fc_pv_cb
fm_pn_cn
fm_pn_co
fm_pc_cn
fm_pc_co
fm_pc_ca
fm_pc_cb
fm_pm_cn
fm_pm_co
fm_pm_ca
fm_pm_cb
fm_pv_cn
fm_pv_co
fm_pv_ca
fm_pv_cb
These function objects are complicate to handle, so they can be created
with the overloaded function
<function_object> csv::make_func(<function_type>, <argument_types>);
For the rare, but possible case that the owning class and the function
argument have the same type, these clarifying variations to make_func()
can be used:
make_func_callwith_obj(), make_func_callwith_arg().
*/
/** Function object.
@concept ->"csv::func Function Objects"
@see csv::make_func()
*/
template <class R>
struct ff_pn_cn
{
typedef R result_type;
typedef R (* function_type )();
R operator()() const
{ return (*f)(); }
ff_pn_cn(
function_type i_f)
: f(i_f) {}
private:
function_type f;
};
/** Function object.
@concept ->"csv::func Function Objects"
@see csv::make_func()
*/
template <class R, class C>
struct fc_pn_co
{
typedef R result_type;
typedef R (C::* function_type )() const;
R operator()(
const C & i_c ) const
{ return (i_c.*f)(); }
fc_pn_co(
function_type i_f)
: f(i_f) {}
private:
function_type f;
};
/** Function object.
@concept ->"csv::func Function Objects"
@see csv::make_func()
*/
template <class R, class C, class P>
struct fc_pm_co
{
typedef R result_type;
typedef R (C::* function_type )(P&) const;
R operator()(
const C & i_c ) const
{ return (i_c.*f)(p); }
fc_pm_co(
function_type i_f,
P & i_p)
: f(i_f), p(i_p) {}
private:
function_type f;
P & p;
};
} // namespace func
/** Creates a function object of type ff_pn_cn.
@concept ->"csv::func Function Objects"
*/
template <class R>
inline func::ff_pn_cn<R>
make_func( R(*i_f)() )
{
return func::ff_pn_cn<R>(i_f);
}
///** Creates a function object of type ff_py_cn.
// @concept ->"csv::func Function Objects"
//*/
//template <class R, class P>
//inline func::ff_py_cn<R,P>
//make_func( R(*i_f)(P), P i_p )
//{
// return func::ff_py_cn<R,A>(i_f, i_p);
//}
//
///** Creates a function object of type ff_py_ca.
// @concept ->"csv::func Function Objects"
//*/
//template <class R, class P>
//inline func::ff_py_ca<R,P>
//make_func( R(*i_f)(P) )
//{
// return func::ff_py_ca<R,P>(i_f);
//}
/** Creates a function object of type fc_pn_co.
@concept ->"csv::func Function Objects"
*/
template <class R, class C>
inline func::fc_pn_co<R,C>
make_func( R(C::*i_f)() const )
{
return func::fc_pn_co<R,C>(i_f);
}
/** Creates a function object of type fc_pm_co.
@concept ->"csv::func Function Objects"
*/
template <class R, class C, class P>
inline func::fc_pm_co<R,C,P>
make_func( R(C::*i_f)(P &) const, P & i_p)
{
return func::fc_pm_co<R,C,P>(i_f, i_p);
}
/* Because std::for_each is defined as a non-modifying algorithm
it is redefined here. It is also provided for containers.
*/
template <class I, class F>
F
for_each(I i_itBegin, I i_itEnd, F io_functionToBeCalled)
{
for (I it = i_itBegin; it != i_itEnd; ++it)
{
io_functionToBeCalled(*it);
}
return io_functionToBeCalled;
}
template <class C, class F>
F
for_each_in(const C & i_container, F io_functionToBeCalled)
{
typename C::const_iterator const
itEnd = i_container.end();
for ( typename C::const_iterator it = i_container.begin();
it != itEnd;
++it )
{
io_functionToBeCalled(*it);
}
return io_functionToBeCalled;
}
template <class C, class F>
F
for_each_in(C & i_container, F io_functionToBeCalled)
{
typename C::iterator const
itEnd = i_container.end();
for ( typename C::iterator it = i_container.begin();
it != itEnd;
++it )
{
io_functionToBeCalled(*it);
}
return io_functionToBeCalled;
}
} // namespace csv
#endif