diff --git a/src/blackmisc/tuple.h b/src/blackmisc/tuple.h index c428b76d2..0e07cf741 100644 --- a/src/blackmisc/tuple.h +++ b/src/blackmisc/tuple.h @@ -64,6 +64,11 @@ static QStringList members = QString(#MEMBERS).replace("tie(","").replace("(","").replace(")","").replace(" ","").replace("o.","").split(","); \ return members; \ } \ + public: \ + static auto constToTuple(const T &o) -> decltype(BlackMisc::tie MEMBERS) \ + { \ + return BlackMisc::tie MEMBERS; \ + } \ }; \ } @@ -93,6 +98,11 @@ static QStringList members = QString(#MEMBERS).replace("tie(","").replace("(","").replace(")","").replace(" ","").replace("o.","").split(","); \ return members; \ } \ + public: \ + static auto constToTuple(const T &o) -> decltype(BlackMisc::tie MEMBERS) \ + { \ + return BlackMisc::tie MEMBERS; \ + } \ }; \ } @@ -135,6 +145,10 @@ namespace BlackMisc Q_UNUSED(object); return std::tuple<>(); } + static std::tuple<> constToTuple(const T &object) + { + return toTuple(object); + } static const QStringList jsonMembers() { static_assert(std::is_void::value, // always false; is_void<> trick is just to make the condition dependent on the template parameter T @@ -197,6 +211,27 @@ namespace BlackMisc return Private::TupleHelper::unmarshall(arg, tu); } + /*! + * \brief Stream a tuple to qDebug. + * \ingroup Tuples + */ + template + QDebug operator <<(QDebug debug, std::tuple tu) + { + return Private::TupleHelper::debug(debug, tu); + } + + /*! + * \brief Stream a tuple to qDebug. + * \ingroup Tuples + */ + template + QNoDebug operator <<(QNoDebug noDebug, std::tuple tu) + { + Q_UNUSED(tu); + return noDebug; + } + /*! * \brief Generate a hash value from the elements of a tuple. * \ingroup Tuples @@ -507,6 +542,136 @@ namespace BlackMisc return Private::TupleHelper<10>::unmarshall(arg, tu); } + inline QDebug operator <<(QDebug debug, std::tuple<> tu) + { + return Private::TupleHelper<0>::debug(debug, tu); + } + + template + QDebug operator <<(QDebug debug, std::tuple tu) + { + return Private::TupleHelper<1>::debug(debug, tu); + } + + template + QDebug operator <<(QDebug debug, std::tuple tu) + { + return Private::TupleHelper<2>::debug(debug, tu); + } + + template + QDebug operator <<(QDebug debug, std::tuple tu) + { + return Private::TupleHelper<3>::debug(debug, tu); + } + + template + QDebug operator <<(QDebug debug, std::tuple tu) + { + return Private::TupleHelper<4>::debug(debug, tu); + } + + template + QDebug operator <<(QDebug debug, std::tuple tu) + { + return Private::TupleHelper<5>::debug(debug, tu); + } + + template + QDebug operator <<(QDebug debug, std::tuple tu) + { + return Private::TupleHelper<6>::debug(debug, tu); + } + + template + QDebug operator <<(QDebug debug, std::tuple tu) + { + return Private::TupleHelper<7>::debug(debug, tu); + } + + template + QDebug operator <<(QDebug debug, std::tuple tu) + { + return Private::TupleHelper<8>::debug(debug, tu); + } + + template + QDebug operator <<(QDebug debug, std::tuple tu) + { + return Private::TupleHelper<9>::debug(debug, tu); + } + + template + QDebug operator <<(QDebug debug, std::tuple tu) + { + return Private::TupleHelper<10>::debug(debug, tu); + } + + inline QNoDebug operator <<(QNoDebug noDebug, std::tuple<>) + { + return noDebug; + } + + template + QNoDebug operator <<(QNoDebug noDebug, std::tuple) + { + return noDebug; + } + + template + QNoDebug operator <<(QNoDebug noDebug, std::tuple) + { + return noDebug; + } + + template + QNoDebug operator <<(QNoDebug noDebug, std::tuple) + { + return noDebug; + } + + template + QNoDebug operator <<(QNoDebug noDebug, std::tuple) + { + return noDebug; + } + + template + QNoDebug operator <<(QNoDebug noDebug, std::tuple) + { + return noDebug; + } + + template + QNoDebug operator <<(QNoDebug noDebug, std::tuple) + { + return noDebug; + } + + template + QNoDebug operator <<(QNoDebug noDebug, std::tuple) + { + return noDebug; + } + + template + QNoDebug operator <<(QNoDebug noDebug, std::tuple) + { + return noDebug; + } + + template + QNoDebug operator <<(QNoDebug noDebug, std::tuple) + { + return noDebug; + } + + template + QNoDebug operator <<(QNoDebug noDebug, std::tuple) + { + return noDebug; + } + inline void deserializeJson(const QJsonObject &json, const QStringList &members, std::tuple<> tu) { Private::TupleHelper<0>::deserializeJson(json, members, tu); diff --git a/src/blackmisc/tuple_private.h b/src/blackmisc/tuple_private.h index 40a1477e1..c60086353 100644 --- a/src/blackmisc/tuple_private.h +++ b/src/blackmisc/tuple_private.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -182,6 +183,12 @@ namespace BlackMisc return TupleHelper < N - 1 >::unmarshall(arg, tu) >> std::get < N - 1 > (tu); } + template + static QDebug debug(QDebug dbg, Tu &tu) + { + return TupleHelper < N - 1 >::debug(dbg, tu) << std::get < N - 1 > (tu); + } + template static uint hash(const Tu &tu) { @@ -214,6 +221,8 @@ namespace BlackMisc template static const QDBusArgument &unmarshall(const QDBusArgument &arg, Tu &) { return arg; } template + static QDebug debug(QDebug dbg, Tu &) { return dbg; } + template static uint hash(const Tu &) { return 0; } template static void serializeJson(QJsonObject &, const QStringList &, const Tu &) {}