diff options
author | Marc Mutz <marc.mutz@kdab.com> | 2021-08-12 16:13:08 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@kdab.com> | 2021-08-16 19:26:29 +0200 |
commit | e7ab88870041a862a44e2779198f808047973d5f (patch) | |
tree | f2db5ed16219200a3d30f7a9971708d1dba6ee3c /src/corelib/global/q20functional.h | |
parent | 8948f5cc78e4151e04395375269b9efbf9a3bac7 (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/q20functional.h')
-rw-r--r-- | src/corelib/global/q20functional.h | 80 |
1 files changed, 80 insertions, 0 deletions
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 */ |