29 #ifndef _GLIBCXX_STDBIT_H
30 #define _GLIBCXX_STDBIT_H
32 #if __cplusplus > 202302L
35 #define __STDC_VERSION_STDBIT_H__ 202311L
37 #define __STDC_ENDIAN_BIG__ __ORDER_BIG_ENDIAN__
38 #define __STDC_ENDIAN_LITTLE__ __ORDER_LITTLE_ENDIAN__
39 #define __STDC_ENDIAN_NATIVE__ __BYTE_ORDER__
41 #ifndef _GLIBCXX_DOXYGEN
43 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
53 template<
typename _Tp>
55 stdc_leading_zeros(_Tp __value)
57 static_assert(std::__unsigned_integer<_Tp>);
58 return std::countl_zero(__value);
62 stdc_leading_zeros_uc(
unsigned char __value)
63 {
return stdc_leading_zeros(__value); }
66 stdc_leading_zeros_us(
unsigned short __value)
67 {
return stdc_leading_zeros(__value); }
70 stdc_leading_zeros_ui(
unsigned int __value)
71 {
return stdc_leading_zeros(__value); }
74 stdc_leading_zeros_ul(
unsigned long int __value)
75 {
return stdc_leading_zeros(__value); }
78 stdc_leading_zeros_ull(
unsigned long long int __value)
79 {
return stdc_leading_zeros(__value); }
88 template<
typename _Tp>
90 stdc_leading_ones(_Tp __value)
92 static_assert(std::__unsigned_integer<_Tp>);
93 return std::countl_one(__value);
97 stdc_leading_ones_uc(
unsigned char __value)
98 {
return stdc_leading_ones(__value); }
101 stdc_leading_ones_us(
unsigned short __value)
102 {
return stdc_leading_ones(__value); }
105 stdc_leading_ones_ui(
unsigned int __value)
106 {
return stdc_leading_ones(__value); }
109 stdc_leading_ones_ul(
unsigned long int __value)
110 {
return stdc_leading_ones(__value); }
113 stdc_leading_ones_ull(
unsigned long long int __value)
114 {
return stdc_leading_ones(__value); }
123 template<
typename _Tp>
125 stdc_trailing_zeros(_Tp __value)
127 static_assert(std::__unsigned_integer<_Tp>);
128 return std::countr_zero(__value);
132 stdc_trailing_zeros_uc(
unsigned char __value)
133 {
return stdc_trailing_zeros(__value); }
136 stdc_trailing_zeros_us(
unsigned short __value)
137 {
return stdc_trailing_zeros(__value); }
140 stdc_trailing_zeros_ui(
unsigned int __value)
141 {
return stdc_trailing_zeros(__value); }
144 stdc_trailing_zeros_ul(
unsigned long int __value)
145 {
return stdc_trailing_zeros(__value); }
148 stdc_trailing_zeros_ull(
unsigned long long int __value)
149 {
return stdc_trailing_zeros(__value); }
158 template<
typename _Tp>
160 stdc_trailing_ones(_Tp __value)
162 static_assert(std::__unsigned_integer<_Tp>);
163 return std::countr_one(__value);
167 stdc_trailing_ones_uc(
unsigned char __value)
168 {
return stdc_trailing_ones(__value); }
171 stdc_trailing_ones_us(
unsigned short __value)
172 {
return stdc_trailing_ones(__value); }
175 stdc_trailing_ones_ui(
unsigned int __value)
176 {
return stdc_trailing_ones(__value); }
179 stdc_trailing_ones_ul(
unsigned long int __value)
180 {
return stdc_trailing_ones(__value); }
183 stdc_trailing_ones_ull(
unsigned long long int __value)
184 {
return stdc_trailing_ones(__value); }
195 template<
typename _Tp>
197 stdc_first_leading_zero(_Tp __value)
199 static_assert(std::__unsigned_integer<_Tp>);
200 return __value == _Tp(-1) ? 0 : 1 + std::countl_one(__value);
204 stdc_first_leading_zero_uc(
unsigned char __value)
205 {
return stdc_first_leading_zero(__value); }
208 stdc_first_leading_zero_us(
unsigned short __value)
209 {
return stdc_first_leading_zero(__value); }
212 stdc_first_leading_zero_ui(
unsigned int __value)
213 {
return stdc_first_leading_zero(__value); }
216 stdc_first_leading_zero_ul(
unsigned long int __value)
217 {
return stdc_first_leading_zero(__value); }
220 stdc_first_leading_zero_ull(
unsigned long long int __value)
221 {
return stdc_first_leading_zero(__value); }
232 template<
typename _Tp>
234 stdc_first_leading_one(_Tp __value)
236 static_assert(std::__unsigned_integer<_Tp>);
237 return __value == 0 ? 0 : 1 + std::countl_zero(__value);
241 stdc_first_leading_one_uc(
unsigned char __value)
242 {
return stdc_first_leading_one(__value); }
245 stdc_first_leading_one_us(
unsigned short __value)
246 {
return stdc_first_leading_one(__value); }
249 stdc_first_leading_one_ui(
unsigned int __value)
250 {
return stdc_first_leading_one(__value); }
253 stdc_first_leading_one_ul(
unsigned long int __value)
254 {
return stdc_first_leading_one(__value); }
257 stdc_first_leading_one_ull(
unsigned long long int __value)
258 {
return stdc_first_leading_one(__value); }
269 template<
typename _Tp>
271 stdc_first_trailing_zero(_Tp __value)
273 static_assert(std::__unsigned_integer<_Tp>);
274 return __value == _Tp(-1) ? 0 : 1 + std::countr_one(__value);
278 stdc_first_trailing_zero_uc(
unsigned char __value)
279 {
return stdc_first_trailing_zero(__value); }
282 stdc_first_trailing_zero_us(
unsigned short __value)
283 {
return stdc_first_trailing_zero(__value); }
286 stdc_first_trailing_zero_ui(
unsigned int __value)
287 {
return stdc_first_trailing_zero(__value); }
290 stdc_first_trailing_zero_ul(
unsigned long int __value)
291 {
return stdc_first_trailing_zero(__value); }
294 stdc_first_trailing_zero_ull(
unsigned long long int __value)
295 {
return stdc_first_trailing_zero(__value); }
306 template<
typename _Tp>
308 stdc_first_trailing_one(_Tp __value)
310 static_assert(std::__unsigned_integer<_Tp>);
311 return __value == 0 ? 0 : 1 + std::countr_zero(__value);
315 stdc_first_trailing_one_uc(
unsigned char __value)
316 {
return stdc_first_trailing_one(__value); }
319 stdc_first_trailing_one_us(
unsigned short __value)
320 {
return stdc_first_trailing_one(__value); }
323 stdc_first_trailing_one_ui(
unsigned int __value)
324 {
return stdc_first_trailing_one(__value); }
327 stdc_first_trailing_one_ul(
unsigned long int __value)
328 {
return stdc_first_trailing_one(__value); }
331 stdc_first_trailing_one_ull(
unsigned long long int __value)
332 {
return stdc_first_trailing_one(__value); }
342 template<
typename _Tp>
344 stdc_count_zeros(_Tp __value)
346 static_assert(std::__unsigned_integer<_Tp>);
347 return std::popcount(_Tp(~__value));
351 stdc_count_zeros_uc(
unsigned char __value)
352 {
return stdc_count_zeros(__value); }
355 stdc_count_zeros_us(
unsigned short __value)
356 {
return stdc_count_zeros(__value); }
359 stdc_count_zeros_ui(
unsigned int __value)
360 {
return stdc_count_zeros(__value); }
363 stdc_count_zeros_ul(
unsigned long int __value)
364 {
return stdc_count_zeros(__value); }
367 stdc_count_zeros_ull(
unsigned long long int __value)
368 {
return stdc_count_zeros(__value); }
378 template<
typename _Tp>
380 stdc_count_ones(_Tp __value)
382 static_assert(std::__unsigned_integer<_Tp>);
383 return std::popcount(__value);
387 stdc_count_ones_uc(
unsigned char __value)
388 {
return stdc_count_ones(__value); }
391 stdc_count_ones_us(
unsigned short __value)
392 {
return stdc_count_ones(__value); }
395 stdc_count_ones_ui(
unsigned int __value)
396 {
return stdc_count_ones(__value); }
399 stdc_count_ones_ul(
unsigned long int __value)
400 {
return stdc_count_ones(__value); }
403 stdc_count_ones_ull(
unsigned long long int __value)
404 {
return stdc_count_ones(__value); }
414 template<
typename _Tp>
416 stdc_has_single_bit(_Tp __value)
418 static_assert(std::__unsigned_integer<_Tp>);
419 return std::has_single_bit(__value);
423 stdc_has_single_bit_uc(
unsigned char __value)
424 {
return stdc_has_single_bit(__value); }
427 stdc_has_single_bit_us(
unsigned short __value)
428 {
return stdc_has_single_bit(__value); }
431 stdc_has_single_bit_ui(
unsigned int __value)
432 {
return stdc_has_single_bit(__value); }
435 stdc_has_single_bit_ul(
unsigned long int __value)
436 {
return stdc_has_single_bit(__value); }
439 stdc_has_single_bit_ull(
unsigned long long int __value)
440 {
return stdc_has_single_bit(__value); }
450 template<
typename _Tp>
452 stdc_bit_width(_Tp __value)
454 static_assert(std::__unsigned_integer<_Tp>);
455 return std::bit_width(__value);
459 stdc_bit_width_uc(
unsigned char __value)
460 {
return stdc_bit_width(__value); }
463 stdc_bit_width_us(
unsigned short __value)
464 {
return stdc_bit_width(__value); }
467 stdc_bit_width_ui(
unsigned int __value)
468 {
return stdc_bit_width(__value); }
471 stdc_bit_width_ul(
unsigned long int __value)
472 {
return stdc_bit_width(__value); }
475 stdc_bit_width_ull(
unsigned long long int __value)
476 {
return stdc_bit_width(__value); }
486 template<
typename _Tp>
488 stdc_bit_floor(_Tp __value)
490 static_assert(std::__unsigned_integer<_Tp>);
491 return std::bit_floor(__value);
495 stdc_bit_floor_uc(
unsigned char __value)
496 {
return stdc_bit_floor(__value); }
498 inline unsigned short
499 stdc_bit_floor_us(
unsigned short __value)
500 {
return stdc_bit_floor(__value); }
503 stdc_bit_floor_ui(
unsigned int __value)
504 {
return stdc_bit_floor(__value); }
506 inline unsigned long int
507 stdc_bit_floor_ul(
unsigned long int __value)
508 {
return stdc_bit_floor(__value); }
510 inline unsigned long long int
511 stdc_bit_floor_ull(
unsigned long long int __value)
512 {
return stdc_bit_floor(__value); }
525 template<
typename _Tp>
527 stdc_bit_ceil(_Tp __value)
529 static_assert(std::__unsigned_integer<_Tp>);
531 return (__value & __msb) ? 0 : std::bit_ceil(__value);
535 stdc_bit_ceil_uc(
unsigned char __value)
536 {
return stdc_bit_ceil(__value); }
538 inline unsigned short
539 stdc_bit_ceil_us(
unsigned short __value)
540 {
return stdc_bit_ceil(__value); }
543 stdc_bit_ceil_ui(
unsigned int __value)
544 {
return stdc_bit_ceil(__value); }
546 inline unsigned long int
547 stdc_bit_ceil_ul(
unsigned long int __value)
548 {
return stdc_bit_ceil(__value); }
550 inline unsigned long long int
551 stdc_bit_ceil_ull(
unsigned long long int __value)
552 {
return stdc_bit_ceil(__value); }
555 #ifndef _GLIBCXX_DOXYGEN
557 #define _GLIBCXX_STDBIT_FUNC(F) \
558 using __gnu_cxx::F ## _uc; \
559 using __gnu_cxx::F ## _us; \
560 using __gnu_cxx::F ## _ui; \
561 using __gnu_cxx::F ## _ul; \
562 using __gnu_cxx::F ## _ull; \
564 _GLIBCXX_STDBIT_FUNC(stdc_leading_zeros);
565 _GLIBCXX_STDBIT_FUNC(stdc_leading_ones);
566 _GLIBCXX_STDBIT_FUNC(stdc_trailing_zeros);
567 _GLIBCXX_STDBIT_FUNC(stdc_trailing_ones);
568 _GLIBCXX_STDBIT_FUNC(stdc_first_leading_zero);
569 _GLIBCXX_STDBIT_FUNC(stdc_first_leading_one);
570 _GLIBCXX_STDBIT_FUNC(stdc_first_trailing_zero);
571 _GLIBCXX_STDBIT_FUNC(stdc_first_trailing_one);
572 _GLIBCXX_STDBIT_FUNC(stdc_count_zeros);
573 _GLIBCXX_STDBIT_FUNC(stdc_count_ones);
574 _GLIBCXX_STDBIT_FUNC(stdc_has_single_bit);
575 _GLIBCXX_STDBIT_FUNC(stdc_bit_width);
576 _GLIBCXX_STDBIT_FUNC(stdc_bit_floor);
577 _GLIBCXX_STDBIT_FUNC(stdc_bit_ceil);
578 #undef _GLIBCXX_STDBIT_FUNC
GNU extensions for public use.
__numeric_traits_integer< _Tp > __int_traits
Convenience alias for __numeric_traits<integer-type>.