diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2021-08-27 02:50:29 +0300 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2021-09-02 01:16:45 +0300 |
commit | d1315600b8d406291215efc2be722dd93a38e481 (patch) | |
tree | d535158272ed456c0f1b3159013e76ed1b1d9e3b /include | |
parent | eb5c4ead8842ff91b7b32b25f78531e79c17e1b3 (diff) |
libcamera: base: bound_method: Remove BoundMethodMember specialization
The BoundMethodMember specialization for the void return type is only
needed to avoid accessing the ret_ member variable that is lacking from
the corresponding BoundMethodPack specialization. By adding a
BoundMethodPack::returnValue() function to read the member variable, we
can remove the complete BoundMethodMember specialization.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/libcamera/base/bound_method.h | 46 |
1 files changed, 10 insertions, 36 deletions
diff --git a/include/libcamera/base/bound_method.h b/include/libcamera/base/bound_method.h index 282f9b58..9c212f1e 100644 --- a/include/libcamera/base/bound_method.h +++ b/include/libcamera/base/bound_method.h @@ -38,6 +38,11 @@ public: { } + R returnValue() + { + return ret_; + } + std::tuple<typename std::remove_reference_t<Args>...> args_; R ret_; }; @@ -51,6 +56,10 @@ public: { } + void returnValue() + { + } + std::tuple<typename std::remove_reference_t<Args>...> args_; }; @@ -160,7 +169,7 @@ public: auto pack = std::make_shared<PackType>(args...); bool sync = BoundMethodBase::activatePack(pack, deleteMethod); - return sync ? pack->ret_ : R(); + return sync ? pack->returnValue() : R(); } R invoke(Args... args) override @@ -173,41 +182,6 @@ private: R (T::*func_)(Args...); }; -template<typename T, typename... Args> -class BoundMethodMember<T, void, Args...> : public BoundMethodArgs<void, Args...> -{ -public: - using PackType = typename BoundMethodArgs<void, Args...>::PackType; - - BoundMethodMember(T *obj, Object *object, void (T::*func)(Args...), - ConnectionType type = ConnectionTypeAuto) - : BoundMethodArgs<void, Args...>(obj, object, type), func_(func) - { - } - - bool match(void (T::*func)(Args...)) const { return func == func_; } - - void activate(Args... args, bool deleteMethod = false) override - { - if (!this->object_) { - T *obj = static_cast<T *>(this->obj_); - return (obj->*func_)(args...); - } - - auto pack = std::make_shared<PackType>(args...); - BoundMethodBase::activatePack(pack, deleteMethod); - } - - void invoke(Args... args) override - { - T *obj = static_cast<T *>(this->obj_); - return (obj->*func_)(args...); - } - -private: - void (T::*func_)(Args...); -}; - template<typename R, typename... Args> class BoundMethodStatic : public BoundMethodArgs<R, Args...> { |