libcamera: bound_method: Store method arguments in a class
Create a new BoundMethodPack class to replace the PackType type alias. This will allow adding additional fields to the arguments pack, when adding support for propagation of bound method return values. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
@@ -873,6 +873,7 @@ EXCLUDE_PATTERNS =
|
||||
EXCLUDE_SYMBOLS = libcamera::BoundMemberMethod \
|
||||
libcamera::BoundMethodArgs \
|
||||
libcamera::BoundMethodBase \
|
||||
libcamera::BoundMethodPack \
|
||||
libcamera::BoundStaticMethod \
|
||||
libcamera::SignalBase \
|
||||
std::*
|
||||
|
||||
@@ -67,17 +67,30 @@ private:
|
||||
ConnectionType connectionType_;
|
||||
};
|
||||
|
||||
template<typename... Args>
|
||||
class BoundMethodPack
|
||||
{
|
||||
public:
|
||||
BoundMethodPack(const Args &... args)
|
||||
: args_(args...)
|
||||
{
|
||||
}
|
||||
|
||||
std::tuple<typename std::remove_reference<Args>::type...> args_;
|
||||
};
|
||||
|
||||
template<typename... Args>
|
||||
class BoundMethodArgs : public BoundMethodBase
|
||||
{
|
||||
private:
|
||||
using PackType = std::tuple<typename std::remove_reference<Args>::type...>;
|
||||
public:
|
||||
using PackType = BoundMethodPack<Args...>;
|
||||
|
||||
private:
|
||||
template<int... S>
|
||||
void invokePack(void *pack, BoundMethodBase::sequence<S...>)
|
||||
{
|
||||
PackType *args = static_cast<PackType *>(pack);
|
||||
invoke(std::get<S>(*args)...);
|
||||
invoke(std::get<S>(args->args_)...);
|
||||
delete args;
|
||||
}
|
||||
|
||||
@@ -98,7 +111,7 @@ template<typename T, typename... Args>
|
||||
class BoundMemberMethod : public BoundMethodArgs<Args...>
|
||||
{
|
||||
public:
|
||||
using PackType = std::tuple<typename std::remove_reference<Args>::type...>;
|
||||
using PackType = typename BoundMethodArgs<Args...>::PackType;
|
||||
|
||||
BoundMemberMethod(T *obj, Object *object, void (T::*func)(Args...),
|
||||
ConnectionType type = ConnectionTypeAuto)
|
||||
|
||||
Reference in New Issue
Block a user