/************************************************************** * * 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 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 csv::make_func(, ); 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 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 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 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 inline func::ff_pn_cn make_func( R(*i_f)() ) { return func::ff_pn_cn(i_f); } ///** Creates a function object of type ff_py_cn. // @concept ->"csv::func Function Objects" //*/ //template //inline func::ff_py_cn //make_func( R(*i_f)(P), P i_p ) //{ // return func::ff_py_cn(i_f, i_p); //} // ///** Creates a function object of type ff_py_ca. // @concept ->"csv::func Function Objects" //*/ //template //inline func::ff_py_ca //make_func( R(*i_f)(P) ) //{ // return func::ff_py_ca(i_f); //} /** Creates a function object of type fc_pn_co. @concept ->"csv::func Function Objects" */ template inline func::fc_pn_co make_func( R(C::*i_f)() const ) { return func::fc_pn_co(i_f); } /** Creates a function object of type fc_pm_co. @concept ->"csv::func Function Objects" */ template inline func::fc_pm_co make_func( R(C::*i_f)(P &) const, P & i_p) { return func::fc_pm_co(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 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 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 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