/* * MemberFuntion.hpp * * Created on: 4 мар. 2020 г. * Author: titov */ #ifndef UMLIBRARY_SYSTEMIC_MEMBERFUNTION_HPP_ #define UMLIBRARY_SYSTEMIC_MEMBERFUNTION_HPP_ #include "IFunctor.hh" #include "IValue.hpp" namespace systemic { namespace detail { template struct MemberFuntion : public systemic::IFunctor { private: T & object; public: MemberFuntion( T & obj ); ResultType operator()() final; MemberFuntion(const MemberFuntion &) = delete; MemberFuntion & operator=(const MemberFuntion &) = delete; }; template struct MemberArgsFuntion : public systemic::IFunctor { private: T & object; ResultType ( T::* const pf )( Args ... ); public: typedef systemic::IFunctor FunctorInterface; MemberArgsFuntion( T & obj, ResultType ( T::* method )( Args ... ) ); ResultType operator()( Args ... ) final; MemberArgsFuntion(const MemberArgsFuntion &) = delete; MemberArgsFuntion & operator=(const MemberArgsFuntion &) = delete; }; template struct MemberFuntionExternalResult : public systemic::IFunctor { private: T & object; IValue & result; public: MemberFuntionExternalResult( T & obj, IValue & result ); ResultType operator()() final; MemberFuntionExternalResult(const MemberFuntionExternalResult &) = delete; MemberFuntionExternalResult & operator=(const MemberFuntionExternalResult &) = delete; ~MemberFuntionExternalResult() = default; }; } } template inline systemic::detail::MemberFuntion::MemberFuntion( T & obj) : object(obj) {} template inline ResultType systemic::detail::MemberFuntion::operator()() { return (object.*pf)(); } template inline systemic::detail::MemberFuntionExternalResult::MemberFuntionExternalResult( T & obj, IValue & result) : object(obj), result(result) {} template inline ResultType systemic::detail::MemberFuntionExternalResult::operator()() { return (object.*pf)(), result; } template inline systemic::detail::MemberArgsFuntion::MemberArgsFuntion( T & obj, ResultType ( T::* method )( Args ... ) ) : object(obj), pf(method) {} template inline ResultType systemic::detail::MemberArgsFuntion::operator()( Args ... args ) { return (object.*pf)( args... ); } #endif /* UMLIBRARY_SYSTEMIC_MEMBERFUNTION_HPP_ */