From e1e024e62e54e1d4d05f309a0fa041b8748283e6 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Sun, 23 Mar 2014 21:09:55 +0000 Subject: [PATCH] Change compare to be recursive in the case of nested calls to tie. refs #182 --- src/blackmisc/tuple_private.h | 48 ++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/src/blackmisc/tuple_private.h b/src/blackmisc/tuple_private.h index 6e6336f55..aad5a2479 100644 --- a/src/blackmisc/tuple_private.h +++ b/src/blackmisc/tuple_private.h @@ -29,6 +29,46 @@ namespace BlackMisc namespace Private { +#ifdef Q_COMPILER_VARIADIC_TEMPLATES + + // Helper trait to detect whether a class is a tuple. + //! \private + //! @{ + template + struct IsTuple : public std::false_type {}; + template + struct IsTuple> : public std::true_type {}; + //! @} + +#else // !Q_COMPILER_VARIADIC_TEMPLATES + + template + struct IsTuple : public std::false_type {}; + template <> + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + +#endif // !Q_COMPILER_VARIADIC_TEMPLATES + // Using SFINAE to help detect missing BLACK_ENABLE_TUPLE_CONVERSION macro in static_assert //! \private std::false_type hasEnabledTupleConversionHelper(...); @@ -67,12 +107,8 @@ namespace BlackMisc template int compareHelper(const Tu &a, const Tu &b) { - typedef typename std::is_base_of < - CValueObject, - typename std::decay < - typename std::tuple_element::type - >::type - >::type isCValueObjectTag; + typedef typename std::decay::type>::type Element; + typedef std::integral_constant::value || IsTuple::value> isCValueObjectTag; return compareHelper(std::get(a), std::get(b), isCValueObjectTag()); }