Skip to content

Commit 96d373c

Browse files
committed
constexpr
1 parent b3458fd commit 96d373c

File tree

3 files changed

+20
-13
lines changed

3 files changed

+20
-13
lines changed

libcxx/include/__algorithm/radix_sort.h

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
6767
#if _LIBCPP_STD_VER >= 14
6868

6969
template <class _InputIterator, class _OutputIterator>
70-
_LIBCPP_HIDE_FROM_ABI pair<_OutputIterator, __iter_value_type<_InputIterator>>
70+
_LIBCPP_HIDE_FROM_ABI constexpr pair<_OutputIterator, __iter_value_type<_InputIterator>>
7171
__partial_sum_max(_InputIterator __first, _InputIterator __last, _OutputIterator __result) {
7272
if (__first == __last)
7373
return {__result, 0};
@@ -109,15 +109,15 @@ struct __counting_sort_traits {
109109
};
110110

111111
template <class _Radix, class _Integer>
112-
_LIBCPP_HIDE_FROM_ABI auto __nth_radix(size_t __radix_number, _Radix __radix, _Integer __n) {
112+
_LIBCPP_HIDE_FROM_ABI constexpr auto __nth_radix(size_t __radix_number, _Radix __radix, _Integer __n) {
113113
static_assert(is_unsigned<_Integer>::value);
114114
using __traits = __counting_sort_traits<_Integer, _Radix>;
115115

116116
return __radix(static_cast<_Integer>(__n >> __traits::__radix_size * __radix_number));
117117
}
118118

119119
template <class _ForwardIterator, class _Map, class _RandomAccessIterator>
120-
_LIBCPP_HIDE_FROM_ABI void
120+
_LIBCPP_HIDE_FROM_ABI constexpr void
121121
__collect(_ForwardIterator __first, _ForwardIterator __last, _Map __map, _RandomAccessIterator __counters) {
122122
using __value_type = __iter_value_type<_ForwardIterator>;
123123
using __traits = __counting_sort_traits<__value_type, _Map>;
@@ -129,7 +129,7 @@ __collect(_ForwardIterator __first, _ForwardIterator __last, _Map __map, _Random
129129
}
130130

131131
template <class _ForwardIterator, class _RandomAccessIterator1, class _Map, class _RandomAccessIterator2>
132-
_LIBCPP_HIDE_FROM_ABI void
132+
_LIBCPP_HIDE_FROM_ABI constexpr void
133133
__dispose(_ForwardIterator __first,
134134
_ForwardIterator __last,
135135
_RandomAccessIterator1 __result,
@@ -147,7 +147,7 @@ template <class _ForwardIterator,
147147
class _RandomAccessIterator1,
148148
class _RandomAccessIterator2,
149149
size_t... _Radices>
150-
_LIBCPP_HIDE_FROM_ABI bool __collect_impl(
150+
_LIBCPP_HIDE_FROM_ABI constexpr bool __collect_impl(
151151
_ForwardIterator __first,
152152
_ForwardIterator __last,
153153
_Map __map,
@@ -177,7 +177,7 @@ _LIBCPP_HIDE_FROM_ABI bool __collect_impl(
177177
}
178178

179179
template <class _ForwardIterator, class _Map, class _Radix, class _RandomAccessIterator1, class _RandomAccessIterator2>
180-
_LIBCPP_HIDE_FROM_ABI bool
180+
_LIBCPP_HIDE_FROM_ABI constexpr bool
181181
__collect(_ForwardIterator __first,
182182
_ForwardIterator __last,
183183
_Map __map,
@@ -191,7 +191,7 @@ __collect(_ForwardIterator __first,
191191
}
192192

193193
template <class _BidirectionalIterator, class _RandomAccessIterator1, class _Map, class _RandomAccessIterator2>
194-
_LIBCPP_HIDE_FROM_ABI void __dispose_backward(
194+
_LIBCPP_HIDE_FROM_ABI constexpr void __dispose_backward(
195195
_BidirectionalIterator __first,
196196
_BidirectionalIterator __last,
197197
_RandomAccessIterator1 __result,
@@ -206,7 +206,7 @@ _LIBCPP_HIDE_FROM_ABI void __dispose_backward(
206206
}
207207

208208
template <class _ForwardIterator, class _RandomAccessIterator, class _Map>
209-
_LIBCPP_HIDE_FROM_ABI _RandomAccessIterator
209+
_LIBCPP_HIDE_FROM_ABI constexpr _RandomAccessIterator
210210
__counting_sort_impl(_ForwardIterator __first, _ForwardIterator __last, _RandomAccessIterator __result, _Map __map) {
211211
using __value_type = __iter_value_type<_ForwardIterator>;
212212
using __traits = __counting_sort_traits<__value_type, _Map>;
@@ -225,7 +225,7 @@ template <class _RandomAccessIterator1,
225225
class _Radix,
226226
enable_if_t< __radix_sort_traits<__iter_value_type<_RandomAccessIterator1>, _Map, _Radix>::__radix_count == 1,
227227
int> = 0>
228-
_LIBCPP_HIDE_FROM_ABI void __radix_sort_impl(
228+
_LIBCPP_HIDE_FROM_ABI constexpr void __radix_sort_impl(
229229
_RandomAccessIterator1 __first,
230230
_RandomAccessIterator1 __last,
231231
_RandomAccessIterator2 __buffer,
@@ -245,7 +245,7 @@ template <
245245
class _Radix,
246246
enable_if_t< __radix_sort_traits<__iter_value_type<_RandomAccessIterator1>, _Map, _Radix>::__radix_count % 2 == 0,
247247
int> = 0 >
248-
_LIBCPP_HIDE_FROM_ABI void __radix_sort_impl(
248+
_LIBCPP_HIDE_FROM_ABI constexpr void __radix_sort_impl(
249249
_RandomAccessIterator1 __first,
250250
_RandomAccessIterator1 __last,
251251
_RandomAccessIterator2 __buffer_begin,
@@ -307,7 +307,7 @@ struct __low_byte_fn {
307307
};
308308

309309
template <class _RandomAccessIterator1, class _RandomAccessIterator2, class _Map, class _Radix>
310-
_LIBCPP_HIDE_FROM_ABI void
310+
_LIBCPP_HIDE_FROM_ABI constexpr void
311311
__radix_sort(_RandomAccessIterator1 __first,
312312
_RandomAccessIterator1 __last,
313313
_RandomAccessIterator2 __buffer,
@@ -318,7 +318,7 @@ __radix_sort(_RandomAccessIterator1 __first,
318318
}
319319

320320
template <class _RandomAccessIterator1, class _RandomAccessIterator2>
321-
_LIBCPP_HIDE_FROM_ABI void
321+
_LIBCPP_HIDE_FROM_ABI constexpr void
322322
__radix_sort(_RandomAccessIterator1 __first, _RandomAccessIterator1 __last, _RandomAccessIterator2 __buffer) {
323323
std::__radix_sort(__first, __last, __buffer, __identity{}, __low_byte_fn{});
324324
}

libcxx/include/__algorithm/stable_sort.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,12 @@ _LIBCPP_CONSTEXPR_SINCE_CXX26 void __stable_sort(
253253
if constexpr (__allowed_radix_sort) {
254254
if (__len <= __buff_size && __len >= static_cast<difference_type>(__radix_sort_min_bound<value_type>()) &&
255255
__len <= static_cast<difference_type>(__radix_sort_max_bound<value_type>())) {
256+
for (auto* p = __buff; p < __buff + __buff_size; ++p) {
257+
std::__construct_at(p, 0);
258+
}
259+
__destruct_n __d(__buff_size);
260+
unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
261+
256262
std::__radix_sort(__first, __last, __buff);
257263
return;
258264
}

libcxx/test/std/algorithms/alg.sorting/alg.sort/stable.sort/stable_sort.pass.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,9 @@ TEST_CONSTEXPR_CXX26 bool test() {
178178
test_larger_sorts<T>(1009);
179179
test_larger_sorts<T>(1024);
180180
test_larger_sorts<T>(1031);
181-
test_larger_sorts<T>(2053);
182181
}
182+
// test constexprness of radix sort branch
183+
test_larger_sorts<T>(2053);
183184

184185
// check that the algorithm works without memory
185186
#ifndef TEST_HAS_NO_EXCEPTIONS

0 commit comments

Comments
 (0)