Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/libc/src/__support/CPP/cstddef.h
213799 views
1
//===-- A self contained equivalent of cstddef ------------------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
9
#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_CSTDDEF_H
10
#define LLVM_LIBC_SRC___SUPPORT_CPP_CSTDDEF_H
11
12
#include "src/__support/macros/attributes.h"
13
#include "src/__support/macros/config.h"
14
#include "type_traits.h" // For enable_if_t, is_integral_v.
15
16
namespace LIBC_NAMESPACE_DECL {
17
namespace cpp {
18
19
enum class byte : unsigned char {};
20
21
template <class IntegerType>
22
LIBC_INLINE constexpr enable_if_t<is_integral_v<IntegerType>, byte>
23
operator>>(byte b, IntegerType shift) noexcept {
24
return static_cast<byte>(static_cast<unsigned char>(b) >> shift);
25
}
26
template <class IntegerType>
27
LIBC_INLINE constexpr enable_if_t<is_integral_v<IntegerType>, byte &>
28
operator>>=(byte &b, IntegerType shift) noexcept {
29
return b = b >> shift;
30
}
31
template <class IntegerType>
32
LIBC_INLINE constexpr enable_if_t<is_integral_v<IntegerType>, byte>
33
operator<<(byte b, IntegerType shift) noexcept {
34
return static_cast<byte>(static_cast<unsigned char>(b) << shift);
35
}
36
template <class IntegerType>
37
LIBC_INLINE constexpr enable_if_t<is_integral_v<IntegerType>, byte &>
38
operator<<=(byte &b, IntegerType shift) noexcept {
39
return b = b << shift;
40
}
41
LIBC_INLINE constexpr byte operator|(byte l, byte r) noexcept {
42
return static_cast<byte>(static_cast<unsigned char>(l) |
43
static_cast<unsigned char>(r));
44
}
45
LIBC_INLINE constexpr byte &operator|=(byte &l, byte r) noexcept {
46
return l = l | r;
47
}
48
LIBC_INLINE constexpr byte operator&(byte l, byte r) noexcept {
49
return static_cast<byte>(static_cast<unsigned char>(l) &
50
static_cast<unsigned char>(r));
51
}
52
LIBC_INLINE constexpr byte &operator&=(byte &l, byte r) noexcept {
53
return l = l & r;
54
}
55
LIBC_INLINE constexpr byte operator^(byte l, byte r) noexcept {
56
return static_cast<byte>(static_cast<unsigned char>(l) ^
57
static_cast<unsigned char>(r));
58
}
59
LIBC_INLINE constexpr byte &operator^=(byte &l, byte r) noexcept {
60
return l = l ^ r;
61
}
62
LIBC_INLINE constexpr byte operator~(byte b) noexcept {
63
return static_cast<byte>(~static_cast<unsigned char>(b));
64
}
65
template <typename IntegerType>
66
LIBC_INLINE constexpr enable_if_t<is_integral_v<IntegerType>, IntegerType>
67
to_integer(byte b) noexcept {
68
return static_cast<IntegerType>(b);
69
}
70
71
} // namespace cpp
72
} // namespace LIBC_NAMESPACE_DECL
73
74
#endif // LLVM_LIBC_SRC___SUPPORT_CPP_CSTDDEF_H
75
76