Replace custom type traits with std one's
Remove most type traits from qtypetraits.h, but keep the custom implementation of is_signed/is_unsigned. This gets rid of BSD-3 licensed code from Google in a public header (hugh!). The custom implementations for is_signed/is_unsigned are kept because the implementations in gcc's standard headers do not work as we expect for enums - both is_signed and is_unsigned always returns false there - see also https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59027 [ChangeLog][QtCore][General] Qt now relies on type traits from the C++ standard library. Change-Id: I3f2188b46949f04ca4482a6ac9afd3482103f0e1 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
b5fa247102
commit
ed7f77071d
@ -102,7 +102,7 @@ public:
|
||||
// the definition below is too complex for qdoc
|
||||
typedef int Int;
|
||||
#else
|
||||
typedef typename QtPrivate::if_<
|
||||
typedef typename std::conditional<
|
||||
QtPrivate::is_unsigned<Enum>::value,
|
||||
unsigned int,
|
||||
signed int
|
||||
|
@ -42,6 +42,7 @@
|
||||
#define QGLOBAL_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
# include <type_traits>
|
||||
# include <cstddef>
|
||||
#endif
|
||||
|
||||
@ -963,7 +964,7 @@ public:
|
||||
// - if there was a break inside the inner loop, it will exit with control still
|
||||
// set to 1; in that case, the outer loop will invert it to 0 and will exit too
|
||||
#define Q_FOREACH(variable, container) \
|
||||
for (QForeachContainer<typename QtPrivate::remove_reference<decltype(container)>::type> _container_((container)); \
|
||||
for (QForeachContainer<typename std::remove_reference<decltype(container)>::type> _container_((container)); \
|
||||
_container_.control && _container_.i != _container_.e; \
|
||||
++_container_.i, _container_.control ^= 1) \
|
||||
for (variable = *_container_.i; _container_.control; _container_.control = 0)
|
||||
|
@ -55,8 +55,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef Q_IS_ENUM
|
||||
# include <QtCore/qtypetraits.h>
|
||||
# define Q_IS_ENUM(x) QtPrivate::is_enum<x>::value
|
||||
# define Q_IS_ENUM(x) std::is_enum<x>::value
|
||||
#endif
|
||||
|
||||
// shut up syncqt
|
||||
|
@ -172,7 +172,7 @@ static inline bool qt_is_finite(float f)
|
||||
// Unsigned overflow math
|
||||
//
|
||||
namespace {
|
||||
template <typename T> inline typename QtPrivate::QEnableIf<QtPrivate::is_unsigned<T>::value, bool>::Type
|
||||
template <typename T> inline typename QtPrivate::QEnableIf<std::is_unsigned<T>::value, bool>::Type
|
||||
add_overflow(T v1, T v2, T *r)
|
||||
{
|
||||
// unsigned additions are well-defined
|
||||
@ -180,7 +180,7 @@ add_overflow(T v1, T v2, T *r)
|
||||
return v1 > T(v1 + v2);
|
||||
}
|
||||
|
||||
template <typename T> inline typename QtPrivate::QEnableIf<QtPrivate::is_unsigned<T>::value, bool>::Type
|
||||
template <typename T> inline typename QtPrivate::QEnableIf<std::is_unsigned<T>::value, bool>::Type
|
||||
mul_overflow(T v1, T v2, T *r)
|
||||
{
|
||||
// use the next biggest type
|
||||
|
@ -38,12 +38,13 @@
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <QtCore/qtypetraits.h>
|
||||
#include <QtCore/qisenum.h>
|
||||
|
||||
#ifndef QTYPEINFO_H
|
||||
#define QTYPEINFO_H
|
||||
|
||||
#include <QtCore/qglobal.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
/*
|
||||
@ -60,7 +61,7 @@ class QTypeInfo
|
||||
public:
|
||||
enum {
|
||||
isPointer = false,
|
||||
isIntegral = QtPrivate::is_integral<T>::value,
|
||||
isIntegral = std::is_integral<T>::value,
|
||||
isComplex = true,
|
||||
isStatic = true,
|
||||
isRelocatable = Q_IS_ENUM(T),
|
||||
@ -247,7 +248,7 @@ public: \
|
||||
isRelocatable = !isStatic || ((FLAGS) & Q_RELOCATABLE_TYPE), \
|
||||
isLarge = (sizeof(TYPE)>sizeof(void*)), \
|
||||
isPointer = false, \
|
||||
isIntegral = QtPrivate::is_integral< TYPE >::value, \
|
||||
isIntegral = std::is_integral< TYPE >::value, \
|
||||
isDummy = (((FLAGS) & Q_DUMMY_TYPE) != 0), \
|
||||
sizeOf = sizeof(TYPE) \
|
||||
}; \
|
||||
|
@ -37,451 +37,28 @@
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
// BEGIN Google Code
|
||||
|
||||
// Copyright (c) 2006, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// ----
|
||||
//
|
||||
// This code is compiled directly on many platforms, including client
|
||||
// platforms like Windows, Mac, and embedded systems. Before making
|
||||
// any changes here, make sure that you're not breaking any platforms.
|
||||
//
|
||||
// Define a small subset of tr1 type traits. The traits we define are:
|
||||
// is_integral
|
||||
// is_floating_point
|
||||
// is_pointer
|
||||
// is_enum
|
||||
// is_reference
|
||||
// is_const
|
||||
// is_volatile
|
||||
// is_pod
|
||||
// has_trivial_constructor
|
||||
// has_trivial_copy
|
||||
// has_trivial_assign
|
||||
// has_trivial_destructor
|
||||
// is_signed
|
||||
// is_unsigned
|
||||
// remove_const
|
||||
// remove_volatile
|
||||
// remove_cv
|
||||
// remove_reference
|
||||
// add_reference
|
||||
// remove_pointer
|
||||
// is_same
|
||||
// is_convertible
|
||||
// We can add more type traits as required.
|
||||
|
||||
// Changes from the original implementation:
|
||||
// - Move base types from template_util.h directly into this header.
|
||||
// - Use Qt macros for long long type differences on Windows.
|
||||
// - Enclose in QtPrivate namespace.
|
||||
|
||||
#include "QtCore/qglobal.h"
|
||||
|
||||
#ifndef QTYPETRAITS_H
|
||||
#define QTYPETRAITS_H
|
||||
|
||||
#include <utility> // For pair
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QtPrivate {
|
||||
|
||||
// Types small_ and big_ are guaranteed such that sizeof(small_) <
|
||||
// sizeof(big_)
|
||||
typedef char small_;
|
||||
|
||||
struct big_ {
|
||||
char dummy[2];
|
||||
};
|
||||
|
||||
// Identity metafunction.
|
||||
template <class T>
|
||||
struct identity_ {
|
||||
typedef T type;
|
||||
};
|
||||
|
||||
// integral_constant, defined in tr1, is a wrapper for an integer
|
||||
// value. We don't really need this generality; we could get away
|
||||
// with hardcoding the integer type to bool. We use the fully
|
||||
// general integer_constant for compatibility with tr1.
|
||||
|
||||
template<class T, T v>
|
||||
struct integral_constant {
|
||||
static const T value = v;
|
||||
typedef T value_type;
|
||||
typedef integral_constant<T, v> type;
|
||||
};
|
||||
|
||||
template <class T, T v> const T integral_constant<T, v>::value;
|
||||
|
||||
|
||||
// Abbreviations: true_type and false_type are structs that represent boolean
|
||||
// true and false values. Also define the boost::mpl versions of those names,
|
||||
// true_ and false_.
|
||||
typedef integral_constant<bool, true> true_type;
|
||||
typedef integral_constant<bool, false> false_type;
|
||||
typedef true_type true_;
|
||||
typedef false_type false_;
|
||||
|
||||
// if_ is a templatized conditional statement.
|
||||
// if_<cond, A, B> is a compile time evaluation of cond.
|
||||
// if_<>::type contains A if cond is true, B otherwise.
|
||||
template<bool cond, typename A, typename B>
|
||||
struct if_{
|
||||
typedef A type;
|
||||
};
|
||||
|
||||
template<typename A, typename B>
|
||||
struct if_<false, A, B> {
|
||||
typedef B type;
|
||||
};
|
||||
|
||||
|
||||
// type_equals_ is a template type comparator, similar to Loki IsSameType.
|
||||
// type_equals_<A, B>::value is true iff "A" is the same type as "B".
|
||||
//
|
||||
// New code should prefer base::is_same, defined in base/type_traits.h.
|
||||
// It is functionally identical, but is_same is the standard spelling.
|
||||
template<typename A, typename B>
|
||||
struct type_equals_ : public false_ {
|
||||
};
|
||||
|
||||
template<typename A>
|
||||
struct type_equals_<A, A> : public true_ {
|
||||
};
|
||||
|
||||
// and_ is a template && operator.
|
||||
// and_<A, B>::value evaluates "A::value && B::value".
|
||||
template<typename A, typename B>
|
||||
struct and_ : public integral_constant<bool, (A::value && B::value)> {
|
||||
};
|
||||
|
||||
// or_ is a template || operator.
|
||||
// or_<A, B>::value evaluates "A::value || B::value".
|
||||
template<typename A, typename B>
|
||||
struct or_ : public integral_constant<bool, (A::value || B::value)> {
|
||||
};
|
||||
|
||||
template <class T> struct is_integral;
|
||||
template <class T> struct is_floating_point;
|
||||
template <class T> struct is_pointer;
|
||||
// MSVC can't compile this correctly, and neither can gcc 3.3.5 (at least)
|
||||
#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3)
|
||||
// is_enum uses is_convertible, which is not available on MSVC.
|
||||
template <class T> struct is_enum;
|
||||
#endif
|
||||
template <class T> struct is_reference;
|
||||
template <class T> struct is_pod;
|
||||
template <class T> struct has_trivial_constructor;
|
||||
template <class T> struct has_trivial_copy;
|
||||
template <class T> struct has_trivial_assign;
|
||||
template <class T> struct has_trivial_destructor;
|
||||
template <class T> struct remove_const;
|
||||
template <class T> struct remove_volatile;
|
||||
template <class T> struct remove_cv;
|
||||
template <class T> struct remove_reference;
|
||||
template <class T> struct add_reference;
|
||||
template <class T> struct remove_pointer;
|
||||
template <class T, class U> struct is_same;
|
||||
#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3)
|
||||
template <class From, class To> struct is_convertible;
|
||||
#endif
|
||||
|
||||
// is_integral is false except for the built-in integer types. A
|
||||
// cv-qualified type is integral if and only if the underlying type is.
|
||||
template <class T> struct is_integral : false_type { };
|
||||
template<> struct is_integral<bool> : true_type { };
|
||||
template<> struct is_integral<char> : true_type { };
|
||||
template<> struct is_integral<unsigned char> : true_type { };
|
||||
template<> struct is_integral<signed char> : true_type { };
|
||||
#if defined(_MSC_VER)
|
||||
// wchar_t is not by default a distinct type from unsigned short in
|
||||
// Microsoft C.
|
||||
// See http://msdn2.microsoft.com/en-us/library/dh8che7s(VS.80).aspx
|
||||
template<> struct is_integral<__wchar_t> : true_type { };
|
||||
#else
|
||||
template<> struct is_integral<wchar_t> : true_type { };
|
||||
#endif
|
||||
template<> struct is_integral<short> : true_type { };
|
||||
template<> struct is_integral<unsigned short> : true_type { };
|
||||
template<> struct is_integral<int> : true_type { };
|
||||
template<> struct is_integral<unsigned int> : true_type { };
|
||||
template<> struct is_integral<long> : true_type { };
|
||||
template<> struct is_integral<unsigned long> : true_type { };
|
||||
#if defined(Q_OS_WIN) && !defined(Q_CC_GNU)
|
||||
template<> struct is_integral<__int64> : true_type { };
|
||||
template<> struct is_integral<unsigned __int64> : true_type { };
|
||||
#else
|
||||
template<> struct is_integral<long long> : true_type { };
|
||||
template<> struct is_integral<unsigned long long> : true_type { };
|
||||
#endif
|
||||
template <class T> struct is_integral<const T> : is_integral<T> { };
|
||||
template <class T> struct is_integral<volatile T> : is_integral<T> { };
|
||||
template <class T> struct is_integral<const volatile T> : is_integral<T> { };
|
||||
#if defined (Q_COMPILER_UNICODE_STRINGS)
|
||||
template<> struct is_integral<char16_t> : true_type { };
|
||||
template<> struct is_integral<char32_t> : true_type { };
|
||||
#endif
|
||||
|
||||
// is_floating_point is false except for the built-in floating-point types.
|
||||
// A cv-qualified type is integral if and only if the underlying type is.
|
||||
template <class T> struct is_floating_point : false_type { };
|
||||
template<> struct is_floating_point<float> : true_type { };
|
||||
template<> struct is_floating_point<double> : true_type { };
|
||||
template<> struct is_floating_point<long double> : true_type { };
|
||||
template <class T> struct is_floating_point<const T>
|
||||
: is_floating_point<T> { };
|
||||
template <class T> struct is_floating_point<volatile T>
|
||||
: is_floating_point<T> { };
|
||||
template <class T> struct is_floating_point<const volatile T>
|
||||
: is_floating_point<T> { };
|
||||
|
||||
// is_pointer is false except for pointer types. A cv-qualified type (e.g.
|
||||
// "int* const", as opposed to "int const*") is cv-qualified if and only if
|
||||
// the underlying type is.
|
||||
template <class T> struct is_pointer : false_type { };
|
||||
template <class T> struct is_pointer<T*> : true_type { };
|
||||
template <class T> struct is_pointer<const T> : is_pointer<T> { };
|
||||
template <class T> struct is_pointer<volatile T> : is_pointer<T> { };
|
||||
template <class T> struct is_pointer<const volatile T> : is_pointer<T> { };
|
||||
|
||||
#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3)
|
||||
|
||||
namespace internal {
|
||||
|
||||
template <class T> struct is_class_or_union {
|
||||
template <class U> static small_ tester(void (U::*)());
|
||||
template <class U> static big_ tester(...);
|
||||
static const bool value = sizeof(tester<T>(0)) == sizeof(small_);
|
||||
};
|
||||
|
||||
// is_convertible chokes if the first argument is an array. That's why
|
||||
// we use add_reference here.
|
||||
template <bool NotUnum, class T> struct is_enum_impl
|
||||
: is_convertible<typename add_reference<T>::type, int> { };
|
||||
|
||||
template <class T> struct is_enum_impl<true, T> : false_type { };
|
||||
|
||||
} // namespace internal
|
||||
|
||||
// Specified by TR1 [4.5.1] primary type categories.
|
||||
|
||||
// Implementation note:
|
||||
// define custom is_signed, is_unsigned that also works with enum's
|
||||
//
|
||||
// Each type is either void, integral, floating point, array, pointer,
|
||||
// reference, member object pointer, member function pointer, enum,
|
||||
// union or class. Out of these, only integral, floating point, reference,
|
||||
// class and enum types are potentially convertible to int. Therefore,
|
||||
// if a type is not a reference, integral, floating point or class and
|
||||
// is convertible to int, it's a enum. Adding cv-qualification to a type
|
||||
// does not change whether it's an enum.
|
||||
//
|
||||
// Is-convertible-to-int check is done only if all other checks pass,
|
||||
// because it can't be used with some types (e.g. void or classes with
|
||||
// inaccessible conversion operators).
|
||||
template <class T> struct is_enum
|
||||
: internal::is_enum_impl<
|
||||
is_same<T, void>::value ||
|
||||
is_integral<T>::value ||
|
||||
is_floating_point<T>::value ||
|
||||
is_reference<T>::value ||
|
||||
internal::is_class_or_union<T>::value,
|
||||
T> { };
|
||||
|
||||
template <class T> struct is_enum<const T> : is_enum<T> { };
|
||||
template <class T> struct is_enum<volatile T> : is_enum<T> { };
|
||||
template <class T> struct is_enum<const volatile T> : is_enum<T> { };
|
||||
|
||||
#endif
|
||||
|
||||
// is_reference is false except for reference types.
|
||||
template<typename T> struct is_reference : false_type {};
|
||||
template<typename T> struct is_reference<T&> : true_type {};
|
||||
|
||||
// Specified by TR1 [4.5.3] Type Properties
|
||||
template <typename T> struct is_const : false_type {};
|
||||
template <typename T> struct is_const<const T> : true_type {};
|
||||
template <typename T> struct is_volatile : false_type {};
|
||||
template <typename T> struct is_volatile<volatile T> : true_type {};
|
||||
|
||||
// We can't get is_pod right without compiler help, so fail conservatively.
|
||||
// We will assume it's false except for arithmetic types, enumerations,
|
||||
// pointers and cv-qualified versions thereof. Note that std::pair<T,U>
|
||||
// is not a POD even if T and U are PODs.
|
||||
template <class T> struct is_pod
|
||||
: integral_constant<bool, (is_integral<T>::value ||
|
||||
is_floating_point<T>::value ||
|
||||
#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3)
|
||||
// is_enum is not available on MSVC.
|
||||
is_enum<T>::value ||
|
||||
#endif
|
||||
is_pointer<T>::value)> { };
|
||||
template <class T> struct is_pod<const T> : is_pod<T> { };
|
||||
template <class T> struct is_pod<volatile T> : is_pod<T> { };
|
||||
template <class T> struct is_pod<const volatile T> : is_pod<T> { };
|
||||
|
||||
|
||||
// We can't get has_trivial_constructor right without compiler help, so
|
||||
// fail conservatively. We will assume it's false except for: (1) types
|
||||
// for which is_pod is true. (2) std::pair of types with trivial
|
||||
// constructors. (3) array of a type with a trivial constructor.
|
||||
// (4) const versions thereof.
|
||||
template <class T> struct has_trivial_constructor : is_pod<T> { };
|
||||
template <class T, class U> struct has_trivial_constructor<std::pair<T, U> >
|
||||
: integral_constant<bool,
|
||||
(has_trivial_constructor<T>::value &&
|
||||
has_trivial_constructor<U>::value)> { };
|
||||
template <class A, int N> struct has_trivial_constructor<A[N]>
|
||||
: has_trivial_constructor<A> { };
|
||||
template <class T> struct has_trivial_constructor<const T>
|
||||
: has_trivial_constructor<T> { };
|
||||
|
||||
// We can't get has_trivial_copy right without compiler help, so fail
|
||||
// conservatively. We will assume it's false except for: (1) types
|
||||
// for which is_pod is true. (2) std::pair of types with trivial copy
|
||||
// constructors. (3) array of a type with a trivial copy constructor.
|
||||
// (4) const versions thereof.
|
||||
template <class T> struct has_trivial_copy : is_pod<T> { };
|
||||
template <class T, class U> struct has_trivial_copy<std::pair<T, U> >
|
||||
: integral_constant<bool,
|
||||
(has_trivial_copy<T>::value &&
|
||||
has_trivial_copy<U>::value)> { };
|
||||
template <class A, int N> struct has_trivial_copy<A[N]>
|
||||
: has_trivial_copy<A> { };
|
||||
template <class T> struct has_trivial_copy<const T> : has_trivial_copy<T> { };
|
||||
|
||||
// We can't get has_trivial_assign right without compiler help, so fail
|
||||
// conservatively. We will assume it's false except for: (1) types
|
||||
// for which is_pod is true. (2) std::pair of types with trivial copy
|
||||
// constructors. (3) array of a type with a trivial assign constructor.
|
||||
template <class T> struct has_trivial_assign : is_pod<T> { };
|
||||
template <class T, class U> struct has_trivial_assign<std::pair<T, U> >
|
||||
: integral_constant<bool,
|
||||
(has_trivial_assign<T>::value &&
|
||||
has_trivial_assign<U>::value)> { };
|
||||
template <class A, int N> struct has_trivial_assign<A[N]>
|
||||
: has_trivial_assign<A> { };
|
||||
|
||||
// We can't get has_trivial_destructor right without compiler help, so
|
||||
// fail conservatively. We will assume it's false except for: (1) types
|
||||
// for which is_pod is true. (2) std::pair of types with trivial
|
||||
// destructors. (3) array of a type with a trivial destructor.
|
||||
// (4) const versions thereof.
|
||||
template <class T> struct has_trivial_destructor : is_pod<T> { };
|
||||
template <class T, class U> struct has_trivial_destructor<std::pair<T, U> >
|
||||
: integral_constant<bool,
|
||||
(has_trivial_destructor<T>::value &&
|
||||
has_trivial_destructor<U>::value)> { };
|
||||
template <class A, int N> struct has_trivial_destructor<A[N]>
|
||||
: has_trivial_destructor<A> { };
|
||||
template <class T> struct has_trivial_destructor<const T>
|
||||
: has_trivial_destructor<T> { };
|
||||
|
||||
// Specified by TR1 [4.7.1]
|
||||
template<typename T> struct remove_const { typedef T type; };
|
||||
template<typename T> struct remove_const<T const> { typedef T type; };
|
||||
template<typename T> struct remove_volatile { typedef T type; };
|
||||
template<typename T> struct remove_volatile<T volatile> { typedef T type; };
|
||||
template<typename T> struct remove_cv {
|
||||
typedef typename remove_const<typename remove_volatile<T>::type>::type type;
|
||||
};
|
||||
|
||||
|
||||
// Specified by TR1 [4.7.2] Reference modifications.
|
||||
template<typename T> struct remove_reference { typedef T type; };
|
||||
template<typename T> struct remove_reference<T&> { typedef T type; };
|
||||
|
||||
template <typename T> struct add_reference { typedef T& type; };
|
||||
template <typename T> struct add_reference<T&> { typedef T& type; };
|
||||
|
||||
// Specified by TR1 [4.7.4] Pointer modifications.
|
||||
template<typename T> struct remove_pointer { typedef T type; };
|
||||
template<typename T> struct remove_pointer<T*> { typedef T type; };
|
||||
template<typename T> struct remove_pointer<T* const> { typedef T type; };
|
||||
template<typename T> struct remove_pointer<T* volatile> { typedef T type; };
|
||||
template<typename T> struct remove_pointer<T* const volatile> {
|
||||
typedef T type; };
|
||||
|
||||
// Specified by TR1 [4.6] Relationships between types
|
||||
template<typename T, typename U> struct is_same : public false_type { };
|
||||
template<typename T> struct is_same<T, T> : public true_type { };
|
||||
|
||||
// Specified by TR1 [4.6] Relationships between types
|
||||
#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3)
|
||||
namespace internal {
|
||||
|
||||
// This class is an implementation detail for is_convertible, and you
|
||||
// don't need to know how it works to use is_convertible. For those
|
||||
// who care: we declare two different functions, one whose argument is
|
||||
// of type To and one with a variadic argument list. We give them
|
||||
// return types of different size, so we can use sizeof to trick the
|
||||
// compiler into telling us which function it would have chosen if we
|
||||
// had called it with an argument of type From. See Alexandrescu's
|
||||
// _Modern C++ Design_ for more details on this sort of trick.
|
||||
|
||||
template <typename From, typename To>
|
||||
struct ConvertHelper {
|
||||
static small_ Test(To);
|
||||
static big_ Test(...);
|
||||
static From Create();
|
||||
};
|
||||
} // namespace internal
|
||||
|
||||
// Inherits from true_type if From is convertible to To, false_type otherwise.
|
||||
template <typename From, typename To>
|
||||
struct is_convertible
|
||||
: integral_constant<bool,
|
||||
sizeof(internal::ConvertHelper<From, To>::Test(
|
||||
internal::ConvertHelper<From, To>::Create()))
|
||||
== sizeof(small_)> {
|
||||
};
|
||||
#endif
|
||||
|
||||
// END Google Code
|
||||
|
||||
// a metafunction to invert an integral_constant:
|
||||
template <typename T>
|
||||
struct not_
|
||||
: integral_constant<bool, !T::value> {};
|
||||
|
||||
// same, with a bool argument:
|
||||
template <bool B>
|
||||
struct not_c
|
||||
: integral_constant<bool, !B> {};
|
||||
: std::integral_constant<bool, !T::value> {};
|
||||
|
||||
// Checks whether a type is unsigned (T must be convertible to unsigned int):
|
||||
template <typename T>
|
||||
struct is_unsigned
|
||||
: integral_constant<bool, (T(0) < T(-1))> {};
|
||||
: std::integral_constant<bool, (T(0) < T(-1))> {};
|
||||
|
||||
// Checks whether a type is signed (T must be convertible to int):
|
||||
template <typename T>
|
||||
@ -512,27 +89,6 @@ Q_STATIC_ASSERT((!is_unsigned<qint64>::value));
|
||||
Q_STATIC_ASSERT((!is_signed<quint64>::value));
|
||||
Q_STATIC_ASSERT(( is_signed<qint64>::value));
|
||||
|
||||
template<class T = void> struct is_default_constructible;
|
||||
|
||||
template<> struct is_default_constructible<void>
|
||||
{
|
||||
protected:
|
||||
template<bool> struct test { typedef char type; };
|
||||
public:
|
||||
static bool const value = false;
|
||||
};
|
||||
template<> struct is_default_constructible<>::test<true> { typedef double type; };
|
||||
|
||||
template<class T> struct is_default_constructible : is_default_constructible<>
|
||||
{
|
||||
private:
|
||||
template<class U> static typename test<!!sizeof(::new U())>::type sfinae(U*);
|
||||
template<class U> static char sfinae(...);
|
||||
public:
|
||||
static bool const value = sizeof(sfinae<T>(0)) > 1;
|
||||
};
|
||||
|
||||
|
||||
} // namespace QtPrivate
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -46,7 +46,6 @@
|
||||
#include <QtCore/qbytearray.h>
|
||||
#include <QtCore/qvarlengtharray.h>
|
||||
#include <QtCore/qisenum.h>
|
||||
#include <QtCore/qtypetraits.h>
|
||||
#ifndef QT_NO_QOBJECT
|
||||
#include <QtCore/qobjectdefs.h>
|
||||
#endif
|
||||
@ -887,7 +886,7 @@ private:
|
||||
// is void* to avoid overloads conflicts. We do it by injecting unaccessible Dummy
|
||||
// type as part of the overload signature.
|
||||
struct Dummy {};
|
||||
typedef typename QtPrivate::if_<QtPrivate::is_same<value_type, void*>::value, Dummy, value_type>::type value_type_OR_Dummy;
|
||||
typedef typename std::conditional<std::is_same<value_type, void*>::value, Dummy, value_type>::type value_type_OR_Dummy;
|
||||
public:
|
||||
static void assign(void **ptr, const value_type_OR_Dummy *iterator )
|
||||
{
|
||||
@ -1092,7 +1091,7 @@ struct QSequentialIterableConvertFunctor
|
||||
}
|
||||
|
||||
namespace QtMetaTypePrivate {
|
||||
template<typename T, bool = QtPrivate::is_same<typename T::const_iterator::value_type, typename T::mapped_type>::value>
|
||||
template<typename T, bool = std::is_same<typename T::const_iterator::value_type, typename T::mapped_type>::value>
|
||||
struct AssociativeContainerAccessor
|
||||
{
|
||||
static const typename T::key_type& getKey(const typename T::const_iterator &it)
|
||||
@ -1106,7 +1105,7 @@ struct AssociativeContainerAccessor
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T, bool = QtPrivate::is_same<typename T::const_iterator::value_type, std::pair<const typename T::key_type, typename T::mapped_type> >::value>
|
||||
template<typename T, bool = std::is_same<typename T::const_iterator::value_type, std::pair<const typename T::key_type, typename T::mapped_type> >::value>
|
||||
struct StlStyleAssociativeContainerAccessor;
|
||||
|
||||
template<typename T>
|
||||
@ -1787,7 +1786,7 @@ template <typename T>
|
||||
struct QMetaTypeIdQObject<T, QMetaType::IsGadget>
|
||||
{
|
||||
enum {
|
||||
Defined = QtPrivate::is_default_constructible<T>::value
|
||||
Defined = std::is_default_constructible<T>::value
|
||||
};
|
||||
|
||||
static int qt_metatype_id()
|
||||
|
@ -155,14 +155,14 @@ public:
|
||||
template<typename T>
|
||||
inline T findChild(const QString &aName = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
|
||||
{
|
||||
typedef typename QtPrivate::remove_cv<typename QtPrivate::remove_pointer<T>::type>::type ObjType;
|
||||
typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type ObjType;
|
||||
return static_cast<T>(qt_qFindChild_helper(this, aName, ObjType::staticMetaObject, options));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
inline QList<T> findChildren(const QString &aName = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
|
||||
{
|
||||
typedef typename QtPrivate::remove_cv<typename QtPrivate::remove_pointer<T>::type>::type ObjType;
|
||||
typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type ObjType;
|
||||
QList<T> list;
|
||||
qt_qFindChildren_helper(this, aName, ObjType::staticMetaObject,
|
||||
reinterpret_cast<QList<void *> *>(&list), options);
|
||||
@ -173,7 +173,7 @@ public:
|
||||
template<typename T>
|
||||
inline QList<T> findChildren(const QRegExp &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
|
||||
{
|
||||
typedef typename QtPrivate::remove_cv<typename QtPrivate::remove_pointer<T>::type>::type ObjType;
|
||||
typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type ObjType;
|
||||
QList<T> list;
|
||||
qt_qFindChildren_helper(this, re, ObjType::staticMetaObject,
|
||||
reinterpret_cast<QList<void *> *>(&list), options);
|
||||
@ -185,7 +185,7 @@ public:
|
||||
template<typename T>
|
||||
inline QList<T> findChildren(const QRegularExpression &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
|
||||
{
|
||||
typedef typename QtPrivate::remove_cv<typename QtPrivate::remove_pointer<T>::type>::type ObjType;
|
||||
typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type ObjType;
|
||||
QList<T> list;
|
||||
qt_qFindChildren_helper(this, re, ObjType::staticMetaObject,
|
||||
reinterpret_cast<QList<void *> *>(&list), options);
|
||||
@ -493,7 +493,7 @@ inline QT_DEPRECATED QList<T> qFindChildren(const QObject *o, const QRegExp &re)
|
||||
template <class T>
|
||||
inline T qobject_cast(QObject *object)
|
||||
{
|
||||
typedef typename QtPrivate::remove_cv<typename QtPrivate::remove_pointer<T>::type>::type ObjType;
|
||||
typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type ObjType;
|
||||
Q_STATIC_ASSERT_X(QtPrivate::HasQ_OBJECT_Macro<ObjType>::Value,
|
||||
"qobject_cast requires the type to have a Q_OBJECT macro");
|
||||
return static_cast<T>(ObjType::staticMetaObject.cast(object));
|
||||
@ -502,7 +502,7 @@ inline T qobject_cast(QObject *object)
|
||||
template <class T>
|
||||
inline T qobject_cast(const QObject *object)
|
||||
{
|
||||
typedef typename QtPrivate::remove_cv<typename QtPrivate::remove_pointer<T>::type>::type ObjType;
|
||||
typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type ObjType;
|
||||
Q_STATIC_ASSERT_X(QtPrivate::HasQ_OBJECT_Macro<ObjType>::Value,
|
||||
"qobject_cast requires the type to have a Q_OBJECT macro");
|
||||
return static_cast<T>(ObjType::staticMetaObject.cast(object));
|
||||
|
@ -52,7 +52,7 @@ class QVariant;
|
||||
template <class T>
|
||||
class QPointer
|
||||
{
|
||||
Q_STATIC_ASSERT_X(!QtPrivate::is_pointer<T>::value, "QPointer's template type must not be a pointer type");
|
||||
Q_STATIC_ASSERT_X(!std::is_pointer<T>::value, "QPointer's template type must not be a pointer type");
|
||||
|
||||
template<typename U>
|
||||
struct TypeSelector
|
||||
|
@ -119,14 +119,14 @@ public:
|
||||
// singleShot to a functor or function pointer (without context)
|
||||
template <typename Duration, typename Func1>
|
||||
static inline typename QtPrivate::QEnableIf<!QtPrivate::FunctionPointer<Func1>::IsPointerToMemberFunction &&
|
||||
!QtPrivate::is_same<const char*, Func1>::value, void>::Type
|
||||
!std::is_same<const char*, Func1>::value, void>::Type
|
||||
singleShot(Duration interval, Func1 slot)
|
||||
{
|
||||
singleShot(interval, defaultTypeFor(interval), nullptr, slot);
|
||||
}
|
||||
template <typename Duration, typename Func1>
|
||||
static inline typename QtPrivate::QEnableIf<!QtPrivate::FunctionPointer<Func1>::IsPointerToMemberFunction &&
|
||||
!QtPrivate::is_same<const char*, Func1>::value, void>::Type
|
||||
!std::is_same<const char*, Func1>::value, void>::Type
|
||||
singleShot(Duration interval, Qt::TimerType timerType, Func1 slot)
|
||||
{
|
||||
singleShot(interval, timerType, nullptr, slot);
|
||||
@ -134,14 +134,14 @@ public:
|
||||
// singleShot to a functor or function pointer (with context)
|
||||
template <typename Duration, typename Func1>
|
||||
static inline typename QtPrivate::QEnableIf<!QtPrivate::FunctionPointer<Func1>::IsPointerToMemberFunction &&
|
||||
!QtPrivate::is_same<const char*, Func1>::value, void>::Type
|
||||
!std::is_same<const char*, Func1>::value, void>::Type
|
||||
singleShot(Duration interval, QObject *context, Func1 slot)
|
||||
{
|
||||
singleShot(interval, defaultTypeFor(interval), context, slot);
|
||||
}
|
||||
template <typename Duration, typename Func1>
|
||||
static inline typename QtPrivate::QEnableIf<!QtPrivate::FunctionPointer<Func1>::IsPointerToMemberFunction &&
|
||||
!QtPrivate::is_same<const char*, Func1>::value, void>::Type
|
||||
!std::is_same<const char*, Func1>::value, void>::Type
|
||||
singleShot(Duration interval, Qt::TimerType timerType, QObject *context, Func1 slot)
|
||||
{
|
||||
//compilation error if the slot has arguments.
|
||||
|
@ -66,7 +66,7 @@ struct QVariantIntegrator
|
||||
{
|
||||
static const bool CanUseInternalSpace = sizeof(T) <= sizeof(QVariant::Private::Data)
|
||||
&& ((QTypeInfoQuery<T>::isRelocatable) || Q_IS_ENUM(T));
|
||||
typedef QtPrivate::integral_constant<bool, CanUseInternalSpace> CanUseInternalSpace_t;
|
||||
typedef std::integral_constant<bool, CanUseInternalSpace> CanUseInternalSpace_t;
|
||||
};
|
||||
Q_STATIC_ASSERT(QVariantIntegrator<double>::CanUseInternalSpace);
|
||||
Q_STATIC_ASSERT(QVariantIntegrator<long int>::CanUseInternalSpace);
|
||||
@ -118,28 +118,28 @@ private:
|
||||
};
|
||||
|
||||
template <class T>
|
||||
inline void v_construct_helper(QVariant::Private *x, const T &t, QtPrivate::true_type)
|
||||
inline void v_construct_helper(QVariant::Private *x, const T &t, std::true_type)
|
||||
{
|
||||
new (&x->data) T(t);
|
||||
x->is_shared = false;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline void v_construct_helper(QVariant::Private *x, const T &t, QtPrivate::false_type)
|
||||
inline void v_construct_helper(QVariant::Private *x, const T &t, std::false_type)
|
||||
{
|
||||
x->data.shared = new QVariantPrivateSharedEx<T>(t);
|
||||
x->is_shared = true;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline void v_construct_helper(QVariant::Private *x, QtPrivate::true_type)
|
||||
inline void v_construct_helper(QVariant::Private *x, std::true_type)
|
||||
{
|
||||
new (&x->data) T();
|
||||
x->is_shared = false;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline void v_construct_helper(QVariant::Private *x, QtPrivate::false_type)
|
||||
inline void v_construct_helper(QVariant::Private *x, std::false_type)
|
||||
{
|
||||
x->data.shared = new QVariantPrivateSharedEx<T>;
|
||||
x->is_shared = true;
|
||||
|
@ -48,7 +48,6 @@
|
||||
#include "qelapsedtimer.h"
|
||||
#include "qthread.h"
|
||||
#include "qmutex_p.h"
|
||||
#include "qtypetraits.h"
|
||||
|
||||
#ifndef QT_LINUX_FUTEX
|
||||
#include "private/qfreelist_p.h"
|
||||
@ -77,7 +76,7 @@ public:
|
||||
|
||||
// written to by the thread that first owns 'mutex';
|
||||
// read during attempts to acquire ownership of 'mutex' from any other thread:
|
||||
QAtomicPointer<QtPrivate::remove_pointer<Qt::HANDLE>::type> owner;
|
||||
QAtomicPointer<std::remove_pointer<Qt::HANDLE>::type> owner;
|
||||
|
||||
// only ever accessed from the thread that owns 'mutex':
|
||||
uint count;
|
||||
|
@ -52,14 +52,13 @@
|
||||
//
|
||||
|
||||
#include <QtCore/qbytearray.h>
|
||||
#include <QtCore/qtypetraits.h>
|
||||
#include "qtools_p.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
enum {
|
||||
// Define as enum to force inlining. Don't expose MaxAllocSize in a public header.
|
||||
MaxByteArraySize = MaxAllocSize - sizeof(QtPrivate::remove_pointer<QByteArray::DataPtr>::type)
|
||||
MaxByteArraySize = MaxAllocSize - sizeof(std::remove_pointer<QByteArray::DataPtr>::type)
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -764,7 +764,7 @@ Q_INLINE_TEMPLATE typename QHash<Key, T>::iterator QHash<Key, T>::insert(const K
|
||||
return iterator(createNode(h, akey, avalue, node));
|
||||
}
|
||||
|
||||
if (!QtPrivate::is_same<T, QHashDummyValue>::value)
|
||||
if (!std::is_same<T, QHashDummyValue>::value)
|
||||
(*node)->value = avalue;
|
||||
return iterator(*node);
|
||||
}
|
||||
|
@ -125,10 +125,10 @@ class QList
|
||||
{
|
||||
public:
|
||||
struct MemoryLayout
|
||||
: QtPrivate::if_<
|
||||
: std::conditional<
|
||||
QTypeInfo<T>::isStatic || QTypeInfo<T>::isLarge,
|
||||
QListData::IndirectLayout,
|
||||
typename QtPrivate::if_<
|
||||
typename std::conditional<
|
||||
sizeof(T) == sizeof(void*),
|
||||
QListData::ArrayCompatibleLayout,
|
||||
QListData::InlineWithPaddingLayout
|
||||
|
@ -44,7 +44,6 @@
|
||||
#include <QtCore/qlist.h>
|
||||
#include <QtCore/qrefcount.h>
|
||||
#include <QtCore/qpair.h>
|
||||
#include <QtCore/qtypetraits.h>
|
||||
|
||||
#ifdef Q_MAP_DEBUG
|
||||
#include <QtCore/qdebug.h>
|
||||
@ -130,15 +129,15 @@ struct QMapNode : public QMapNodeBase
|
||||
{
|
||||
callDestructorIfNecessary(key);
|
||||
callDestructorIfNecessary(value);
|
||||
doDestroySubTree(QtPrivate::integral_constant<bool, QTypeInfo<T>::isComplex || QTypeInfo<Key>::isComplex>());
|
||||
doDestroySubTree(std::integral_constant<bool, QTypeInfo<T>::isComplex || QTypeInfo<Key>::isComplex>());
|
||||
}
|
||||
|
||||
QMapNode<Key, T> *lowerBound(const Key &key);
|
||||
QMapNode<Key, T> *upperBound(const Key &key);
|
||||
|
||||
private:
|
||||
void doDestroySubTree(QtPrivate::false_type) {}
|
||||
void doDestroySubTree(QtPrivate::true_type)
|
||||
void doDestroySubTree(std::false_type) {}
|
||||
void doDestroySubTree(std::true_type)
|
||||
{
|
||||
if (left)
|
||||
leftNode()->destroySubTree();
|
||||
|
@ -464,7 +464,7 @@ private:
|
||||
template <class X>
|
||||
inline void enableSharedFromThis(const QEnableSharedFromThis<X> *ptr)
|
||||
{
|
||||
ptr->initializeFromSharedPointer(constCast<typename QtPrivate::remove_cv<T>::type>());
|
||||
ptr->initializeFromSharedPointer(constCast<typename std::remove_cv<T>::type>());
|
||||
}
|
||||
|
||||
inline void enableSharedFromThis(...) {}
|
||||
|
@ -60,8 +60,8 @@ template <typename StringType> struct QStringAlgorithms
|
||||
{
|
||||
typedef typename StringType::value_type Char;
|
||||
typedef typename StringType::size_type size_type;
|
||||
typedef typename QtPrivate::remove_cv<StringType>::type NakedStringType;
|
||||
static const bool isConst = QtPrivate::is_const<StringType>::value;
|
||||
typedef typename std::remove_cv<StringType>::type NakedStringType;
|
||||
static const bool isConst = std::is_const<StringType>::value;
|
||||
|
||||
static inline bool isSpace(char ch) { return ascii_isspace(ch); }
|
||||
static inline bool isSpace(QChar ch) { return ch.isSpace(); }
|
||||
|
@ -46,7 +46,6 @@
|
||||
#include <QtCore/qnamespace.h>
|
||||
#include <QtCore/qmetatype.h>
|
||||
#include <QtCore/qmetaobject.h>
|
||||
#include <QtCore/qtypetraits.h>
|
||||
#include <QtCore/qsharedpointer.h>
|
||||
#include <QtCore/qtemporarydir.h>
|
||||
|
||||
@ -312,7 +311,7 @@ namespace QTest
|
||||
template <typename T>
|
||||
inline void addColumn(const char *name, T * = 0)
|
||||
{
|
||||
typedef QtPrivate::is_same<T, const char*> QIsSameTConstChar;
|
||||
typedef std::is_same<T, const char*> QIsSameTConstChar;
|
||||
Q_STATIC_ASSERT_X(!QIsSameTConstChar::value, "const char* is not allowed as a test data format.");
|
||||
addColumnInternal(qMetaTypeId<T>(), name);
|
||||
}
|
||||
|
@ -1024,14 +1024,14 @@ private:
|
||||
|
||||
template <class T> inline T qgraphicsitem_cast(QGraphicsItem *item)
|
||||
{
|
||||
typedef typename QtPrivate::remove_cv<typename QtPrivate::remove_pointer<T>::type>::type Item;
|
||||
typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type Item;
|
||||
return int(Item::Type) == int(QGraphicsItem::Type)
|
||||
|| (item && int(Item::Type) == item->type()) ? static_cast<T>(item) : 0;
|
||||
}
|
||||
|
||||
template <class T> inline T qgraphicsitem_cast(const QGraphicsItem *item)
|
||||
{
|
||||
typedef typename QtPrivate::remove_cv<typename QtPrivate::remove_pointer<T>::type>::type Item;
|
||||
typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type Item;
|
||||
return int(Item::Type) == int(QGraphicsItem::Type)
|
||||
|| (item && int(Item::Type) == item->type()) ? static_cast<T>(item) : 0;
|
||||
}
|
||||
|
@ -665,7 +665,7 @@ protected:
|
||||
template <typename T>
|
||||
T qstyleoption_cast(const QStyleOption *opt)
|
||||
{
|
||||
typedef typename QtPrivate::remove_cv<typename QtPrivate::remove_pointer<T>::type>::type Opt;
|
||||
typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type Opt;
|
||||
if (opt && opt->version >= Opt::Version && (opt->type == Opt::Type
|
||||
|| int(Opt::Type) == QStyleOption::SO_Default
|
||||
|| (int(Opt::Type) == QStyleOption::SO_Complex
|
||||
@ -677,7 +677,7 @@ T qstyleoption_cast(const QStyleOption *opt)
|
||||
template <typename T>
|
||||
T qstyleoption_cast(QStyleOption *opt)
|
||||
{
|
||||
typedef typename QtPrivate::remove_cv<typename QtPrivate::remove_pointer<T>::type>::type Opt;
|
||||
typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type Opt;
|
||||
if (opt && opt->version >= Opt::Version && (opt->type == Opt::Type
|
||||
|| int(Opt::Type) == QStyleOption::SO_Default
|
||||
|| (int(Opt::Type) == QStyleOption::SO_Complex
|
||||
@ -728,7 +728,7 @@ public:
|
||||
template <typename T>
|
||||
T qstyleoption_cast(const QStyleHintReturn *hint)
|
||||
{
|
||||
typedef typename QtPrivate::remove_cv<typename QtPrivate::remove_pointer<T>::type>::type Opt;
|
||||
typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type Opt;
|
||||
if (hint && hint->version <= Opt::Version &&
|
||||
(hint->type == Opt::Type || int(Opt::Type) == QStyleHintReturn::SH_Default))
|
||||
return static_cast<T>(hint);
|
||||
@ -738,7 +738,7 @@ T qstyleoption_cast(const QStyleHintReturn *hint)
|
||||
template <typename T>
|
||||
T qstyleoption_cast(QStyleHintReturn *hint)
|
||||
{
|
||||
typedef typename QtPrivate::remove_cv<typename QtPrivate::remove_pointer<T>::type>::type Opt;
|
||||
typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type Opt;
|
||||
if (hint && hint->version <= Opt::Version &&
|
||||
(hint->type == Opt::Type || int(Opt::Type) == QStyleHintReturn::SH_Default))
|
||||
return static_cast<T>(hint);
|
||||
|
@ -98,7 +98,7 @@ public:
|
||||
#else
|
||||
// addAction(QString): Connect to a QObject slot / functor or function pointer (with context)
|
||||
template<class Obj, typename Func1>
|
||||
inline typename QtPrivate::QEnableIf<!QtPrivate::is_same<const char*, Func1>::value
|
||||
inline typename QtPrivate::QEnableIf<!std::is_same<const char*, Func1>::value
|
||||
&& QtPrivate::IsPointerToTypeDerivedFromQObject<Obj*>::Value, QAction *>::Type
|
||||
addAction(const QString &text, const Obj *object, Func1 slot, const QKeySequence &shortcut = 0)
|
||||
{
|
||||
@ -126,7 +126,7 @@ public:
|
||||
}
|
||||
// addAction(QIcon, QString): Connect to a QObject slot / functor or function pointer (with context)
|
||||
template<class Obj, typename Func1>
|
||||
inline typename QtPrivate::QEnableIf<!QtPrivate::is_same<const char*, Func1>::value
|
||||
inline typename QtPrivate::QEnableIf<!std::is_same<const char*, Func1>::value
|
||||
&& QtPrivate::IsPointerToTypeDerivedFromQObject<Obj*>::Value, QAction *>::Type
|
||||
addAction(const QIcon &actionIcon, const QString &text, const Obj *object, Func1 slot, const QKeySequence &shortcut = 0)
|
||||
{
|
||||
|
@ -116,7 +116,7 @@ public:
|
||||
#else
|
||||
// addAction(QString): Connect to a QObject slot / functor or function pointer (with context)
|
||||
template<class Obj, typename Func1>
|
||||
inline typename QtPrivate::QEnableIf<!QtPrivate::is_same<const char*, Func1>::value
|
||||
inline typename QtPrivate::QEnableIf<!std::is_same<const char*, Func1>::value
|
||||
&& QtPrivate::IsPointerToTypeDerivedFromQObject<Obj*>::Value, QAction *>::Type
|
||||
addAction(const QString &text, const Obj *object, Func1 slot)
|
||||
{
|
||||
@ -134,7 +134,7 @@ public:
|
||||
}
|
||||
// addAction(QString): Connect to a QObject slot / functor or function pointer (with context)
|
||||
template<class Obj, typename Func1>
|
||||
inline typename QtPrivate::QEnableIf<!QtPrivate::is_same<const char*, Func1>::value
|
||||
inline typename QtPrivate::QEnableIf<!std::is_same<const char*, Func1>::value
|
||||
&& QtPrivate::IsPointerToTypeDerivedFromQObject<Obj*>::Value, QAction *>::Type
|
||||
addAction(const QIcon &actionIcon, const QString &text, const Obj *object, Func1 slot)
|
||||
{
|
||||
|
@ -28,7 +28,6 @@
|
||||
|
||||
|
||||
#include <QtTest/QtTest>
|
||||
#include <QtCore/qtypetraits.h>
|
||||
|
||||
#include <QPair>
|
||||
#include <QTextCodec>
|
||||
@ -376,8 +375,8 @@ void tst_QGlobal::isEnum()
|
||||
#define IS_ENUM_TRUE(x) (Q_IS_ENUM(x) == true)
|
||||
#define IS_ENUM_FALSE(x) (Q_IS_ENUM(x) == false)
|
||||
#else
|
||||
#define IS_ENUM_TRUE(x) (Q_IS_ENUM(x) == true && QtPrivate::is_enum<x>::value == true)
|
||||
#define IS_ENUM_FALSE(x) (Q_IS_ENUM(x) == false && QtPrivate::is_enum<x>::value == false)
|
||||
#define IS_ENUM_TRUE(x) (Q_IS_ENUM(x) == true && std::is_enum<x>::value == true)
|
||||
#define IS_ENUM_FALSE(x) (Q_IS_ENUM(x) == false && std::is_enum<x>::value == false)
|
||||
#endif
|
||||
|
||||
QVERIFY(IS_ENUM_TRUE(isEnum_B_Byte));
|
||||
|
@ -29,7 +29,6 @@
|
||||
#include <QtTest/QtTest>
|
||||
|
||||
#include <qhash.h>
|
||||
#include <qtypetraits.h>
|
||||
|
||||
#include <iterator>
|
||||
#include <sstream>
|
||||
@ -197,7 +196,7 @@ void tst_QHashFunctions::range()
|
||||
{
|
||||
// verify that the input iterator category suffices:
|
||||
std::stringstream sstream;
|
||||
Q_STATIC_ASSERT((QtPrivate::is_same<std::input_iterator_tag, std::istream_iterator<int>::iterator_category>::value));
|
||||
Q_STATIC_ASSERT((std::is_same<std::input_iterator_tag, std::istream_iterator<int>::iterator_category>::value));
|
||||
std::copy(ints, ints + numInts, std::ostream_iterator<int>(sstream, " "));
|
||||
sstream.seekg(0);
|
||||
std::istream_iterator<int> it(sstream), end;
|
||||
|
Loading…
Reference in New Issue
Block a user