1 | // -*- C++ -*- |
2 | //===----------------------------------------------------------------------===// |
3 | // |
4 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
5 | // See https://llvm.org/LICENSE.txt for license information. |
6 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
7 | // |
8 | //===---------------------------------------------------------------------===// |
9 | |
10 | #ifndef _LIBCPP_BIT |
11 | #define _LIBCPP_BIT |
12 | |
13 | /* |
14 | bit synopsis |
15 | |
16 | namespace std { |
17 | // [bit.cast], bit_cast |
18 | template<class To, class From> |
19 | constexpr To bit_cast(const From& from) noexcept; // C++20 |
20 | |
21 | // [bit.byteswap], byteswap |
22 | template<class T> |
23 | constexpr T byteswap(T value) noexcept; // C++23 |
24 | |
25 | // [bit.pow.two], integral powers of 2 |
26 | template <class T> |
27 | constexpr bool has_single_bit(T x) noexcept; // C++20 |
28 | template <class T> |
29 | constexpr T bit_ceil(T x); // C++20 |
30 | template <class T> |
31 | constexpr T bit_floor(T x) noexcept; // C++20 |
32 | template <class T> |
33 | constexpr int bit_width(T x) noexcept; // C++20 |
34 | |
35 | // [bit.rotate], rotating |
36 | template<class T> |
37 | constexpr T rotl(T x, int s) noexcept; // C++20 |
38 | template<class T> |
39 | constexpr T rotr(T x, int s) noexcept; // C++20 |
40 | |
41 | // [bit.count], counting |
42 | template<class T> |
43 | constexpr int countl_zero(T x) noexcept; // C++20 |
44 | template<class T> |
45 | constexpr int countl_one(T x) noexcept; // C++20 |
46 | template<class T> |
47 | constexpr int countr_zero(T x) noexcept; // C++20 |
48 | template<class T> |
49 | constexpr int countr_one(T x) noexcept; // C++20 |
50 | template<class T> |
51 | constexpr int popcount(T x) noexcept; // C++20 |
52 | |
53 | // [bit.endian], endian |
54 | enum class endian { |
55 | little = see below, // C++20 |
56 | big = see below, // C++20 |
57 | native = see below // C++20 |
58 | }; |
59 | |
60 | } // namespace std |
61 | |
62 | */ |
63 | |
64 | #include <__config> |
65 | |
66 | #if _LIBCPP_STD_VER >= 20 |
67 | # include <__bit/bit_cast.h> |
68 | # include <__bit/bit_ceil.h> |
69 | # include <__bit/bit_floor.h> |
70 | # include <__bit/bit_log2.h> |
71 | # include <__bit/bit_width.h> |
72 | # include <__bit/countl.h> |
73 | # include <__bit/countr.h> |
74 | # include <__bit/endian.h> |
75 | # include <__bit/has_single_bit.h> |
76 | # include <__bit/popcount.h> |
77 | # include <__bit/rotate.h> |
78 | #endif |
79 | |
80 | #if _LIBCPP_STD_VER >= 23 |
81 | # include <__bit/byteswap.h> |
82 | #endif |
83 | |
84 | #include <version> |
85 | |
86 | #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
87 | # pragma GCC system_header |
88 | #endif |
89 | |
90 | #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17 |
91 | # include <cstdint> |
92 | #endif |
93 | |
94 | #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 |
95 | # include <cstdlib> |
96 | # include <iosfwd> |
97 | # include <limits> |
98 | # include <type_traits> |
99 | #endif |
100 | |
101 | #endif // _LIBCPP_BIT |
102 | |