-
Notifications
You must be signed in to change notification settings - Fork 62
Expand file tree
/
Copy pathsort32.h
More file actions
239 lines (236 loc) · 15.7 KB
/
sort32.h
File metadata and controls
239 lines (236 loc) · 15.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
/*
* Copyright (c) 2015-2022 Morwenn
* SPDX-License-Identifier: MIT
*/
#ifndef CPPSORT_DETAIL_SORTING_NETWORK_SORT32_H_
#define CPPSORT_DETAIL_SORTING_NETWORK_SORT32_H_
namespace cppsort
{
namespace detail
{
template<>
struct sorting_network_sorter_impl<32>
{
template<
typename RandomAccessIterator,
typename Compare = std::less<>,
typename Projection = utility::identity,
typename = detail::enable_if_t<is_projection_iterator_v<
Projection, RandomAccessIterator, Compare
>>
>
auto operator()(RandomAccessIterator first, RandomAccessIterator,
Compare compare={}, Projection projection={}) const
-> void
{
iter_swap_if(first, first + 1, compare, projection);
iter_swap_if(first + 2, first + 3, compare, projection);
iter_swap_if(first + 4, first + 5, compare, projection);
iter_swap_if(first + 6, first + 7, compare, projection);
iter_swap_if(first + 8, first + 9, compare, projection);
iter_swap_if(first + 10, first + 11, compare, projection);
iter_swap_if(first + 12, first + 13, compare, projection);
iter_swap_if(first + 14, first + 15, compare, projection);
iter_swap_if(first + 16, first + 17, compare, projection);
iter_swap_if(first + 18, first + 19, compare, projection);
iter_swap_if(first + 20, first + 21, compare, projection);
iter_swap_if(first + 22, first + 23, compare, projection);
iter_swap_if(first + 24, first + 25, compare, projection);
iter_swap_if(first + 26, first + 27, compare, projection);
iter_swap_if(first + 28, first + 29, compare, projection);
iter_swap_if(first + 30, first + 31, compare, projection);
iter_swap_if(first, first + 2, compare, projection);
iter_swap_if(first + 1, first + 3, compare, projection);
iter_swap_if(first + 4, first + 6, compare, projection);
iter_swap_if(first + 5, first + 7, compare, projection);
iter_swap_if(first + 8, first + 10, compare, projection);
iter_swap_if(first + 9, first + 11, compare, projection);
iter_swap_if(first + 12, first + 14, compare, projection);
iter_swap_if(first + 13, first + 15, compare, projection);
iter_swap_if(first + 16, first + 18, compare, projection);
iter_swap_if(first + 17, first + 19, compare, projection);
iter_swap_if(first + 20, first + 22, compare, projection);
iter_swap_if(first + 21, first + 23, compare, projection);
iter_swap_if(first + 24, first + 26, compare, projection);
iter_swap_if(first + 25, first + 27, compare, projection);
iter_swap_if(first + 28, first + 30, compare, projection);
iter_swap_if(first + 29, first + 31, compare, projection);
iter_swap_if(first, first + 4, compare, projection);
iter_swap_if(first + 1, first + 5, compare, projection);
iter_swap_if(first + 2, first + 6, compare, projection);
iter_swap_if(first + 3, first + 7, compare, projection);
iter_swap_if(first + 8, first + 12, compare, projection);
iter_swap_if(first + 9, first + 13, compare, projection);
iter_swap_if(first + 10, first + 14, compare, projection);
iter_swap_if(first + 11, first + 15, compare, projection);
iter_swap_if(first + 16, first + 20, compare, projection);
iter_swap_if(first + 17, first + 21, compare, projection);
iter_swap_if(first + 18, first + 22, compare, projection);
iter_swap_if(first + 19, first + 23, compare, projection);
iter_swap_if(first + 24, first + 28, compare, projection);
iter_swap_if(first + 25, first + 29, compare, projection);
iter_swap_if(first + 26, first + 30, compare, projection);
iter_swap_if(first + 27, first + 31, compare, projection);
iter_swap_if(first, first + 8, compare, projection);
iter_swap_if(first + 1, first + 9, compare, projection);
iter_swap_if(first + 2, first + 10, compare, projection);
iter_swap_if(first + 3, first + 11, compare, projection);
iter_swap_if(first + 4, first + 12, compare, projection);
iter_swap_if(first + 5, first + 13, compare, projection);
iter_swap_if(first + 6, first + 14, compare, projection);
iter_swap_if(first + 7, first + 15, compare, projection);
iter_swap_if(first + 16, first + 24, compare, projection);
iter_swap_if(first + 17, first + 25, compare, projection);
iter_swap_if(first + 18, first + 26, compare, projection);
iter_swap_if(first + 19, first + 27, compare, projection);
iter_swap_if(first + 20, first + 28, compare, projection);
iter_swap_if(first + 21, first + 29, compare, projection);
iter_swap_if(first + 22, first + 30, compare, projection);
iter_swap_if(first + 23, first + 31, compare, projection);
iter_swap_if(first, first + 16, compare, projection);
iter_swap_if(first + 1, first + 8, compare, projection);
iter_swap_if(first + 2, first + 4, compare, projection);
iter_swap_if(first + 3, first + 12, compare, projection);
iter_swap_if(first + 5, first + 10, compare, projection);
iter_swap_if(first + 6, first + 9, compare, projection);
iter_swap_if(first + 7, first + 14, compare, projection);
iter_swap_if(first + 11, first + 13, compare, projection);
iter_swap_if(first + 15, first + 31, compare, projection);
iter_swap_if(first + 17, first + 24, compare, projection);
iter_swap_if(first + 18, first + 20, compare, projection);
iter_swap_if(first + 19, first + 28, compare, projection);
iter_swap_if(first + 21, first + 26, compare, projection);
iter_swap_if(first + 22, first + 25, compare, projection);
iter_swap_if(first + 23, first + 30, compare, projection);
iter_swap_if(first + 27, first + 29, compare, projection);
iter_swap_if(first + 1, first + 2, compare, projection);
iter_swap_if(first + 3, first + 5, compare, projection);
iter_swap_if(first + 4, first + 8, compare, projection);
iter_swap_if(first + 6, first + 22, compare, projection);
iter_swap_if(first + 7, first + 11, compare, projection);
iter_swap_if(first + 9, first + 25, compare, projection);
iter_swap_if(first + 10, first + 12, compare, projection);
iter_swap_if(first + 13, first + 14, compare, projection);
iter_swap_if(first + 17, first + 18, compare, projection);
iter_swap_if(first + 19, first + 21, compare, projection);
iter_swap_if(first + 20, first + 24, compare, projection);
iter_swap_if(first + 23, first + 27, compare, projection);
iter_swap_if(first + 26, first + 28, compare, projection);
iter_swap_if(first + 29, first + 30, compare, projection);
iter_swap_if(first + 1, first + 17, compare, projection);
iter_swap_if(first + 2, first + 18, compare, projection);
iter_swap_if(first + 3, first + 19, compare, projection);
iter_swap_if(first + 4, first + 20, compare, projection);
iter_swap_if(first + 5, first + 10, compare, projection);
iter_swap_if(first + 7, first + 23, compare, projection);
iter_swap_if(first + 8, first + 24, compare, projection);
iter_swap_if(first + 11, first + 27, compare, projection);
iter_swap_if(first + 12, first + 28, compare, projection);
iter_swap_if(first + 13, first + 29, compare, projection);
iter_swap_if(first + 14, first + 30, compare, projection);
iter_swap_if(first + 21, first + 26, compare, projection);
iter_swap_if(first + 3, first + 17, compare, projection);
iter_swap_if(first + 4, first + 16, compare, projection);
iter_swap_if(first + 5, first + 21, compare, projection);
iter_swap_if(first + 6, first + 18, compare, projection);
iter_swap_if(first + 7, first + 9, compare, projection);
iter_swap_if(first + 8, first + 20, compare, projection);
iter_swap_if(first + 10, first + 26, compare, projection);
iter_swap_if(first + 11, first + 23, compare, projection);
iter_swap_if(first + 13, first + 25, compare, projection);
iter_swap_if(first + 14, first + 28, compare, projection);
iter_swap_if(first + 15, first + 27, compare, projection);
iter_swap_if(first + 22, first + 24, compare, projection);
iter_swap_if(first + 1, first + 4, compare, projection);
iter_swap_if(first + 3, first + 8, compare, projection);
iter_swap_if(first + 5, first + 16, compare, projection);
iter_swap_if(first + 7, first + 17, compare, projection);
iter_swap_if(first + 9, first + 21, compare, projection);
iter_swap_if(first + 10, first + 22, compare, projection);
iter_swap_if(first + 11, first + 19, compare, projection);
iter_swap_if(first + 12, first + 20, compare, projection);
iter_swap_if(first + 14, first + 24, compare, projection);
iter_swap_if(first + 15, first + 26, compare, projection);
iter_swap_if(first + 23, first + 28, compare, projection);
iter_swap_if(first + 27, first + 30, compare, projection);
iter_swap_if(first + 2, first + 5, compare, projection);
iter_swap_if(first + 7, first + 8, compare, projection);
iter_swap_if(first + 9, first + 18, compare, projection);
iter_swap_if(first + 11, first + 17, compare, projection);
iter_swap_if(first + 12, first + 16, compare, projection);
iter_swap_if(first + 13, first + 22, compare, projection);
iter_swap_if(first + 14, first + 20, compare, projection);
iter_swap_if(first + 15, first + 19, compare, projection);
iter_swap_if(first + 23, first + 24, compare, projection);
iter_swap_if(first + 26, first + 29, compare, projection);
iter_swap_if(first + 2, first + 4, compare, projection);
iter_swap_if(first + 6, first + 12, compare, projection);
iter_swap_if(first + 9, first + 16, compare, projection);
iter_swap_if(first + 10, first + 11, compare, projection);
iter_swap_if(first + 13, first + 17, compare, projection);
iter_swap_if(first + 14, first + 18, compare, projection);
iter_swap_if(first + 15, first + 22, compare, projection);
iter_swap_if(first + 19, first + 25, compare, projection);
iter_swap_if(first + 20, first + 21, compare, projection);
iter_swap_if(first + 27, first + 29, compare, projection);
iter_swap_if(first + 5, first + 6, compare, projection);
iter_swap_if(first + 8, first + 12, compare, projection);
iter_swap_if(first + 9, first + 10, compare, projection);
iter_swap_if(first + 11, first + 13, compare, projection);
iter_swap_if(first + 14, first + 16, compare, projection);
iter_swap_if(first + 15, first + 17, compare, projection);
iter_swap_if(first + 18, first + 20, compare, projection);
iter_swap_if(first + 19, first + 23, compare, projection);
iter_swap_if(first + 21, first + 22, compare, projection);
iter_swap_if(first + 25, first + 26, compare, projection);
iter_swap_if(first + 3, first + 5, compare, projection);
iter_swap_if(first + 6, first + 7, compare, projection);
iter_swap_if(first + 8, first + 9, compare, projection);
iter_swap_if(first + 10, first + 12, compare, projection);
iter_swap_if(first + 11, first + 14, compare, projection);
iter_swap_if(first + 13, first + 16, compare, projection);
iter_swap_if(first + 15, first + 18, compare, projection);
iter_swap_if(first + 17, first + 20, compare, projection);
iter_swap_if(first + 19, first + 21, compare, projection);
iter_swap_if(first + 22, first + 23, compare, projection);
iter_swap_if(first + 24, first + 25, compare, projection);
iter_swap_if(first + 26, first + 28, compare, projection);
iter_swap_if(first + 3, first + 4, compare, projection);
iter_swap_if(first + 5, first + 6, compare, projection);
iter_swap_if(first + 7, first + 8, compare, projection);
iter_swap_if(first + 9, first + 10, compare, projection);
iter_swap_if(first + 11, first + 12, compare, projection);
iter_swap_if(first + 13, first + 14, compare, projection);
iter_swap_if(first + 15, first + 16, compare, projection);
iter_swap_if(first + 17, first + 18, compare, projection);
iter_swap_if(first + 19, first + 20, compare, projection);
iter_swap_if(first + 21, first + 22, compare, projection);
iter_swap_if(first + 23, first + 24, compare, projection);
iter_swap_if(first + 25, first + 26, compare, projection);
iter_swap_if(first + 27, first + 28, compare, projection);
}
template<typename DifferenceType=std::ptrdiff_t>
CPPSORT_ATTRIBUTE_NODISCARD
static constexpr auto index_pairs() noexcept
-> std::array<utility::index_pair<DifferenceType>, 185>
{
return {{
{0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31},
{0, 2}, {1, 3}, {4, 6}, {5, 7}, {8, 10}, {9, 11}, {12, 14}, {13, 15}, {16, 18}, {17, 19}, {20, 22}, {21, 23}, {24, 26}, {25, 27}, {28, 30}, {29, 31},
{0, 4}, {1, 5}, {2, 6}, {3, 7}, {8, 12}, {9, 13}, {10, 14}, {11, 15}, {16, 20}, {17, 21}, {18, 22}, {19, 23}, {24, 28}, {25, 29}, {26, 30}, {27, 31},
{0, 8}, {1, 9}, {2, 10}, {3, 11}, {4, 12}, {5, 13}, {6, 14}, {7, 15}, {16, 24}, {17, 25}, {18, 26}, {19, 27}, {20, 28}, {21, 29}, {22, 30}, {23, 31},
{0, 16}, {1, 8}, {2, 4}, {3, 12}, {5, 10}, {6, 9}, {7, 14}, {11, 13}, {15, 31}, {17, 24}, {18, 20}, {19, 28}, {21, 26}, {22, 25}, {23, 30}, {27, 29},
{1, 2}, {3, 5}, {4, 8}, {6, 22}, {7, 11}, {9, 25}, {10, 12}, {13, 14}, {17, 18}, {19, 21}, {20, 24}, {23, 27}, {26, 28}, {29, 30},
{1, 17}, {2, 18}, {3, 19}, {4, 20}, {5, 10}, {7, 23}, {8, 24}, {11, 27}, {12, 28}, {13, 29}, {14, 30}, {21, 26},
{3, 17}, {4, 16}, {5, 21}, {6, 18}, {7, 9}, {8, 20}, {10, 26}, {11, 23}, {13, 25}, {14, 28}, {15, 27}, {22, 24},
{1, 4}, {3, 8}, {5, 16}, {7, 17}, {9, 21}, {10, 22}, {11, 19}, {12, 20}, {14, 24}, {15, 26}, {23, 28}, {27, 30},
{2, 5}, {7, 8}, {9, 18}, {11, 17}, {12, 16}, {13, 22}, {14, 20}, {15, 19}, {23, 24}, {26, 29},
{2, 4}, {6, 12}, {9, 16}, {10, 11}, {13, 17}, {14, 18}, {15, 22}, {19, 25}, {20, 21}, {27, 29},
{5, 6}, {8, 12}, {9, 10}, {11, 13}, {14, 16}, {15, 17}, {18, 20}, {19, 23}, {21, 22}, {25, 26},
{3, 5}, {6, 7}, {8, 9}, {10, 12}, {11, 14}, {13, 16}, {15, 18}, {17, 20}, {19, 21}, {22, 23}, {24, 25}, {26, 28},
{3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}, {15, 16}, {17, 18}, {19, 20}, {21, 22}, {23, 24}, {25, 26}, {27, 28},
}};
}
};
}}
#endif // CPPSORT_DETAIL_SORTING_NETWORK_SORT32_H_