diff --git a/src/libs/utils/builderutils.h b/src/libs/utils/builderutils.h index 51f65bd6b6e..fd0de6227f1 100644 --- a/src/libs/utils/builderutils.h +++ b/src/libs/utils/builderutils.h @@ -25,43 +25,11 @@ public: const Arg arg; // FIXME: Could be const &, but this would currently break bindTo(). }; -template -struct Arg2 +template +struct ArgTuple { - Arg2(const T1 &a1, const T2 &a2) - : p1(a1) - , p2(a2) - {} - const T1 p1; - const T2 p2; -}; - -template -struct Arg3 -{ - Arg3(const T1 &a1, const T2 &a2, const T3 &a3) - : p1(a1) - , p2(a2) - , p3(a3) - {} - const T1 p1; - const T2 p2; - const T3 p3; -}; - -template -struct Arg4 -{ - Arg4(const T1 &a1, const T2 &a2, const T3 &a3, const T4 &a4) - : p1(a1) - , p2(a2) - , p3(a3) - , p4(a4) - {} - const T1 p1; - const T2 p2; - const T3 p3; - const T4 p4; + ArgTuple(Args &&...args) : args(std::forward(args)...) {} + const std::tuple...> args; }; // The main dispatcher @@ -89,23 +57,14 @@ public: }; #define QTC_DEFINE_BUILDER_SETTER(name, setter) \ - class name##_TAG {}; \ - inline auto name(auto p) { return Building::IdAndArg{name##_TAG{}, p}; } \ - inline void doit(auto x, name##_TAG, auto p) { x->setter(p); } - -#define QTC_DEFINE_BUILDER_SETTER2(name, setter) \ - class name##_TAG {}; \ - inline auto name(auto p1, auto p2) { return Building::IdAndArg{name##_TAG{}, Building::Arg2{p1, p2}}; } \ - inline void doit(auto x, name##_TAG, auto p) { x->setter(p.p1, p.p2); } - -#define QTC_DEFINE_BUILDER_SETTER3(name, setter) \ - class name##_TAG {}; \ - inline auto name(auto p1, auto p2, auto p3) { return Building::IdAndArg{name##_TAG{}, Building::Arg3{p1, p2, p3}}; } \ - inline void doit(auto x, name##_TAG, auto p) { x->setter(p.p1, p.p2, p.p3); } - -#define QTC_DEFINE_BUILDER_SETTER4(name, setter) \ - class name##_TAG {}; \ - inline auto name(auto p1, auto p2, auto p3, auto p4) { return Building::IdAndArg{name##_TAG{}, Building::Arg4{p1, p2, p3, p4}}; } \ - inline void doit(auto x, name##_TAG, auto p) { x->setter(p.p1, p.p2, p.p3, p.p4); } +class name##_TAG {}; \ +template \ +inline auto name(Args &&...args) { \ + return Building::IdAndArg{name##_TAG{}, Building::ArgTuple{std::forward(args)...}}; \ +} \ +template \ +inline void doit(L *x, name##_TAG, const Building::ArgTuple &arg) { \ + std::apply(&L::setter, std::tuple_cat(std::make_tuple(x), arg.args)); \ +} } // Building diff --git a/src/libs/utils/layoutbuilder.h b/src/libs/utils/layoutbuilder.h index 4eac8642ee8..f11bce70be1 100644 --- a/src/libs/utils/layoutbuilder.h +++ b/src/libs/utils/layoutbuilder.h @@ -414,12 +414,11 @@ QTC_DEFINE_BUILDER_SETTER(toolTip, setToolTip) QTC_DEFINE_BUILDER_SETTER(windowTitle, setWindowTitle) QTC_DEFINE_BUILDER_SETTER(wordWrap, setWordWrap); QTC_DEFINE_BUILDER_SETTER(orientation, setOrientation); -QTC_DEFINE_BUILDER_SETTER2(columnStretch, setColumnStretch) -QTC_DEFINE_BUILDER_SETTER2(onClicked, onClicked) -QTC_DEFINE_BUILDER_SETTER2(onLinkHovered, onLinkHovered) -QTC_DEFINE_BUILDER_SETTER2(onTextChanged, onTextChanged) -QTC_DEFINE_BUILDER_SETTER2(stretchFactor, setStretchFactor) -QTC_DEFINE_BUILDER_SETTER4(customMargins, setContentsMargins) +QTC_DEFINE_BUILDER_SETTER(columnStretch, setColumnStretch) +QTC_DEFINE_BUILDER_SETTER(onClicked, onClicked) +QTC_DEFINE_BUILDER_SETTER(onLinkHovered, onLinkHovered) +QTC_DEFINE_BUILDER_SETTER(onTextChanged, onTextChanged) +QTC_DEFINE_BUILDER_SETTER(customMargins, setContentsMargins) // Nesting dispatchers