Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
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
25
QT_BEGIN_NAMESPACE
26
27
namespace
QtPrivate
{
28
template
<
typename
T>
29
constexpr
T &&
Forward
(
typename
std
::remove_reference<T>::type &t)
noexcept
30
{
31
return
static_cast
<T &&>(t);
32
}
33
34
template
<
typename
T>
35
constexpr
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
42
template
<
typename
ManualType,
typename
...>
43
struct
ArrayTypeHelper
44
{
45
using
type
= ManualType;
46
};
47
48
template
<
typename
... Types>
49
struct
ArrayTypeHelper
<
void
, Types...> :
std
::common_type<Types...> { };
50
51
template
<
typename
ManualType,
typename
... Types>
52
using
ArrayType
=
std
::array<
typename
ArrayTypeHelper
<ManualType, Types...>::
type
,
53
sizeof
...(Types)>;
54
55
template
<
typename
... Values>
56
struct
QuickSortData
{ };
57
58
template
<
template
<
typename
>
class
Predicate,
59
typename
... Values>
60
struct
QuickSortFilter
;
61
62
template
<
typename
... Right,
typename
... Left>
63
constexpr
QuickSortData
<Right..., Left...>
quickSortConcat
(
64
QuickSortData
<Right...>,
QuickSortData
<Left...>)
noexcept
;
65
66
template
<
typename
... Right,
typename
Middle,
typename
... Left>
67
constexpr
QuickSortData
<Right..., Middle, Left...>
quickSortConcat
(
68
QuickSortData
<Right...>,
69
QuickSortData
<Middle>,
70
QuickSortData
<Left...>)
noexcept
;
71
72
template
<
template
<
typename
>
class
Predicate
,
73
typename
Head
,
typename
...
Tail
>
74
struct
QuickSortFilter
<
Predicate
,
QuickSortData
<
Head
,
Tail
...>>
75
{
76
using
TailFilteredData
=
typename
QuickSortFilter
<
77
Predicate
,
QuickSortData
<
Tail
...>>::
Type
;
78
79
using
Type
=
typename
std
::
conditional
<
80
Predicate
<
Head
>::
value
,
81
decltype
(
quickSortConcat
(
QuickSortData
<
Head
> {},
TailFilteredData
{})),
82
TailFilteredData
>::
type
;
83
};
84
85
template
<
template
<
typename
>
class
Predicate
>
86
struct
QuickSortFilter
<
Predicate
,
QuickSortData
<>>
87
{
88
using
Type
=
QuickSortData
<>;
89
};
90
91
template
<
typename
... Values>
92
struct
QuickSort
;
93
94
template
<
typename
Pivot,
typename
... Values>
95
struct
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
107
using
LeftSide
=
typename
QuickSortFilter
<
LessThan
,
QuickSortData
<
Values
...>>::
Type
;
108
using
RightSide
=
typename
QuickSortFilter
<
MoreThan
,
QuickSortData
<
Values
...>>::
Type
;
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
117
template
<>
118
struct
QuickSort
<
QuickSortData
<>>
119
{
120
using
Type
=
QuickSortData
<>;
121
};
122
}
// namespace QtPrivate
123
124
template
<
typename
ManualType =
void
,
typename
... Types>
125
constexpr
QtPrivate
::
ArrayType
<
ManualType
,
Types
...>
qMakeArray
(Types && ... t)
noexcept
126
{
127
return
{{QtPrivate::Forward<
typename
QtPrivate::ArrayType<ManualType, Types...>::value_type>(t)...}};
128
}
129
130
template
<
typename
... Values>
131
struct
QSortedData
{
132
using
Data
=
typename
QtPrivate
::
QuickSort
<
typename
QtPrivate
::
QuickSortData
<Values...>>::
Type
;
133
};
134
135
template
<
typename
... Values>
136
constexpr
auto
qMakeArray
(
QtPrivate
::
QuickSortData
<Values...>)
noexcept
->
decltype
(qMakeArray(Values::data()...))
137
{
138
return
qMakeArray(Values::data() ...);
139
}
140
141
142
QT_END_NAMESPACE
143
144
#
endif
// QMAKEARRAY_P_H
QtPrivate
Definition
qalloc.h:29
QtPrivate::ArrayType
std::array< typename ArrayTypeHelper< ManualType, Types... >::type, sizeof...(Types)> ArrayType
Definition
qmakearray_p.h:52
QtPrivate::Forward
constexpr T && Forward(typename std::remove_reference< T >::type &t) noexcept
Definition
qmakearray_p.h:29
QtPrivate::quickSortConcat
constexpr QuickSortData< Right..., Left... > quickSortConcat(QuickSortData< Right... >, QuickSortData< Left... >) noexcept
QtPrivate::Forward
constexpr T && Forward(typename std::remove_reference< T >::type &&t) noexcept
Definition
qmakearray_p.h:35
QtPrivate::quickSortConcat
constexpr QuickSortData< Right..., Middle, Left... > quickSortConcat(QuickSortData< Right... >, QuickSortData< Middle >, QuickSortData< Left... >) noexcept
std
[33]
Definition
src_corelib_tools_qhash.cpp:421
qMakeArray
constexpr auto qMakeArray(QtPrivate::QuickSortData< Values... >) noexcept -> decltype(qMakeArray(Values::data()...))
Definition
qmakearray_p.h:136
qMakeArray
constexpr QtPrivate::ArrayType< ManualType, Types... > qMakeArray(Types &&... t) noexcept
Definition
qmakearray_p.h:125
QSortedData
Definition
qmakearray_p.h:131
QSortedData::Data
typename QtPrivate::QuickSort< typename QtPrivate::QuickSortData< Values... > >::Type Data
Definition
qmakearray_p.h:132
QtPrivate::ArrayTypeHelper< void, Types... >
Definition
qmakearray_p.h:49
QtPrivate::ArrayTypeHelper
Definition
qmakearray_p.h:44
QtPrivate::ArrayTypeHelper::type
ManualType type
Definition
qmakearray_p.h:45
QtPrivate::QuickSortData
Definition
qmakearray_p.h:56
QtPrivate::QuickSortFilter
Definition
qmakearray_p.h:60
QtPrivate::QuickSort< QuickSortData< Pivot, Values... > >::LessThan
Definition
qmakearray_p.h:98
QtPrivate::QuickSort< QuickSortData< Pivot, Values... > >::LessThan::value
static constexpr const bool value
Definition
qmakearray_p.h:99
QtPrivate::QuickSort< QuickSortData< Pivot, Values... > >::MoreThan
Definition
qmakearray_p.h:103
QtPrivate::QuickSort< QuickSortData< Pivot, Values... > >::MoreThan::value
static constexpr const bool value
Definition
qmakearray_p.h:104
QtPrivate::QuickSort< QuickSortData< Pivot, Values... > >
Definition
qmakearray_p.h:96
QtPrivate::QuickSort< QuickSortData<> >
Definition
qmakearray_p.h:119
QtPrivate::QuickSort< QuickSortData<> >::Type
QuickSortData<> Type
Definition
qmakearray_p.h:120
QtPrivate::QuickSort
Definition
qmakearray_p.h:92
qtbase
src
corelib
tools
qmakearray_p.h
Generated on
for Qt by
1.18.0