refs #140 added streaming for tuples to QDebug

This commit is contained in:
Mathew Sutcliffe
2014-03-31 22:43:49 +01:00
parent a34357603d
commit 8405049a85
2 changed files with 174 additions and 0 deletions

View File

@@ -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<U> &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<T>::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<sizeof...(Ts)>::unmarshall(arg, tu);
}
/*!
* \brief Stream a tuple to qDebug.
* \ingroup Tuples
*/
template <class... Ts>
QDebug operator <<(QDebug debug, std::tuple<Ts &...> tu)
{
return Private::TupleHelper<sizeof...(Ts)>::debug(debug, tu);
}
/*!
* \brief Stream a tuple to qDebug.
* \ingroup Tuples
*/
template <class... Ts>
QNoDebug operator <<(QNoDebug noDebug, std::tuple<Ts &...> 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 <class T0>
QDebug operator <<(QDebug debug, std::tuple<T0> tu)
{
return Private::TupleHelper<1>::debug(debug, tu);
}
template <class T0, class T1>
QDebug operator <<(QDebug debug, std::tuple<T0, T1> tu)
{
return Private::TupleHelper<2>::debug(debug, tu);
}
template <class T0, class T1, class T2>
QDebug operator <<(QDebug debug, std::tuple<T0, T1, T2> tu)
{
return Private::TupleHelper<3>::debug(debug, tu);
}
template <class T0, class T1, class T2, class T3>
QDebug operator <<(QDebug debug, std::tuple<T0, T1, T2, T3> tu)
{
return Private::TupleHelper<4>::debug(debug, tu);
}
template <class T0, class T1, class T2, class T3, class T4>
QDebug operator <<(QDebug debug, std::tuple<T0, T1, T2, T3, T4> tu)
{
return Private::TupleHelper<5>::debug(debug, tu);
}
template <class T0, class T1, class T2, class T3, class T4, class T5>
QDebug operator <<(QDebug debug, std::tuple<T0, T1, T2, T3, T4, T5> tu)
{
return Private::TupleHelper<6>::debug(debug, tu);
}
template <class T0, class T1, class T2, class T3, class T4, class T5, class T6>
QDebug operator <<(QDebug debug, std::tuple<T0, T1, T2, T3, T4, T5, T6> tu)
{
return Private::TupleHelper<7>::debug(debug, tu);
}
template <class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7>
QDebug operator <<(QDebug debug, std::tuple<T0, T1, T2, T3, T4, T5, T6, T7> tu)
{
return Private::TupleHelper<8>::debug(debug, tu);
}
template <class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>
QDebug operator <<(QDebug debug, std::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8> tu)
{
return Private::TupleHelper<9>::debug(debug, tu);
}
template <class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9>
QDebug operator <<(QDebug debug, std::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> tu)
{
return Private::TupleHelper<10>::debug(debug, tu);
}
inline QNoDebug operator <<(QNoDebug noDebug, std::tuple<>)
{
return noDebug;
}
template <class T0>
QNoDebug operator <<(QNoDebug noDebug, std::tuple<T0>)
{
return noDebug;
}
template <class T0, class T1>
QNoDebug operator <<(QNoDebug noDebug, std::tuple<T0, T1>)
{
return noDebug;
}
template <class T0, class T1, class T2>
QNoDebug operator <<(QNoDebug noDebug, std::tuple<T0, T1, T2>)
{
return noDebug;
}
template <class T0, class T1, class T2, class T3>
QNoDebug operator <<(QNoDebug noDebug, std::tuple<T0, T1, T2, T3>)
{
return noDebug;
}
template <class T0, class T1, class T2, class T3, class T4>
QNoDebug operator <<(QNoDebug noDebug, std::tuple<T0, T1, T2, T3, T4>)
{
return noDebug;
}
template <class T0, class T1, class T2, class T3, class T4, class T5>
QNoDebug operator <<(QNoDebug noDebug, std::tuple<T0, T1, T2, T3, T4, T5>)
{
return noDebug;
}
template <class T0, class T1, class T2, class T3, class T4, class T5, class T6>
QNoDebug operator <<(QNoDebug noDebug, std::tuple<T0, T1, T2, T3, T4, T5, T6>)
{
return noDebug;
}
template <class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7>
QNoDebug operator <<(QNoDebug noDebug, std::tuple<T0, T1, T2, T3, T4, T5, T6, T7>)
{
return noDebug;
}
template <class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>
QNoDebug operator <<(QNoDebug noDebug, std::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8>)
{
return noDebug;
}
template <class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9>
QNoDebug operator <<(QNoDebug noDebug, std::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>)
{
return noDebug;
}
inline void deserializeJson(const QJsonObject &json, const QStringList &members, std::tuple<> tu)
{
Private::TupleHelper<0>::deserializeJson(json, members, tu);

View File

@@ -18,6 +18,7 @@
#include <QJsonObject>
#include <QDateTime>
#include <QString>
#include <QDebug>
#include <tuple>
#include <type_traits>
#include <functional>
@@ -182,6 +183,12 @@ namespace BlackMisc
return TupleHelper < N - 1 >::unmarshall(arg, tu) >> std::get < N - 1 > (tu);
}
template <class Tu>
static QDebug debug(QDebug dbg, Tu &tu)
{
return TupleHelper < N - 1 >::debug(dbg, tu) << std::get < N - 1 > (tu);
}
template <class Tu>
static uint hash(const Tu &tu)
{
@@ -214,6 +221,8 @@ namespace BlackMisc
template <class Tu>
static const QDBusArgument &unmarshall(const QDBusArgument &arg, Tu &) { return arg; }
template <class Tu>
static QDebug debug(QDebug dbg, Tu &) { return dbg; }
template <class Tu>
static uint hash(const Tu &) { return 0; }
template <class Tu>
static void serializeJson(QJsonObject &, const QStringList &, const Tu &) {}