1// <bit> -*- C++ -*-
2
3// Copyright (C) 2018-2020 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file include/bit
26 *  This is a Standard C++ Library header.
27 */
28
29#ifndef _GLIBCXX_BIT
30#define _GLIBCXX_BIT 1
31
32#pragma GCC system_header
33
34#if __cplusplus >= 201402L
35
36#include <type_traits>
37
38#if _GLIBCXX_HOSTED
39# include <ext/numeric_traits.h>
40#else
41# include <limits>
42/// @cond undocumented
43namespace __gnu_cxx
44{
45  template<typename _Tp>
46    struct __int_traits
47    {
48      static constexpr int __digits = std::numeric_limits<_Tp>::digits;
49      static constexpr _Tp __max = std::numeric_limits<_Tp>::max();
50    };
51}
52/// @endcond
53#endif
54
55namespace std _GLIBCXX_VISIBILITY(default)
56{
57_GLIBCXX_BEGIN_NAMESPACE_VERSION
58
59  /**
60   * @defgroup bit_manip Bit manipulation
61   * @ingroup numerics
62   *
63   * Utilities for examining and manipulating individual bits.
64   *
65   * @{
66   */
67
68  /// @cond undoc
69
70  template<typename _Tp>
71    constexpr _Tp
72    __rotl(_Tp __x, int __s) noexcept
73    {
74      constexpr auto _Nd = __gnu_cxx::__int_traits<_Tp>::__digits;
75      const int __r = __s % _Nd;
76      if (__r == 0)
77	return __x;
78      else if (__r > 0)
79	return (__x << __r) | (__x >> ((_Nd - __r) % _Nd));
80      else
81	return (__x >> -__r) | (__x << ((_Nd + __r) % _Nd)); // rotr(x, -r)
82    }
83
84  template<typename _Tp>
85    constexpr _Tp
86    __rotr(_Tp __x, int __s) noexcept
87    {
88      constexpr auto _Nd = __gnu_cxx::__int_traits<_Tp>::__digits;
89      const int __r = __s % _Nd;
90      if (__r == 0)
91	return __x;
92      else if (__r > 0)
93	return (__x >> __r) | (__x << ((_Nd - __r) % _Nd));
94      else
95	return (__x << -__r) | (__x >> ((_Nd + __r) % _Nd)); // rotl(x, -r)
96    }
97
98  template<typename _Tp>
99    constexpr int
100    __countl_zero(_Tp __x) noexcept
101    {
102      using __gnu_cxx::__int_traits;
103      constexpr auto _Nd = __int_traits<_Tp>::__digits;
104
105      if (__x == 0)
106        return _Nd;
107
108      constexpr auto _Nd_ull = __int_traits<unsigned long long>::__digits;
109      constexpr auto _Nd_ul = __int_traits<unsigned long>::__digits;
110      constexpr auto _Nd_u = __int_traits<unsigned>::__digits;
111
112      if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_u)
113	{
114	  constexpr int __diff = _Nd_u - _Nd;
115	  return __builtin_clz(__x) - __diff;
116	}
117      else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ul)
118	{
119	  constexpr int __diff = _Nd_ul - _Nd;
120	  return __builtin_clzl(__x) - __diff;
121	}
122      else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ull)
123	{
124	  constexpr int __diff = _Nd_ull - _Nd;
125	  return __builtin_clzll(__x) - __diff;
126	}
127      else // (_Nd > _Nd_ull)
128	{
129	  static_assert(_Nd <= (2 * _Nd_ull),
130			"Maximum supported integer size is 128-bit");
131
132	  unsigned long long __high = __x >> _Nd_ull;
133	  if (__high != 0)
134	    {
135	      constexpr int __diff = (2 * _Nd_ull) - _Nd;
136	      return __builtin_clzll(__high) - __diff;
137	    }
138	  constexpr auto __max_ull = __int_traits<unsigned long long>::__max;
139	  unsigned long long __low = __x & __max_ull;
140	  return (_Nd - _Nd_ull) + __builtin_clzll(__low);
141	}
142    }
143
144  template<typename _Tp>
145    constexpr int
146    __countl_one(_Tp __x) noexcept
147    {
148      return std::__countl_zero<_Tp>((_Tp)~__x);
149    }
150
151  template<typename _Tp>
152    constexpr int
153    __countr_zero(_Tp __x) noexcept
154    {
155      using __gnu_cxx::__int_traits;
156      constexpr auto _Nd = __int_traits<_Tp>::__digits;
157
158      if (__x == 0)
159        return _Nd;
160
161      constexpr auto _Nd_ull = __int_traits<unsigned long long>::__digits;
162      constexpr auto _Nd_ul = __int_traits<unsigned long>::__digits;
163      constexpr auto _Nd_u = __int_traits<unsigned>::__digits;
164
165      if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_u)
166	return __builtin_ctz(__x);
167      else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ul)
168	return __builtin_ctzl(__x);
169      else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ull)
170	return __builtin_ctzll(__x);
171      else // (_Nd > _Nd_ull)
172	{
173	  static_assert(_Nd <= (2 * _Nd_ull),
174			"Maximum supported integer size is 128-bit");
175
176	  constexpr auto __max_ull = __int_traits<unsigned long long>::__max;
177	  unsigned long long __low = __x & __max_ull;
178	  if (__low != 0)
179	    return __builtin_ctzll(__low);
180	  unsigned long long __high = __x >> _Nd_ull;
181	  return __builtin_ctzll(__high) + _Nd_ull;
182	}
183    }
184
185  template<typename _Tp>
186    constexpr int
187    __countr_one(_Tp __x) noexcept
188    {
189      return std::__countr_zero((_Tp)~__x);
190    }
191
192  template<typename _Tp>
193    constexpr int
194    __popcount(_Tp __x) noexcept
195    {
196      using __gnu_cxx::__int_traits;
197      constexpr auto _Nd = __int_traits<_Tp>::__digits;
198
199      constexpr auto _Nd_ull = __int_traits<unsigned long long>::__digits;
200      constexpr auto _Nd_ul = __int_traits<unsigned long>::__digits;
201      constexpr auto _Nd_u = __int_traits<unsigned>::__digits;
202
203      if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_u)
204	return __builtin_popcount(__x);
205      else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ul)
206	return __builtin_popcountl(__x);
207      else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ull)
208	return __builtin_popcountll(__x);
209      else // (_Nd > _Nd_ull)
210	{
211	  static_assert(_Nd <= (2 * _Nd_ull),
212			"Maximum supported integer size is 128-bit");
213
214	  constexpr auto __max_ull = __int_traits<unsigned long long>::__max;
215	  unsigned long long __low = __x & __max_ull;
216	  unsigned long long __high = __x >> _Nd_ull;
217	  return __builtin_popcountll(__low) + __builtin_popcountll(__high);
218	}
219    }
220
221  template<typename _Tp>
222    constexpr bool
223    __has_single_bit(_Tp __x) noexcept
224    { return std::__popcount(__x) == 1; }
225
226  template<typename _Tp>
227    constexpr _Tp
228    __bit_ceil(_Tp __x) noexcept
229    {
230      using __gnu_cxx::__int_traits;
231      constexpr auto _Nd = __int_traits<_Tp>::__digits;
232      if (__x == 0 || __x == 1)
233        return 1;
234      auto __shift_exponent = _Nd - std::__countl_zero((_Tp)(__x - 1u));
235      // If the shift exponent equals _Nd then the correct result is not
236      // representable as a value of _Tp, and so the result is undefined.
237      // Want that undefined behaviour to be detected in constant expressions,
238      // by UBSan, and by debug assertions.
239#ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
240      if (!__builtin_is_constant_evaluated())
241	{
242	  __glibcxx_assert( __shift_exponent != __int_traits<_Tp>::__digits );
243	}
244#endif
245      using __promoted_type = decltype(__x << 1);
246      if _GLIBCXX17_CONSTEXPR (!is_same<__promoted_type, _Tp>::value)
247	{
248	  // If __x undergoes integral promotion then shifting by _Nd is
249	  // not undefined. In order to make the shift undefined, so that
250	  // it is diagnosed in constant expressions and by UBsan, we also
251	  // need to "promote" the shift exponent to be too large for the
252	  // promoted type.
253	  const int __extra_exp = sizeof(__promoted_type) / sizeof(_Tp) / 2;
254	  __shift_exponent |= (__shift_exponent & _Nd) << __extra_exp;
255	}
256      return (_Tp)1u << __shift_exponent;
257    }
258
259  template<typename _Tp>
260    constexpr _Tp
261    __bit_floor(_Tp __x) noexcept
262    {
263      constexpr auto _Nd = __gnu_cxx::__int_traits<_Tp>::__digits;
264      if (__x == 0)
265        return 0;
266      return (_Tp)1u << (_Nd - std::__countl_zero((_Tp)(__x >> 1)));
267    }
268
269  template<typename _Tp>
270    constexpr _Tp
271    __bit_width(_Tp __x) noexcept
272    {
273      constexpr auto _Nd = __gnu_cxx::__int_traits<_Tp>::__digits;
274      return _Nd - std::__countl_zero(__x);
275    }
276
277  /// @endcond
278
279#if __cplusplus > 201703L
280
281#define __cpp_lib_bitops 201907L
282
283  /// @cond undoc
284  template<typename _Tp, typename _Up = _Tp>
285    using _If_is_unsigned_integer
286      = enable_if_t<__is_unsigned_integer<_Tp>::value, _Up>;
287  /// @endcond
288
289  // [bit.rot], rotating
290
291  /// Rotate `x` to the left by `s` bits.
292  template<typename _Tp>
293    [[nodiscard]] constexpr _If_is_unsigned_integer<_Tp>
294    rotl(_Tp __x, int __s) noexcept
295    { return std::__rotl(__x, __s); }
296
297  /// Rotate `x` to the right by `s` bits.
298  template<typename _Tp>
299    [[nodiscard]] constexpr _If_is_unsigned_integer<_Tp>
300    rotr(_Tp __x, int __s) noexcept
301    { return std::__rotr(__x, __s); }
302
303  // [bit.count], counting
304
305  /// The number of contiguous zero bits, starting from the highest bit.
306  template<typename _Tp>
307    constexpr _If_is_unsigned_integer<_Tp, int>
308    countl_zero(_Tp __x) noexcept
309    { return std::__countl_zero(__x); }
310
311  /// The number of contiguous one bits, starting from the highest bit.
312  template<typename _Tp>
313    constexpr _If_is_unsigned_integer<_Tp, int>
314    countl_one(_Tp __x) noexcept
315    { return std::__countl_one(__x); }
316
317  /// The number of contiguous zero bits, starting from the lowest bit.
318  template<typename _Tp>
319    constexpr _If_is_unsigned_integer<_Tp, int>
320    countr_zero(_Tp __x) noexcept
321    { return std::__countr_zero(__x); }
322
323  /// The number of contiguous one bits, starting from the lowest bit.
324  template<typename _Tp>
325    constexpr _If_is_unsigned_integer<_Tp, int>
326    countr_one(_Tp __x) noexcept
327    { return std::__countr_one(__x); }
328
329  /// The number of bits set in `x`.
330  template<typename _Tp>
331    constexpr _If_is_unsigned_integer<_Tp, int>
332    popcount(_Tp __x) noexcept
333    { return std::__popcount(__x); }
334
335  // [bit.pow.two], integral powers of 2
336
337#define __cpp_lib_int_pow2 202002L
338
339  /// True if `x` is a power of two, false otherwise.
340  template<typename _Tp>
341    constexpr _If_is_unsigned_integer<_Tp, bool>
342    has_single_bit(_Tp __x) noexcept
343    { return std::__has_single_bit(__x); }
344
345  /// The smallest power-of-two not less than `x`.
346  template<typename _Tp>
347    constexpr _If_is_unsigned_integer<_Tp>
348    bit_ceil(_Tp __x) noexcept
349    { return std::__bit_ceil(__x); }
350
351  /// The largest power-of-two not greater than `x`.
352  template<typename _Tp>
353    constexpr _If_is_unsigned_integer<_Tp>
354    bit_floor(_Tp __x) noexcept
355    { return std::__bit_floor(__x); }
356
357  /// The smallest integer greater than the base-2 logarithm of `x`.
358  template<typename _Tp>
359    constexpr _If_is_unsigned_integer<_Tp>
360    bit_width(_Tp __x) noexcept
361    { return std::__bit_width(__x); }
362
363#define __cpp_lib_endian 201907L
364
365  /// Byte order
366  enum class endian
367  {
368    little = __ORDER_LITTLE_ENDIAN__,
369    big    = __ORDER_BIG_ENDIAN__,
370    native = __BYTE_ORDER__
371  };
372#endif // C++2a
373
374  /// @}
375
376_GLIBCXX_END_NAMESPACE_VERSION
377} // namespace std
378
379#endif // C++14
380#endif // _GLIBCXX_BIT
381