Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qmakearray_p.h
Go to the documentation of this file.
1// Copyright (C) 2020 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QMAKEARRAY_P_H
6#define QMAKEARRAY_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include "QtCore/private/qglobal_p.h"
20
21#include <array>
22#include <type_traits>
23#include <utility>
24
25QT_BEGIN_NAMESPACE
26
27namespace QtPrivate {
28template<typename T>
29constexpr T &&Forward(typename std::remove_reference<T>::type &t) noexcept
30{
31 return static_cast<T &&>(t);
32}
33
34template<typename T>
35constexpr T &&Forward(typename std::remove_reference<T>::type &&t) noexcept
36{
37 static_assert(!std::is_lvalue_reference<T>::value,
38 "template argument substituting T is an lvalue reference type");
39 return static_cast<T &&>(t);
40}
41
42template <typename ManualType, typename ...>
44{
45 using type = ManualType;
46};
47
48template <typename ... Types>
49struct ArrayTypeHelper<void, Types...> : std::common_type<Types...> { };
50
51template <typename ManualType, typename... Types>
52using ArrayType = std::array<typename ArrayTypeHelper<ManualType, Types...>::type,
53 sizeof...(Types)>;
54
55template<typename ... Values>
56struct QuickSortData { };
57
58template <template <typename> class Predicate,
59 typename ... Values>
61
62template <typename ... Right, typename ... Left>
63constexpr QuickSortData<Right..., Left...> quickSortConcat(
64 QuickSortData<Right...>, QuickSortData<Left...>) noexcept;
65
66template<typename ... Right, typename Middle, typename ... Left>
67constexpr QuickSortData<Right..., Middle, Left...> quickSortConcat(
68 QuickSortData<Right...>,
69 QuickSortData<Middle>,
70 QuickSortData<Left...>) noexcept;
71
72template <template <typename> class Predicate,
73 typename Head, typename ... Tail>
84
85template <template <typename> class Predicate>
90
91template <typename ... Values>
92struct QuickSort;
93
94template <typename Pivot, typename ... Values>
95struct QuickSort<QuickSortData<Pivot, Values...>>
96{
97 template <typename Left>
98 struct LessThan {
99 static constexpr const bool value = Left::data() <= Pivot::data();
100 };
101
102 template <typename Left>
103 struct MoreThan {
104 static constexpr const bool value = !(Left::data() <= Pivot::data());
105 };
106
109
110 using LeftQS = typename QuickSort<LeftSide>::Type;
111 using RightQS = typename QuickSort<RightSide>::Type;
112
113 using Type = decltype(quickSortConcat(LeftQS{}, QuickSortData<Pivot> {}, RightQS{}));
114
115};
116
117template <>
119{
121};
122} // namespace QtPrivate
123
124template <typename ManualType = void, typename ... Types>
125constexpr QtPrivate::ArrayType<ManualType, Types...> qMakeArray(Types && ... t) noexcept
126{
127 return {{QtPrivate::Forward<typename QtPrivate::ArrayType<ManualType, Types...>::value_type>(t)...}};
128}
129
130template<typename ... Values>
132 using Data = typename QtPrivate::QuickSort<typename QtPrivate::QuickSortData<Values...>>::Type;
133};
134
135template<typename ... Values>
136constexpr auto qMakeArray(QtPrivate::QuickSortData<Values...>) noexcept -> decltype(qMakeArray(Values::data()...))
137{
138 return qMakeArray(Values::data() ...);
139}
140
141
142QT_END_NAMESPACE
143
144#endif // QMAKEARRAY_P_H
std::array< typename ArrayTypeHelper< ManualType, Types... >::type, sizeof...(Types)> ArrayType
constexpr T && Forward(typename std::remove_reference< T >::type &t) noexcept
constexpr QuickSortData< Right..., Left... > quickSortConcat(QuickSortData< Right... >, QuickSortData< Left... >) noexcept
constexpr T && Forward(typename std::remove_reference< T >::type &&t) noexcept
constexpr QuickSortData< Right..., Middle, Left... > quickSortConcat(QuickSortData< Right... >, QuickSortData< Middle >, QuickSortData< Left... >) noexcept
constexpr auto qMakeArray(QtPrivate::QuickSortData< Values... >) noexcept -> decltype(qMakeArray(Values::data()...))
constexpr QtPrivate::ArrayType< ManualType, Types... > qMakeArray(Types &&... t) noexcept
typename QtPrivate::QuickSort< typename QtPrivate::QuickSortData< Values... > >::Type Data