summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/tools')
-rw-r--r--src/corelib/tools/qcontainerfwd.h3
-rw-r--r--src/corelib/tools/qhashfunctions.h9
-rw-r--r--src/corelib/tools/qpair.h111
-rw-r--r--src/corelib/tools/qpair.qdoc251
4 files changed, 21 insertions, 353 deletions
diff --git a/src/corelib/tools/qcontainerfwd.h b/src/corelib/tools/qcontainerfwd.h
index bdf9e0dcc0..fd4701a8b1 100644
--- a/src/corelib/tools/qcontainerfwd.h
+++ b/src/corelib/tools/qcontainerfwd.h
@@ -50,7 +50,8 @@ template <class Key, class T> class QHash;
template <class Key, class T> class QMap;
template <class Key, class T> class QMultiHash;
template <class Key, class T> class QMultiMap;
-template <class T1, class T2> struct QPair;
+template <typename T1, typename T2>
+using QPair = std::pair<T1, T2>;
template <class T> class QQueue;
template <class T> class QSet;
template <class T> class QStack;
diff --git a/src/corelib/tools/qhashfunctions.h b/src/corelib/tools/qhashfunctions.h
index 5742540061..38e799e78b 100644
--- a/src/corelib/tools/qhashfunctions.h
+++ b/src/corelib/tools/qhashfunctions.h
@@ -252,15 +252,6 @@ inline size_t qHashRangeCommutative(InputIterator first, InputIterator last, siz
return std::accumulate(first, last, seed, QtPrivate::QHashCombineCommutative());
}
-template <typename T1, typename T2> inline size_t qHash(const QPair<T1, T2> &key, size_t seed = 0)
- noexcept(noexcept(qHash(key.first, seed)) && noexcept(qHash(key.second, seed)))
-{
- QtPrivate::QHashCombine hash;
- seed = hash(seed, key.first);
- seed = hash(seed, key.second);
- return seed;
-}
-
template <typename T1, typename T2> inline size_t qHash(const std::pair<T1, T2> &key, size_t seed = 0)
noexcept(noexcept(qHash(key.first, seed)) && noexcept(qHash(key.second, seed)))
{
diff --git a/src/corelib/tools/qpair.h b/src/corelib/tools/qpair.h
index 9ebf88bc8f..6cb7fc5079 100644
--- a/src/corelib/tools/qpair.h
+++ b/src/corelib/tools/qpair.h
@@ -44,115 +44,22 @@
QT_BEGIN_NAMESPACE
-
-template <class T1, class T2>
-struct QPair
-{
- typedef T1 first_type;
- typedef T2 second_type;
-
- Q_DECL_CONSTEXPR QPair()
- noexcept((std::is_nothrow_default_constructible<T1>::value &&
- std::is_nothrow_default_constructible<T2>::value))
- : first(), second() {}
- Q_DECL_CONSTEXPR QPair(const T1 &t1, const T2 &t2)
- noexcept((std::is_nothrow_copy_constructible<T1>::value &&
- std::is_nothrow_copy_constructible<T2>::value))
- : first(t1), second(t2) {}
- // compiler-generated copy/move ctor/assignment operators are fine!
-
- template <typename TT1, typename TT2>
- Q_DECL_CONSTEXPR QPair(const QPair<TT1, TT2> &p)
- noexcept((std::is_nothrow_constructible<T1, TT1&>::value &&
- std::is_nothrow_constructible<T2, TT2&>::value))
- : first(p.first), second(p.second) {}
- template <typename TT1, typename TT2>
- Q_DECL_RELAXED_CONSTEXPR QPair &operator=(const QPair<TT1, TT2> &p)
- noexcept((std::is_nothrow_assignable<T1, TT1&>::value &&
- std::is_nothrow_assignable<T2, TT2&>::value))
- { first = p.first; second = p.second; return *this; }
- template <typename TT1, typename TT2>
- Q_DECL_CONSTEXPR QPair(QPair<TT1, TT2> &&p)
- noexcept((std::is_nothrow_constructible<T1, TT1>::value &&
- std::is_nothrow_constructible<T2, TT2>::value))
- // can't use std::move here as it's not constexpr in C++11:
- : first(static_cast<TT1 &&>(p.first)), second(static_cast<TT2 &&>(p.second)) {}
- template <typename TT1, typename TT2>
- Q_DECL_RELAXED_CONSTEXPR QPair &operator=(QPair<TT1, TT2> &&p)
- noexcept((std::is_nothrow_assignable<T1, TT1>::value &&
- std::is_nothrow_assignable<T2, TT2>::value))
- { first = std::move(p.first); second = std::move(p.second); return *this; }
-
- Q_DECL_RELAXED_CONSTEXPR void swap(QPair &other)
- noexcept(noexcept(qSwap(other.first, other.first)) && noexcept(qSwap(other.second, other.second)))
- {
- // use qSwap() to pick up ADL swaps automatically:
- qSwap(first, other.first);
- qSwap(second, other.second);
- }
-
- T1 first;
- T2 second;
-};
-
-#if defined(__cpp_deduction_guides) && __cpp_deduction_guides >= 201606
-template<class T1, class T2>
-QPair(T1, T2) -> QPair<T1, T2>;
+#if 0
+#pragma qt_class(QPair)
#endif
template <typename T1, typename T2>
-void swap(QPair<T1, T2> &lhs, QPair<T1, T2> &rhs) noexcept(noexcept(lhs.swap(rhs)))
-{ lhs.swap(rhs); }
-
-// mark QPair<T1,T2> as complex/movable/primitive depending on the
-// typeinfos of the constituents:
-template<class T1, class T2>
-class QTypeInfo<QPair<T1, T2> > : public QTypeInfoMerger<QPair<T1, T2>, T1, T2> {}; // Q_DECLARE_TYPEINFO
+using QPair = std::pair<T1, T2>;
-template <class T1, class T2>
-Q_DECL_CONSTEXPR Q_INLINE_TEMPLATE bool operator==(const QPair<T1, T2> &p1, const QPair<T1, T2> &p2)
- noexcept(noexcept(p1.first == p2.first && p1.second == p2.second))
-{ return p1.first == p2.first && p1.second == p2.second; }
-
-template <class T1, class T2>
-Q_DECL_CONSTEXPR Q_INLINE_TEMPLATE bool operator!=(const QPair<T1, T2> &p1, const QPair<T1, T2> &p2)
- noexcept(noexcept(!(p1 == p2)))
-{ return !(p1 == p2); }
-
-template <class T1, class T2>
-Q_DECL_CONSTEXPR Q_INLINE_TEMPLATE bool operator<(const QPair<T1, T2> &p1, const QPair<T1, T2> &p2)
- noexcept(noexcept(p1.first < p2.first || (!(p2.first < p1.first) && p1.second < p2.second)))
-{
- return p1.first < p2.first || (!(p2.first < p1.first) && p1.second < p2.second);
-}
-
-template <class T1, class T2>
-Q_DECL_CONSTEXPR Q_INLINE_TEMPLATE bool operator>(const QPair<T1, T2> &p1, const QPair<T1, T2> &p2)
- noexcept(noexcept(p2 < p1))
-{
- return p2 < p1;
-}
-
-template <class T1, class T2>
-Q_DECL_CONSTEXPR Q_INLINE_TEMPLATE bool operator<=(const QPair<T1, T2> &p1, const QPair<T1, T2> &p2)
- noexcept(noexcept(!(p2 < p1)))
-{
- return !(p2 < p1);
-}
-
-template <class T1, class T2>
-Q_DECL_CONSTEXPR Q_INLINE_TEMPLATE bool operator>=(const QPair<T1, T2> &p1, const QPair<T1, T2> &p2)
- noexcept(noexcept(!(p1 < p2)))
+template <typename T1, typename T2>
+constexpr decltype(auto) qMakePair(T1 &&value1, T2 &&value2)
+ noexcept(noexcept(std::make_pair(std::forward<T1>(value1), std::forward<T2>(value2))))
{
- return !(p1 < p2);
+ return std::make_pair(std::forward<T1>(value1), std::forward<T2>(value2));
}
-template <class T1, class T2>
-Q_DECL_CONSTEXPR Q_OUTOFLINE_TEMPLATE QPair<T1, T2> qMakePair(const T1 &x, const T2 &y)
- noexcept(noexcept(QPair<T1, T2>(x, y)))
-{
- return QPair<T1, T2>(x, y);
-}
+template<class T1, class T2>
+class QTypeInfo<std::pair<T1, T2>> : public QTypeInfoMerger<std::pair<T1, T2>, T1, T2> {};
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qpair.qdoc b/src/corelib/tools/qpair.qdoc
index 65576ef2e6..0e17b6c3b9 100644
--- a/src/corelib/tools/qpair.qdoc
+++ b/src/corelib/tools/qpair.qdoc
@@ -28,255 +28,24 @@
/*!
\class QPair
\inmodule QtCore
- \reentrant
- \brief The QPair class is a template class that stores a pair of items.
+ \obsolete
+ \brief QPair is an alias for std::pair.
\ingroup tools
- QPair\<T1, T2\> can be used in your application if the STL \c
- pair type is not available. It stores one value of type T1 and
- one value of type T2. It can be used as a return value for a
- function that needs to return two values, or as the value type of
- a \l{Container classes}{generic container}.
-
- Here's an example of a QPair that stores one QString and one \c
- double value:
-
- \snippet code/doc_src_qpair.cpp 0
-
- The components are accessible as public data members called \l
- first and \l second. For example:
-
- \snippet code/doc_src_qpair.cpp 1
-
- Note, however, that it is almost always preferable to define a small struct
- to hold the result of a function with multiple return values. A struct
- trivially generalizes to more than two values, and allows more descriptive
- member names than \c{first} and \c{second}:
-
- \snippet code/doc_src_qpair.cpp struct
-
- The advent of C++11 automatic variable type deduction (\c{auto}) shifts the
- emphasis from the type name to the name of functions and members. Thus, QPair,
- like \c{std::pair} and \c{std::tuple}, is mostly useful in generic (template)
- code, where defining a dedicated type is not possible.
-
- QPair's template data types (T1 and T2) must be \l{assignable
- data types}. You cannot, for example, store a QWidget as a value;
- instead, store a QWidget *. A few functions have additional
- requirements; these requirements are documented on a per-function
- basis.
+ QPair\<T1, T2\> is a typedef for std::pair\<T1, T2\>.
+ It is provided for backwards compatibility. Use std::pair directly
+ instead.
\sa {Container Classes}
*/
-/*! \typedef QPair::first_type
-
- The type of the first element in the pair (T1).
-
- \sa first
-*/
-
-/*! \typedef QPair::second_type
-
- The type of the second element in the pair (T2).
-
- \sa second
-*/
-
-/*! \variable QPair::first
-
- The first element in the pair.
-*/
-
-/*! \variable QPair::second
-
- The second element in the pair.
-*/
-
-/*! \fn template <class T1, class T2> QPair<T1, T2>::QPair()
-
- Constructs an empty pair. The \c first and \c second elements are
- initialized with \l{default-constructed value}s.
-*/
-
-/*!
- \fn template <class T1, class T2> QPair<T1, T2>::QPair(const T1 &value1, const T2 &value2)
-
- Constructs a pair and initializes the \c first element with \a
- value1 and the \c second element with \a value2.
-
- \sa qMakePair()
-*/
-
-/*!
-\fn template <class T1, class T2> void QPair<T1, T2>::swap(QPair &other)
-
- \since 5.5
- Swaps this pair with \a other.
-
- Equivalent to
- \code
- qSwap(this->first, other.first);
- qSwap(this->second, other.second);
- \endcode
-
- Swap overloads are found in namespace \c std as well as via
- argument-dependent lookup (ADL) in the namespace of \c{T} .
-*/
-
-/*!
-\fn template <class T1, class T2> void swap(QPair<T1, T2> &lhs, QPair<T1, T2> &rhs)
- \overload
- \relates QPair
- \since 5.5
-
- Swaps \a lhs with \a rhs.
-*/
-
-/*!
- \fn template <class T1, class T2> template <typename TT1, typename TT2> QPair<T1, T2>::QPair(const QPair<TT1, TT2> &p)
- \since 5.2
-
- Constructs a pair from the other pair \a p, of types TT1 and TT2. This
- constructor will fail if \c first cannot be initialized from \c p.first or
- if \c second cannot be initialized from \c p.second.
-
- \sa qMakePair()
-*/
-
-/*!
- \fn template <class T1, class T2> template <typename TT1, typename TT2> QPair<T1, T2>::QPair(QPair<TT1, TT2> &&p)
- \since 5.2
-
- Move-constructs a QPair instance, making it point to the same object that \a p was pointing to.
-*/
-
-/*!
- \fn template <class T1, class T2> template <typename TT1, typename TT2> QPair & QPair<T1, T2>::operator=(const QPair<TT1, TT2> &p)
- \since 5.2
-
- Copies pair \a p into this pair.
-
- \sa qMakePair()
-*/
-
-/*!
- \fn template <class T1, class T2> template <typename TT1, typename TT2> QPair & QPair<T1, T2>::operator=(QPair<TT1, TT2> &&p)
- \since 5.2
-
- Move-assigns pair \a p into this pair instance.
-*/
-
-/*! \fn template <class T1, class T2> bool operator==(const QPair<T1, T2> &p1, const QPair<T1, T2> &p2)
-
- \relates QPair
-
- Returns \c true if \a p1 is equal to \a p2; otherwise returns \c false.
- Two pairs compare equal if their \c first data members compare
- equal and if their \c second data members compare equal.
-
- This function requires the T1 and T2 types to have an
- implementation of \c operator==().
-*/
-
-/*! \fn template <class T1, class T2> bool operator!=(const QPair<T1, T2> &p1, const QPair<T1, T2> &p2)
-
- \relates QPair
-
- Returns \c true if \a p1 is not equal to \a p2; otherwise returns
- false. Two pairs compare as not equal if their \c first data
- members are not equal or if their \c second data members are not
- equal.
-
- This function requires the T1 and T2 types to have an
- implementation of \c operator==().
-*/
-
-/*! \fn template <class T1, class T2> bool operator<(const QPair<T1, T2> &p1, const QPair<T1, T2> &p2)
-
- \relates QPair
-
- Returns \c true if \a p1 is less than \a p2; otherwise returns
- false. The comparison is done on the \c first members of \a p1
- and \a p2; if they compare equal, the \c second members are
- compared to break the tie.
-
- This function requires the T1 and T2 types to have an
- implementation of \c operator<().
-*/
-
-/*! \fn template <class T1, class T2> bool operator>(const QPair<T1, T2> &p1, const QPair<T1, T2> &p2)
-
- \relates QPair
-
- Returns \c true if \a p1 is greater than \a p2; otherwise returns
- false. The comparison is done on the \c first members of \a p1
- and \a p2; if they compare equal, the \c second members are
- compared to break the tie.
-
- This function requires the T1 and T2 types to have an
- implementation of \c operator<().
-*/
-
-/*! \fn template <class T1, class T2> bool operator<=(const QPair<T1, T2> &p1, const QPair<T1, T2> &p2)
-
- \relates QPair
-
- Returns \c true if \a p1 is less than or equal to \a p2; otherwise
- returns \c false. The comparison is done on the \c first members of
- \a p1 and \a p2; if they compare equal, the \c second members are
- compared to break the tie.
-
- This function requires the T1 and T2 types to have an
- implementation of \c operator<().
-*/
-
-/*! \fn template <class T1, class T2> bool operator>=(const QPair<T1, T2> &p1, const QPair<T1, T2> &p2)
-
- \relates QPair
-
- Returns \c true if \a p1 is greater than or equal to \a p2;
- otherwise returns \c false. The comparison is done on the \c first
- members of \a p1 and \a p2; if they compare equal, the \c second
- members are compared to break the tie.
-
- This function requires the T1 and T2 types to have an
- implementation of \c operator<().
-*/
-
/*!
- \fn template <class T1, class T2> QPair<T1, T2> qMakePair(const T1 &value1, const T2 &value2)
-
- \relates QPair
-
- Returns a QPair\<T1, T2\> that contains \a value1 and \a value2.
- Example:
-
- \snippet code/doc_src_qpair.cpp 2
-
- This is equivalent to QPair<T1, T2>(\a value1, \a value2), but
- usually requires less typing.
-*/
-
-/*! \fn template <class T1, class T2> QDataStream &operator>>(QDataStream &in, QPair<T1, T2> &pair)
-
- \relates QPair
-
- Reads a pair from stream \a in into \a pair.
-
- This function requires the T1 and T2 types to implement \c operator>>().
-
- \sa {Serializing Qt Data Types}
-*/
-
-/*! \fn template <class T1, class T2> QDataStream &operator<<(QDataStream &out, const QPair<T1, T2> &pair)
-
+ \fn template <class T1, class T2> QPair<T1, T2> qMakePair(T1 &&value1, T2 &&value2)
+ \obsolete
\relates QPair
- Writes the pair \a pair to stream \a out.
-
- This function requires the T1 and T2 types to implement \c operator<<().
-
- \sa {Serializing Qt Data Types}
+ qMakePair forwards its arguments to std::make_pair, and returns
+ the resulting std::pair. It is provided for backwards compatibility.
+ Use std::make_pair directly instead.
*/