Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=8c5e5f7d0f3be5785980f073d9f8a0577839a016
commit 8c5e5f7d0f3be5785980f073d9f8a0577839a016 Author: Michel Hermier <[email protected]> Date: Tue Jun 3 08:47:40 2014 +0200 libpacman: Integrate callback handling to FFunction. diff --git a/lib/libpacman/util/ffunctional.h b/lib/libpacman/util/ffunctional.h index 5f90112..4527447 100644 --- a/lib/libpacman/util/ffunctional.h +++ b/lib/libpacman/util/ffunctional.h @@ -67,12 +67,17 @@ template <typename R, typename... Args> struct FAbstractFunctionImplBase<R(Args...)> : flib::FCallable<void(R *, Args...)> { - virtual const std::type_info &target_type() const = 0; + virtual const std::type_info &callback_data_type() const + { + return typeid(void); + } virtual const std::type_info &method_type() const { return typeid(void); } + + virtual const std::type_info &target_type() const = 0; }; template <typename, typename> @@ -91,16 +96,35 @@ struct FAbstractFunctionImpl<R(Args...), Target> }; template <typename, typename, typename> +struct FFunctionBase; + +template <typename R, typename... Args, typename Target, typename TargetHolder> +struct FFunctionBase<R(Args...), Target, TargetHolder> + : flib::detail::FAbstractFunctionImpl<R(Args...), Target> +{ + TargetHolder m_target; + + FFunctionBase(TargetHolder target) + : m_target(target) + { } + + virtual Target target() const override + { + return &(*m_target); + } +}; + +template <typename, typename, typename> struct FFunctionImpl; template <typename R, typename... Args, typename Target, typename FunctionR, typename... FunctionArgs> struct FFunctionImpl<R(Args...), Target, FunctionR(FunctionArgs...)> - : flib::detail::FAbstractFunctionImpl<R(Args...), Target> + : flib::detail::FFunctionBase<R(Args...), Target, Target> { - Target m_target; + typedef flib::detail::FFunctionBase<R(Args...), Target, Target> super_type; FFunctionImpl(Target target) - : m_target(target) + : super_type(target) { } virtual void operator()(R *ret, Args... args) const override @@ -111,18 +135,13 @@ struct FFunctionImpl<R(Args...), Target, FunctionR(FunctionArgs...)> template <typename T = R> inline void adapted(typename std::enable_if<!std::is_void<T>::value, T *>::type ret, FunctionArgs... args, ...) const { - *ret = m_target(args...); + *ret = super_type::m_target(args...); } template <typename T = R> inline void adapted(typename std::enable_if<std::is_void<T>::value, T *>::type ret, FunctionArgs... args, ...) const { - m_target(args...); - } - - virtual Target target() const override - { - return m_target; + super_type::m_target(args...); } }; @@ -131,8 +150,19 @@ struct FAbstractCallbackImpl; template <typename R, typename... Args, typename Target, typename CallbackR, typename CallbackData, typename... CallbackArgs> struct FAbstractCallbackImpl<R(Args...), Target, CallbackR(CallbackData, CallbackArgs...)> - : flib::detail::FFunctionImpl<R(Args...), Target, CallbackR(CallbackArgs...)> + : flib::detail::FFunctionBase<R(Args...), Target, Target> { + typedef flib::detail::FFunctionBase<R(Args...), Target, Target> super_type; + + FAbstractCallbackImpl(Target target) + : super_type(target) + { } + + virtual const std::type_info &callback_data_type() const override + { + return typeid(CallbackData); + } + virtual CallbackData callback_data() const = 0; }; @@ -141,12 +171,14 @@ struct FCallbackImpl; template <typename R, typename... Args, typename Target, typename CallbackR, typename CallbackData, typename... CallbackArgs, typename CallbackDataHolder> struct FCallbackImpl<R(Args...), Target, CallbackR(CallbackData, CallbackArgs...), CallbackDataHolder> - : flib::detail::FFunctionImpl<R(Args...), Target, CallbackR(CallbackArgs...)> + : flib::detail::FAbstractCallbackImpl<R(Args...), Target, CallbackR(CallbackData, CallbackArgs...)> { + typedef flib::detail::FAbstractCallbackImpl<R(Args...), Target, CallbackR(CallbackData, CallbackArgs...)> super_type; + CallbackDataHolder m_data; FCallbackImpl(Target target, CallbackDataHolder data) - : flib::detail::FFunctionImpl<R(Args...), Target, CallbackR(CallbackArgs...)>(target) + : super_type(target) , m_data(data) { } @@ -158,13 +190,13 @@ struct FCallbackImpl<R(Args...), Target, CallbackR(CallbackData, CallbackArgs... template <typename T = R> inline void adapted(typename std::enable_if<!std::is_void<T>::value, T *>::type ret, CallbackArgs... args, ...) const { - *ret = m_target(m_data, args...); + *ret = super_type::m_target(m_data, args...); } template <typename T = R> inline void adapted(typename std::enable_if<std::is_void<T>::value, T *>::type ret, CallbackArgs... args, ...) const { - m_target(m_data, args...); + super_type::m_target(m_data, args...); } virtual CallbackData callback_data() const override @@ -301,6 +333,14 @@ public: d = shared_ptr(new flib::detail::FFunctionImpl<R(Args...), FunctionR (*)(FunctionArgs...), FunctionR(FunctionArgs...)>(function)); } + template <typename CallbackR, typename CallbackData, typename... CallbackArgs, typename CallbackDataHolder> + FFunction(CallbackR (*callback)(CallbackData, CallbackArgs...), CallbackDataHolder data) + { + ASSERT(callback != nullptr, return;); + + d = shared_ptr(new flib::detail::FCallbackImpl<R(Args...), CallbackR (*)(CallbackData, CallbackArgs...), CallbackR(CallbackData, CallbackArgs...), CallbackDataHolder>(callback, data)); + } + template <typename Pointer, typename MethodSignature> FFunction(Pointer pointer, MethodSignature method) : FFunction(pointer, method, (typename flib::detail::FSignature<MethodSignature>::ptarget_type) nullptr) _______________________________________________ Frugalware-git mailing list [email protected] http://frugalware.org/mailman/listinfo/frugalware-git
