/* * Copyright (c) <2002-2009> * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files * (curlpp), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef UTILSPP_FUNCTOR_HPP #define UTILSPP_FUNCTOR_HPP #include #include "../NullType.hpp" #include "../EmptyType.hpp" #include "../TypeList.hpp" #include "../TypeTrait.hpp" #include "FunctorImpl.hpp" #include "FunctorHandler.hpp" #include "MemFunHandler.hpp" namespace utilspp { template class Functor { public: typedef FunctorImpl Impl; typedef R ResultType; typedef TList ParmList; Functor(const Functor & functor) : mImpl(functor.mImpl->clone()) {} Functor() : mImpl() {} Functor(std::auto_ptr impl) : mImpl(impl) {} Functor & operator=(const Functor & functor) { mImpl = std::auto_ptr(functor.mImpl->clone()); return (*this); } template Functor(Fun fun) : mImpl(new FunctorHandler(fun)) {} template Functor(const PointerToObj & obj, MemFun fun) : mImpl(new MemFunHandler(obj, fun)) {} bool operator!() {return !mImpl.get();} typedef typename utilspp::tl::TypeAtNonStrict::Result Parm1; typedef typename utilspp::tl::TypeAtNonStrict::Result Parm2; typedef typename utilspp::tl::TypeAtNonStrict::Result Parm3; typedef typename utilspp::tl::TypeAtNonStrict::Result Parm4; typedef typename utilspp::tl::TypeAtNonStrict::Result Parm5; typedef typename utilspp::tl::TypeAtNonStrict::Result Parm6; typedef typename utilspp::tl::TypeAtNonStrict::Result Parm7; typedef typename utilspp::tl::TypeAtNonStrict::Result Parm8; typedef typename utilspp::tl::TypeAtNonStrict::Result Parm9; typedef typename utilspp::tl::TypeAtNonStrict::Result Parm10; typedef typename utilspp::tl::TypeAtNonStrict::Result Parm11; typedef typename utilspp::tl::TypeAtNonStrict::Result Parm12; typedef typename utilspp::tl::TypeAtNonStrict::Result Parm13; typedef typename utilspp::tl::TypeAtNonStrict::Result Parm14; typedef typename utilspp::tl::TypeAtNonStrict::Result Parm15; R operator()() {return (*mImpl)();} R operator()(Parm1 p1) {return (*mImpl)(p1);} R operator()(Parm1 p1, Parm2 p2) {return (*mImpl)(p1, p2);} R operator()(Parm1 p1, Parm2 p2, Parm3 p3) {return (*mImpl)(p1, p2, p3);} R operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4) {return (*mImpl)(p1, p2, p3, p4);} R operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5) {return (*mImpl)(p1, p2, p3, p4, p5);} R operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5, Parm6 p6) {return (*mImpl)(p1, p2, p3, p4, p5, p6);} R operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5, Parm6 p6, Parm7 p7) {return (*mImpl)(p1, p2, p3, p4, p5, p6, p7);} R operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5, Parm6 p6, Parm7 p7, Parm8 p8) {return (*mImpl)(p1, p2, p3, p4, p5, p6, p7, p8);} R operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5, Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9) {return (*mImpl)(p1, p2, p3, p4, p5, p6, p7, p8, p9);} R operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5, Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10) {return (*mImpl)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);} R operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5, Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11) {return (*mImpl)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11);} R operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5, Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11, Parm12 p12) {return (*mImpl)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12);} R operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5, Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11, Parm12 p12, Parm13 p13) {return (*mImpl)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13);} R operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5, Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11, Parm12 p12, Parm13 p13, Parm14 p14) {return (*mImpl)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14);} R operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5, Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11, Parm12 p12, Parm13 p13, Parm14 p14, Parm15 p15) {return (*mImpl)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15);} private: std::auto_ptr mImpl; }; template Functor::ReturnType, typename PointerOnFunction::ParamList> make_functor(Fun fun) { return utilspp::Functor::ReturnType, typename utilspp::PointerOnFunction::ParamList>(fun); } template Functor::ReturnType, typename PointerOnMemberFunction::ParamList> make_functor(typename PointerOnMemberFunction::ClassType * obj, MemFun fun) { return utilspp::Functor::ReturnType, typename utilspp::PointerOnMemberFunction::ParamList>(obj, fun); } } #include "Binder.hpp" #endif