summaryrefslogtreecommitdiffstats
path: root/src/corelib/global/qttypetraits.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/global/qttypetraits.h')
-rw-r--r--src/corelib/global/qttypetraits.h65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/corelib/global/qttypetraits.h b/src/corelib/global/qttypetraits.h
new file mode 100644
index 0000000000..1efb24bf70
--- /dev/null
+++ b/src/corelib/global/qttypetraits.h
@@ -0,0 +1,65 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QTTYPETRAITS_H
+#define QTTYPETRAITS_H
+
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qtdeprecationmarkers.h>
+
+#include <type_traits>
+#include <utility>
+
+#if 0
+#pragma qt_class(QtTypeTraits)
+#pragma qt_sync_stop_processing
+#endif
+
+QT_BEGIN_NAMESPACE
+
+// like std::to_underlying
+template <typename Enum>
+constexpr std::underlying_type_t<Enum> qToUnderlying(Enum e) noexcept
+{
+ return static_cast<std::underlying_type_t<Enum>>(e);
+}
+
+#ifndef QT_NO_QASCONST
+#if QT_DEPRECATED_SINCE(6, 6)
+
+// this adds const to non-const objects (like std::as_const)
+template <typename T>
+QT_DEPRECATED_VERSION_X_6_6("Use std::as_const() instead.")
+constexpr typename std::add_const<T>::type &qAsConst(T &t) noexcept { return t; }
+// prevent rvalue arguments:
+template <typename T>
+void qAsConst(const T &&) = delete;
+
+#endif // QT_DEPRECATED_SINCE(6, 6)
+#endif // QT_NO_QASCONST
+
+#ifndef QT_NO_QEXCHANGE
+
+// like std::exchange
+template <typename T, typename U = T>
+constexpr T qExchange(T &t, U &&newValue)
+noexcept(std::conjunction_v<std::is_nothrow_move_constructible<T>,
+ std::is_nothrow_assignable<T &, U>>)
+{
+ T old = std::move(t);
+ t = std::forward<U>(newValue);
+ return old;
+}
+
+#endif // QT_NO_QEXCHANGE
+
+namespace QtPrivate {
+// helper to be used to trigger a "dependent static_assert(false)"
+// (for instance, in a final `else` branch of a `if constexpr`.)
+template <typename T> struct type_dependent_false : std::false_type {};
+template <auto T> struct value_dependent_false : std::false_type {};
+}
+
+QT_END_NAMESPACE
+
+#endif // QTTYPETRAITS_H