29 #ifndef _GLIBCXX_STDBIT_H
30 #define _GLIBCXX_STDBIT_H
32 #define __glibcxx_want_stdbit_h
35 #ifdef __cpp_lib_stdbit_h
39 #define __STDC_VERSION_STDBIT_H__ 202311L
41 #define __STDC_ENDIAN_BIG__ __ORDER_BIG_ENDIAN__
42 #define __STDC_ENDIAN_LITTLE__ __ORDER_LITTLE_ENDIAN__
43 #define __STDC_ENDIAN_NATIVE__ __BYTE_ORDER__
45 #ifndef _GLIBCXX_DOXYGEN
47 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
57 template<
typename _Tp>
59 stdc_leading_zeros(_Tp __value)
61 static_assert(std::__unsigned_integer<_Tp>);
62 return std::countl_zero(__value);
66 stdc_leading_zeros_uc(
unsigned char __value)
67 {
return stdc_leading_zeros(__value); }
70 stdc_leading_zeros_us(
unsigned short __value)
71 {
return stdc_leading_zeros(__value); }
74 stdc_leading_zeros_ui(
unsigned int __value)
75 {
return stdc_leading_zeros(__value); }
78 stdc_leading_zeros_ul(
unsigned long int __value)
79 {
return stdc_leading_zeros(__value); }
82 stdc_leading_zeros_ull(
unsigned long long int __value)
83 {
return stdc_leading_zeros(__value); }
92 template<
typename _Tp>
94 stdc_leading_ones(_Tp __value)
96 static_assert(std::__unsigned_integer<_Tp>);
97 return std::countl_one(__value);
101 stdc_leading_ones_uc(
unsigned char __value)
102 {
return stdc_leading_ones(__value); }
105 stdc_leading_ones_us(
unsigned short __value)
106 {
return stdc_leading_ones(__value); }
109 stdc_leading_ones_ui(
unsigned int __value)
110 {
return stdc_leading_ones(__value); }
113 stdc_leading_ones_ul(
unsigned long int __value)
114 {
return stdc_leading_ones(__value); }
117 stdc_leading_ones_ull(
unsigned long long int __value)
118 {
return stdc_leading_ones(__value); }
127 template<
typename _Tp>
129 stdc_trailing_zeros(_Tp __value)
131 static_assert(std::__unsigned_integer<_Tp>);
132 return std::countr_zero(__value);
136 stdc_trailing_zeros_uc(
unsigned char __value)
137 {
return stdc_trailing_zeros(__value); }
140 stdc_trailing_zeros_us(
unsigned short __value)
141 {
return stdc_trailing_zeros(__value); }
144 stdc_trailing_zeros_ui(
unsigned int __value)
145 {
return stdc_trailing_zeros(__value); }
148 stdc_trailing_zeros_ul(
unsigned long int __value)
149 {
return stdc_trailing_zeros(__value); }
152 stdc_trailing_zeros_ull(
unsigned long long int __value)
153 {
return stdc_trailing_zeros(__value); }
162 template<
typename _Tp>
164 stdc_trailing_ones(_Tp __value)
166 static_assert(std::__unsigned_integer<_Tp>);
167 return std::countr_one(__value);
171 stdc_trailing_ones_uc(
unsigned char __value)
172 {
return stdc_trailing_ones(__value); }
175 stdc_trailing_ones_us(
unsigned short __value)
176 {
return stdc_trailing_ones(__value); }
179 stdc_trailing_ones_ui(
unsigned int __value)
180 {
return stdc_trailing_ones(__value); }
183 stdc_trailing_ones_ul(
unsigned long int __value)
184 {
return stdc_trailing_ones(__value); }
187 stdc_trailing_ones_ull(
unsigned long long int __value)
188 {
return stdc_trailing_ones(__value); }
199 template<
typename _Tp>
201 stdc_first_leading_zero(_Tp __value)
203 static_assert(std::__unsigned_integer<_Tp>);
204 return __value == _Tp(-1) ? 0 : 1 + std::countl_one(__value);
208 stdc_first_leading_zero_uc(
unsigned char __value)
209 {
return stdc_first_leading_zero(__value); }
212 stdc_first_leading_zero_us(
unsigned short __value)
213 {
return stdc_first_leading_zero(__value); }
216 stdc_first_leading_zero_ui(
unsigned int __value)
217 {
return stdc_first_leading_zero(__value); }
220 stdc_first_leading_zero_ul(
unsigned long int __value)
221 {
return stdc_first_leading_zero(__value); }
224 stdc_first_leading_zero_ull(
unsigned long long int __value)
225 {
return stdc_first_leading_zero(__value); }
236 template<
typename _Tp>
238 stdc_first_leading_one(_Tp __value)
240 static_assert(std::__unsigned_integer<_Tp>);
241 return __value == 0 ? 0 : 1 + std::countl_zero(__value);
245 stdc_first_leading_one_uc(
unsigned char __value)
246 {
return stdc_first_leading_one(__value); }
249 stdc_first_leading_one_us(
unsigned short __value)
250 {
return stdc_first_leading_one(__value); }
253 stdc_first_leading_one_ui(
unsigned int __value)
254 {
return stdc_first_leading_one(__value); }
257 stdc_first_leading_one_ul(
unsigned long int __value)
258 {
return stdc_first_leading_one(__value); }
261 stdc_first_leading_one_ull(
unsigned long long int __value)
262 {
return stdc_first_leading_one(__value); }
273 template<
typename _Tp>
275 stdc_first_trailing_zero(_Tp __value)
277 static_assert(std::__unsigned_integer<_Tp>);
278 return __value == _Tp(-1) ? 0 : 1 + std::countr_one(__value);
282 stdc_first_trailing_zero_uc(
unsigned char __value)
283 {
return stdc_first_trailing_zero(__value); }
286 stdc_first_trailing_zero_us(
unsigned short __value)
287 {
return stdc_first_trailing_zero(__value); }
290 stdc_first_trailing_zero_ui(
unsigned int __value)
291 {
return stdc_first_trailing_zero(__value); }
294 stdc_first_trailing_zero_ul(
unsigned long int __value)
295 {
return stdc_first_trailing_zero(__value); }
298 stdc_first_trailing_zero_ull(
unsigned long long int __value)
299 {
return stdc_first_trailing_zero(__value); }
310 template<
typename _Tp>
312 stdc_first_trailing_one(_Tp __value)
314 static_assert(std::__unsigned_integer<_Tp>);
315 return __value == 0 ? 0 : 1 + std::countr_zero(__value);
319 stdc_first_trailing_one_uc(
unsigned char __value)
320 {
return stdc_first_trailing_one(__value); }
323 stdc_first_trailing_one_us(
unsigned short __value)
324 {
return stdc_first_trailing_one(__value); }
327 stdc_first_trailing_one_ui(
unsigned int __value)
328 {
return stdc_first_trailing_one(__value); }
331 stdc_first_trailing_one_ul(
unsigned long int __value)
332 {
return stdc_first_trailing_one(__value); }
335 stdc_first_trailing_one_ull(
unsigned long long int __value)
336 {
return stdc_first_trailing_one(__value); }
346 template<
typename _Tp>
348 stdc_count_zeros(_Tp __value)
350 static_assert(std::__unsigned_integer<_Tp>);
351 return std::popcount(_Tp(~__value));
355 stdc_count_zeros_uc(
unsigned char __value)
356 {
return stdc_count_zeros(__value); }
359 stdc_count_zeros_us(
unsigned short __value)
360 {
return stdc_count_zeros(__value); }
363 stdc_count_zeros_ui(
unsigned int __value)
364 {
return stdc_count_zeros(__value); }
367 stdc_count_zeros_ul(
unsigned long int __value)
368 {
return stdc_count_zeros(__value); }
371 stdc_count_zeros_ull(
unsigned long long int __value)
372 {
return stdc_count_zeros(__value); }
382 template<
typename _Tp>
384 stdc_count_ones(_Tp __value)
386 static_assert(std::__unsigned_integer<_Tp>);
387 return std::popcount(__value);
391 stdc_count_ones_uc(
unsigned char __value)
392 {
return stdc_count_ones(__value); }
395 stdc_count_ones_us(
unsigned short __value)
396 {
return stdc_count_ones(__value); }
399 stdc_count_ones_ui(
unsigned int __value)
400 {
return stdc_count_ones(__value); }
403 stdc_count_ones_ul(
unsigned long int __value)
404 {
return stdc_count_ones(__value); }
407 stdc_count_ones_ull(
unsigned long long int __value)
408 {
return stdc_count_ones(__value); }
418 template<
typename _Tp>
420 stdc_has_single_bit(_Tp __value)
422 static_assert(std::__unsigned_integer<_Tp>);
423 return std::has_single_bit(__value);
427 stdc_has_single_bit_uc(
unsigned char __value)
428 {
return stdc_has_single_bit(__value); }
431 stdc_has_single_bit_us(
unsigned short __value)
432 {
return stdc_has_single_bit(__value); }
435 stdc_has_single_bit_ui(
unsigned int __value)
436 {
return stdc_has_single_bit(__value); }
439 stdc_has_single_bit_ul(
unsigned long int __value)
440 {
return stdc_has_single_bit(__value); }
443 stdc_has_single_bit_ull(
unsigned long long int __value)
444 {
return stdc_has_single_bit(__value); }
454 template<
typename _Tp>
456 stdc_bit_width(_Tp __value)
458 static_assert(std::__unsigned_integer<_Tp>);
459 return std::bit_width(__value);
463 stdc_bit_width_uc(
unsigned char __value)
464 {
return stdc_bit_width(__value); }
467 stdc_bit_width_us(
unsigned short __value)
468 {
return stdc_bit_width(__value); }
471 stdc_bit_width_ui(
unsigned int __value)
472 {
return stdc_bit_width(__value); }
475 stdc_bit_width_ul(
unsigned long int __value)
476 {
return stdc_bit_width(__value); }
479 stdc_bit_width_ull(
unsigned long long int __value)
480 {
return stdc_bit_width(__value); }
490 template<
typename _Tp>
492 stdc_bit_floor(_Tp __value)
494 static_assert(std::__unsigned_integer<_Tp>);
495 return std::bit_floor(__value);
499 stdc_bit_floor_uc(
unsigned char __value)
500 {
return stdc_bit_floor(__value); }
502 inline unsigned short
503 stdc_bit_floor_us(
unsigned short __value)
504 {
return stdc_bit_floor(__value); }
507 stdc_bit_floor_ui(
unsigned int __value)
508 {
return stdc_bit_floor(__value); }
510 inline unsigned long int
511 stdc_bit_floor_ul(
unsigned long int __value)
512 {
return stdc_bit_floor(__value); }
514 inline unsigned long long int
515 stdc_bit_floor_ull(
unsigned long long int __value)
516 {
return stdc_bit_floor(__value); }
529 template<
typename _Tp>
531 stdc_bit_ceil(_Tp __value)
533 static_assert(std::__unsigned_integer<_Tp>);
535 return (__value & __msb) ? 0 : std::bit_ceil(__value);
539 stdc_bit_ceil_uc(
unsigned char __value)
540 {
return stdc_bit_ceil(__value); }
542 inline unsigned short
543 stdc_bit_ceil_us(
unsigned short __value)
544 {
return stdc_bit_ceil(__value); }
547 stdc_bit_ceil_ui(
unsigned int __value)
548 {
return stdc_bit_ceil(__value); }
550 inline unsigned long int
551 stdc_bit_ceil_ul(
unsigned long int __value)
552 {
return stdc_bit_ceil(__value); }
554 inline unsigned long long int
555 stdc_bit_ceil_ull(
unsigned long long int __value)
556 {
return stdc_bit_ceil(__value); }
559 #ifndef _GLIBCXX_DOXYGEN
561 #define _GLIBCXX_STDBIT_FUNC(F) \
562 using __gnu_cxx::F ## _uc; \
563 using __gnu_cxx::F ## _us; \
564 using __gnu_cxx::F ## _ui; \
565 using __gnu_cxx::F ## _ul; \
566 using __gnu_cxx::F ## _ull; \
568 _GLIBCXX_STDBIT_FUNC(stdc_leading_zeros);
569 _GLIBCXX_STDBIT_FUNC(stdc_leading_ones);
570 _GLIBCXX_STDBIT_FUNC(stdc_trailing_zeros);
571 _GLIBCXX_STDBIT_FUNC(stdc_trailing_ones);
572 _GLIBCXX_STDBIT_FUNC(stdc_first_leading_zero);
573 _GLIBCXX_STDBIT_FUNC(stdc_first_leading_one);
574 _GLIBCXX_STDBIT_FUNC(stdc_first_trailing_zero);
575 _GLIBCXX_STDBIT_FUNC(stdc_first_trailing_one);
576 _GLIBCXX_STDBIT_FUNC(stdc_count_zeros);
577 _GLIBCXX_STDBIT_FUNC(stdc_count_ones);
578 _GLIBCXX_STDBIT_FUNC(stdc_has_single_bit);
579 _GLIBCXX_STDBIT_FUNC(stdc_bit_width);
580 _GLIBCXX_STDBIT_FUNC(stdc_bit_floor);
581 _GLIBCXX_STDBIT_FUNC(stdc_bit_ceil);
582 #undef _GLIBCXX_STDBIT_FUNC
GNU extensions for public use.
__numeric_traits_integer< _Tp > __int_traits
Convenience alias for __numeric_traits<integer-type>.