summaryrefslogtreecommitdiffstats
path: root/src/corelib/global
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2021-08-12 16:13:08 +0200
committerMarc Mutz <marc.mutz@kdab.com>2021-08-16 19:26:29 +0200
commite7ab88870041a862a44e2779198f808047973d5f (patch)
treef2db5ed16219200a3d30f7a9971708d1dba6ee3c /src/corelib/global
parent8948f5cc78e4151e04395375269b9efbf9a3bac7 (diff)
Short live namespace q20!
As proposed already for Qt 5 (then with q14 and q17), add reimplementations of C++20 library features into a q20 namespace. The advantage is that we can later just s/q20::/std::/ and be sure that a) the q20 functionality works (within reason) like the std counterparts and b) we don't have to re-indent the code after the replacement. Start with std::identity in q20functional.h, required by std::ranges::{any,all,none}_of() (ex ranges[1]) in q20algorithm.h, which I happen to require in QLibrary next. [1] We can't provide the nice range-based overloads (any_of(vector, pred)), yet, because that would require to reimplement all the range-related concepts, as the overloads are ambiguous if unconstrained. First, we should check whether we can't just depend on Nieber's ranges-v3 library instead. The q20 namespace is independent of this decision, as it's more universally useful (q20::remove_cvref comes to mind). Unlike in q14/q17 times, a single header, q20.h, would become unwieldy very soon, so use separate headers. Change-Id: I14b98c865e242d2dc9674bc1bff5f7a9e4db9940 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/global')
-rw-r--r--src/corelib/global/q20algorithm.h116
-rw-r--r--src/corelib/global/q20functional.h80
2 files changed, 196 insertions, 0 deletions
diff --git a/src/corelib/global/q20algorithm.h b/src/corelib/global/q20algorithm.h
new file mode 100644
index 0000000000..d8e5f51fa0
--- /dev/null
+++ b/src/corelib/global/q20algorithm.h
@@ -0,0 +1,116 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef Q20ALGORITHM_H
+#define Q20ALGORITHM_H
+
+#include <QtCore/qglobal.h>
+
+#include <algorithm>
+#include <QtCore/q20functional.h>
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. Types and functions defined
+// in this file will behave exactly as their std counterparts. You
+// may use these definitions in your own code, but be aware that we
+// will remove them once Qt depends on the C++ version that supports
+// them in namespace std. There will be NO deprecation warning, the
+// definitons will JUST go away.
+//
+// If you can't agree to these terms, don't use these definitons!
+//
+// We mean it.
+//
+
+QT_BEGIN_NAMESPACE
+
+namespace q20::ranges {
+// like std::ranges::{any,all,none}_of, just unconstrained, so no range-overload
+#ifdef __cpp_lib_ranges
+using std::ranges::any_of;
+using std::ranges::all_of;
+using std::ranges::none_of;
+#else
+[[maybe_unused]] inline constexpr struct { // Niebloid
+ template <typename InputIterator, typename Sentinel,
+ typename Predicate, typename Projection = q20::identity>
+ constexpr bool operator()(InputIterator first, Sentinel last, Predicate pred, Projection proj = {}) const
+ {
+ while (first != last) {
+ if (std::invoke(pred, std::invoke(proj, *first)))
+ return true;
+ ++first;
+ }
+ return false;
+ }
+} any_of;
+[[maybe_unused]] inline constexpr struct { // Niebloid
+ template <typename InputIterator, typename Sentinel,
+ typename Predicate, typename Projection = q20::identity>
+ constexpr bool operator()(InputIterator first, Sentinel last, Predicate pred, Projection proj = {}) const
+ {
+ while (first != last) {
+ if (!std::invoke(pred, std::invoke(proj, *first)))
+ return false;
+ ++first;
+ }
+ return true;
+ }
+} all_of;
+[[maybe_unused]] inline constexpr struct { // Niebloid
+ template <typename InputIterator, typename Sentinel,
+ typename Predicate, typename Projection = q20::identity>
+ constexpr bool operator()(InputIterator first, Sentinel last, Predicate pred, Projection proj = {}) const
+ {
+ while (first != last) {
+ if (std::invoke(pred, std::invoke(proj, *first)))
+ return false;
+ ++first;
+ }
+ return true;
+ }
+} none_of;
+#endif // __cpp_lib_ranges
+} // namespace q20::ranges
+
+QT_END_NAMESPACE
+
+#endif /* Q20ALGORITHM_H */
diff --git a/src/corelib/global/q20functional.h b/src/corelib/global/q20functional.h
new file mode 100644
index 0000000000..f35614f837
--- /dev/null
+++ b/src/corelib/global/q20functional.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef Q20FUNCTIONAL_H
+#define Q20FUNCTIONAL_H
+
+#include <QtCore/qglobal.h>
+
+#include <functional>
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. Types and functions defined
+// in this file will behave exactly as their std counterparts. You
+// may use these definitions in your own code, but be aware that we
+// will remove them once Qt depends on the C++ version that supports
+// them in namespace std. There will be NO deprecation warning, the
+// definitons will JUST go away.
+//
+// If you can't agree to these terms, don't use these definitons!
+//
+// We mean it.
+//
+
+QT_BEGIN_NAMESPACE
+
+namespace q20 {
+// like std::identity
+#ifdef __cpp_lib_ranges
+using std::identity;
+#else
+struct identity
+{
+ struct is_transparent {};
+ template <typename T>
+ constexpr T &&operator()(T&& t) const noexcept { return std::forward<T>(t); }
+};
+#endif // __cpp_lib_ranges
+} // namespace q20
+
+QT_END_NAMESPACE
+
+#endif /* Q20FUNCTIONAL_H */