97 lines
2.9 KiB
C++
97 lines
2.9 KiB
C++
/*
|
|
* 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<typename T, typename ResultType, ResultType (T::* pf)()>
|
|
struct MemberFuntion : public systemic::IFunctor<ResultType> {
|
|
private:
|
|
T & object;
|
|
|
|
public:
|
|
MemberFuntion( T & obj );
|
|
ResultType operator()() final;
|
|
|
|
MemberFuntion(const MemberFuntion &) = delete;
|
|
MemberFuntion & operator=(const MemberFuntion &) = delete;
|
|
};
|
|
|
|
template<typename T, typename ResultType, typename ... Args>
|
|
struct MemberArgsFuntion : public systemic::IFunctor<ResultType, Args ...> {
|
|
private:
|
|
T & object;
|
|
ResultType ( T::* const pf )( Args ... );
|
|
public:
|
|
typedef systemic::IFunctor<ResultType, Args ...> FunctorInterface;
|
|
|
|
MemberArgsFuntion( T & obj, ResultType ( T::* method )( Args ... ) );
|
|
ResultType operator()( Args ... ) final;
|
|
|
|
MemberArgsFuntion(const MemberArgsFuntion &) = delete;
|
|
MemberArgsFuntion & operator=(const MemberArgsFuntion &) = delete;
|
|
};
|
|
|
|
|
|
|
|
template<typename T, typename ResultType, void (T::* pf)()>
|
|
struct MemberFuntionExternalResult : public systemic::IFunctor<ResultType> {
|
|
private:
|
|
T & object;
|
|
IValue<ResultType> & result;
|
|
|
|
public:
|
|
MemberFuntionExternalResult( T & obj, IValue<ResultType> & result );
|
|
ResultType operator()() final;
|
|
|
|
MemberFuntionExternalResult(const MemberFuntionExternalResult &) = delete;
|
|
MemberFuntionExternalResult & operator=(const MemberFuntionExternalResult &) = delete;
|
|
~MemberFuntionExternalResult() = default;
|
|
};
|
|
|
|
}
|
|
}
|
|
|
|
template<typename T, typename ResultType, ResultType (T::*pf)()>
|
|
inline systemic::detail::MemberFuntion<T, ResultType, pf>::MemberFuntion( T & obj) : object(obj) {}
|
|
|
|
template<typename T, typename ResultType, ResultType (T::*pf)()>
|
|
inline ResultType systemic::detail::MemberFuntion<T, ResultType, pf>::operator()() {
|
|
|
|
return (object.*pf)();
|
|
|
|
}
|
|
|
|
template<typename T, typename ResultType, void (T::*pf)()>
|
|
inline systemic::detail::MemberFuntionExternalResult<T, ResultType, pf>::MemberFuntionExternalResult(
|
|
T & obj, IValue<ResultType> & result) : object(obj), result(result) {}
|
|
|
|
template<typename T, typename ResultType, void (T::*pf)()>
|
|
inline ResultType systemic::detail::MemberFuntionExternalResult<T, ResultType,pf>::operator()() {
|
|
|
|
return (object.*pf)(), result;
|
|
|
|
}
|
|
|
|
template<typename T, typename ResultType, typename ... Args>
|
|
inline systemic::detail::MemberArgsFuntion<T, ResultType, Args...>::MemberArgsFuntion(
|
|
T & obj, ResultType ( T::* method )( Args ... ) ) : object(obj), pf(method) {}
|
|
|
|
template<typename T, typename ResultType, typename ... Args>
|
|
inline ResultType systemic::detail::MemberArgsFuntion<T, ResultType, Args...>::operator()( Args ... args ) {
|
|
|
|
return (object.*pf)( args... );
|
|
|
|
}
|
|
|
|
#endif /* UMLIBRARY_SYSTEMIC_MEMBERFUNTION_HPP_ */
|