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
43namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
55stdc_leading_zeros(_Tp __value)
57 static_assert(std::__unsigned_integer<_Tp>);
58 return std::countl_zero(__value);
62stdc_leading_zeros_uc(
unsigned char __value)
63{
return stdc_leading_zeros(__value); }
66stdc_leading_zeros_us(
unsigned short __value)
67{
return stdc_leading_zeros(__value); }
70stdc_leading_zeros_ui(
unsigned int __value)
71{
return stdc_leading_zeros(__value); }
74stdc_leading_zeros_ul(
unsigned long int __value)
75{
return stdc_leading_zeros(__value); }
78stdc_leading_zeros_ull(
unsigned long long int __value)
79{
return stdc_leading_zeros(__value); }
90stdc_leading_ones(_Tp __value)
92 static_assert(std::__unsigned_integer<_Tp>);
93 return std::countl_one(__value);
97stdc_leading_ones_uc(
unsigned char __value)
98{
return stdc_leading_ones(__value); }
101stdc_leading_ones_us(
unsigned short __value)
102{
return stdc_leading_ones(__value); }
105stdc_leading_ones_ui(
unsigned int __value)
106{
return stdc_leading_ones(__value); }
109stdc_leading_ones_ul(
unsigned long int __value)
110{
return stdc_leading_ones(__value); }
113stdc_leading_ones_ull(
unsigned long long int __value)
114{
return stdc_leading_ones(__value); }
123template<
typename _Tp>
125stdc_trailing_zeros(_Tp __value)
127 static_assert(std::__unsigned_integer<_Tp>);
128 return std::countr_zero(__value);
132stdc_trailing_zeros_uc(
unsigned char __value)
133{
return stdc_trailing_zeros(__value); }
136stdc_trailing_zeros_us(
unsigned short __value)
137{
return stdc_trailing_zeros(__value); }
140stdc_trailing_zeros_ui(
unsigned int __value)
141{
return stdc_trailing_zeros(__value); }
144stdc_trailing_zeros_ul(
unsigned long int __value)
145{
return stdc_trailing_zeros(__value); }
148stdc_trailing_zeros_ull(
unsigned long long int __value)
149{
return stdc_trailing_zeros(__value); }
158template<
typename _Tp>
160stdc_trailing_ones(_Tp __value)
162 static_assert(std::__unsigned_integer<_Tp>);
163 return std::countr_one(__value);
167stdc_trailing_ones_uc(
unsigned char __value)
168{
return stdc_trailing_ones(__value); }
171stdc_trailing_ones_us(
unsigned short __value)
172{
return stdc_trailing_ones(__value); }
175stdc_trailing_ones_ui(
unsigned int __value)
176{
return stdc_trailing_ones(__value); }
179stdc_trailing_ones_ul(
unsigned long int __value)
180{
return stdc_trailing_ones(__value); }
183stdc_trailing_ones_ull(
unsigned long long int __value)
184{
return stdc_trailing_ones(__value); }
195template<
typename _Tp>
197stdc_first_leading_zero(_Tp __value)
199 static_assert(std::__unsigned_integer<_Tp>);
200 return __value == _Tp(-1) ? 0 : 1 + std::countl_one(__value);
204stdc_first_leading_zero_uc(
unsigned char __value)
205{
return stdc_first_leading_zero(__value); }
208stdc_first_leading_zero_us(
unsigned short __value)
209{
return stdc_first_leading_zero(__value); }
212stdc_first_leading_zero_ui(
unsigned int __value)
213{
return stdc_first_leading_zero(__value); }
216stdc_first_leading_zero_ul(
unsigned long int __value)
217{
return stdc_first_leading_zero(__value); }
220stdc_first_leading_zero_ull(
unsigned long long int __value)
221{
return stdc_first_leading_zero(__value); }
232template<
typename _Tp>
234stdc_first_leading_one(_Tp __value)
236 static_assert(std::__unsigned_integer<_Tp>);
237 return __value == 0 ? 0 : 1 + std::countl_zero(__value);
241stdc_first_leading_one_uc(
unsigned char __value)
242{
return stdc_first_leading_one(__value); }
245stdc_first_leading_one_us(
unsigned short __value)
246{
return stdc_first_leading_one(__value); }
249stdc_first_leading_one_ui(
unsigned int __value)
250{
return stdc_first_leading_one(__value); }
253stdc_first_leading_one_ul(
unsigned long int __value)
254{
return stdc_first_leading_one(__value); }
257stdc_first_leading_one_ull(
unsigned long long int __value)
258{
return stdc_first_leading_one(__value); }
269template<
typename _Tp>
271stdc_first_trailing_zero(_Tp __value)
273 static_assert(std::__unsigned_integer<_Tp>);
274 return __value == _Tp(-1) ? 0 : 1 + std::countr_one(__value);
278stdc_first_trailing_zero_uc(
unsigned char __value)
279{
return stdc_first_trailing_zero(__value); }
282stdc_first_trailing_zero_us(
unsigned short __value)
283{
return stdc_first_trailing_zero(__value); }
286stdc_first_trailing_zero_ui(
unsigned int __value)
287{
return stdc_first_trailing_zero(__value); }
290stdc_first_trailing_zero_ul(
unsigned long int __value)
291{
return stdc_first_trailing_zero(__value); }
294stdc_first_trailing_zero_ull(
unsigned long long int __value)
295{
return stdc_first_trailing_zero(__value); }
306template<
typename _Tp>
308stdc_first_trailing_one(_Tp __value)
310 static_assert(std::__unsigned_integer<_Tp>);
311 return __value == 0 ? 0 : 1 + std::countr_zero(__value);
315stdc_first_trailing_one_uc(
unsigned char __value)
316{
return stdc_first_trailing_one(__value); }
319stdc_first_trailing_one_us(
unsigned short __value)
320{
return stdc_first_trailing_one(__value); }
323stdc_first_trailing_one_ui(
unsigned int __value)
324{
return stdc_first_trailing_one(__value); }
327stdc_first_trailing_one_ul(
unsigned long int __value)
328{
return stdc_first_trailing_one(__value); }
331stdc_first_trailing_one_ull(
unsigned long long int __value)
332{
return stdc_first_trailing_one(__value); }
342template<
typename _Tp>
344stdc_count_zeros(_Tp __value)
346 static_assert(std::__unsigned_integer<_Tp>);
347 return std::popcount(_Tp(~__value));
351stdc_count_zeros_uc(
unsigned char __value)
352{
return stdc_count_zeros(__value); }
355stdc_count_zeros_us(
unsigned short __value)
356{
return stdc_count_zeros(__value); }
359stdc_count_zeros_ui(
unsigned int __value)
360{
return stdc_count_zeros(__value); }
363stdc_count_zeros_ul(
unsigned long int __value)
364{
return stdc_count_zeros(__value); }
367stdc_count_zeros_ull(
unsigned long long int __value)
368{
return stdc_count_zeros(__value); }
378template<
typename _Tp>
380stdc_count_ones(_Tp __value)
382 static_assert(std::__unsigned_integer<_Tp>);
383 return std::popcount(__value);
387stdc_count_ones_uc(
unsigned char __value)
388{
return stdc_count_ones(__value); }
391stdc_count_ones_us(
unsigned short __value)
392{
return stdc_count_ones(__value); }
395stdc_count_ones_ui(
unsigned int __value)
396{
return stdc_count_ones(__value); }
399stdc_count_ones_ul(
unsigned long int __value)
400{
return stdc_count_ones(__value); }
403stdc_count_ones_ull(
unsigned long long int __value)
404{
return stdc_count_ones(__value); }
414template<
typename _Tp>
416stdc_has_single_bit(_Tp __value)
418 static_assert(std::__unsigned_integer<_Tp>);
419 return std::has_single_bit(__value);
423stdc_has_single_bit_uc(
unsigned char __value)
424{
return stdc_has_single_bit(__value); }
427stdc_has_single_bit_us(
unsigned short __value)
428{
return stdc_has_single_bit(__value); }
431stdc_has_single_bit_ui(
unsigned int __value)
432{
return stdc_has_single_bit(__value); }
435stdc_has_single_bit_ul(
unsigned long int __value)
436{
return stdc_has_single_bit(__value); }
439stdc_has_single_bit_ull(
unsigned long long int __value)
440{
return stdc_has_single_bit(__value); }
450template<
typename _Tp>
452stdc_bit_width(_Tp __value)
454 static_assert(std::__unsigned_integer<_Tp>);
455 return std::bit_width(__value);
459stdc_bit_width_uc(
unsigned char __value)
460{
return stdc_bit_width(__value); }
463stdc_bit_width_us(
unsigned short __value)
464{
return stdc_bit_width(__value); }
467stdc_bit_width_ui(
unsigned int __value)
468{
return stdc_bit_width(__value); }
471stdc_bit_width_ul(
unsigned long int __value)
472{
return stdc_bit_width(__value); }
475stdc_bit_width_ull(
unsigned long long int __value)
476{
return stdc_bit_width(__value); }
486template<
typename _Tp>
488stdc_bit_floor(_Tp __value)
490 static_assert(std::__unsigned_integer<_Tp>);
491 return std::bit_floor(__value);
495stdc_bit_floor_uc(
unsigned char __value)
496{
return stdc_bit_floor(__value); }
499stdc_bit_floor_us(
unsigned short __value)
500{
return stdc_bit_floor(__value); }
503stdc_bit_floor_ui(
unsigned int __value)
504{
return stdc_bit_floor(__value); }
506inline unsigned long int
507stdc_bit_floor_ul(
unsigned long int __value)
508{
return stdc_bit_floor(__value); }
510inline unsigned long long int
511stdc_bit_floor_ull(
unsigned long long int __value)
512{
return stdc_bit_floor(__value); }
525template<
typename _Tp>
527stdc_bit_ceil(_Tp __value)
529 static_assert(std::__unsigned_integer<_Tp>);
530 constexpr _Tp __msb = _Tp(1) << (__gnu_cxx::__int_traits<_Tp>::__digits - 1);
531 return (__value & __msb) ? 0 : std::bit_ceil(__value);
535stdc_bit_ceil_uc(
unsigned char __value)
536{
return stdc_bit_ceil(__value); }
539stdc_bit_ceil_us(
unsigned short __value)
540{
return stdc_bit_ceil(__value); }
543stdc_bit_ceil_ui(
unsigned int __value)
544{
return stdc_bit_ceil(__value); }
546inline unsigned long int
547stdc_bit_ceil_ul(
unsigned long int __value)
548{
return stdc_bit_ceil(__value); }
550inline unsigned long long int
551stdc_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.