1#ifndef NEFORCE_CORE_UTILITY_HEXADECIMAL_HPP__
2#define NEFORCE_CORE_UTILITY_HEXADECIMAL_HPP__
14NEFORCE_BEGIN_NAMESPACE__
43 if (c >=
'0' && c <=
'9') {
46 if (c >=
'a' && c <=
'f') {
47 return 10 + (c -
'a');
49 if (c >=
'A' && c <=
'F') {
50 return 10 + (c -
'A');
52 return invalid_xdigit;
55 static NEFORCE_CONSTEXPR20
pair<bool, byte_t> xdigit_value(
const char high,
const char low)
noexcept {
56 const byte_t xhigh = xdigit_value(high);
57 const byte_t xlow = xdigit_value(low);
58 if (xhigh == invalid_xdigit || xlow == invalid_xdigit) {
59 return {
false, invalid_xdigit};
61 return pair<bool, byte_t>{
true, high << 4 | low};
74 static NEFORCE_CONSTEXPR20 value_type parse_view(
const string_view view) {
79 bool negative =
false;
85 if (start == view.
size()) {
89 if (view[start] ==
'-') {
92 }
else if (view[start] ==
'+') {
96 if (start + 1 < view.
size() && view[start] ==
'0' && (view[start + 1] ==
'x' || view[start + 1] ==
'X')) {
101 while (start < view.
size()) {
102 const char c = view[start++];
104 const int digit = xdigit_value(c);
106 NEFORCE_THROW_EXCEPTION(value_exception(
"Hexadecimal value too large"));
108 result = (result << 4) | static_cast<uint64_t>(digit);
110 NEFORCE_THROW_EXCEPTION(value_exception(
"Invalid hexadecimal character"));
116 NEFORCE_THROW_EXCEPTION(value_exception(
"Hexadecimal value out of range"));
118 return -
static_cast<int64_t>(result);
121 NEFORCE_THROW_EXCEPTION(value_exception(
"Hexadecimal value out of range"));
123 return static_cast<value_type
>(result);
168 base(parse_view(view)) {}
195 explicit constexpr
hexadecimal(const value_type value) noexcept :
198 constexpr hexadecimal& operator=(
const value_type value)
noexcept {
207 NEFORCE_NODISCARD
explicit constexpr operator bool() const noexcept {
return value_ !=
static_cast<value_type>(0); }
215 NEFORCE_NODISCARD
constexpr bool get_bit(
const size_t position)
const {
216 if (position >= 64) {
219 return (
value_ >> position) & 1;
230 if (position >= 64) {
234 value_ |= (1ULL << position);
236 value_ &= ~(1ULL << position);
248 if (position >= 64) {
251 value_ ^= (1ULL << position);
259 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
string to_string()
const;
283NEFORCE_BEGIN_LITERALS__
297NEFORCE_CONSTEXPR20
hexadecimal operator""_hex(
const char* str,
const size_t len) {
306constexpr hexadecimal operator""_hex(
const unsigned long long value) {
312NEFORCE_END_LITERALS__
314NEFORCE_END_NAMESPACE__
NEFORCE_NODISCARD constexpr size_type size() const noexcept
获取字符串长度
NEFORCE_NODISCARD constexpr bool empty() const noexcept
检查是否为空
static NEFORCE_NODISCARD constexpr T max() noexcept
获取类型的最大值
NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 bool is_xdigit(const CharT c) noexcept
检查字符是否为十六进制数字
NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_space(const CharT c) noexcept
检查字符是否为空白字符
unsigned char byte_t
字节类型,定义为无符号字符
unsigned int uint32_t
32位无符号整数类型
long long int64_t
64位有符号整数类型
unsigned short uint16_t
16位无符号整数类型
unsigned long long uint64_t
64位无符号整数类型
basic_string_view< char > string_view
字符字符串视图
constexpr hexadecimal(const int32_t value) noexcept
从32位有符号整数构造
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string to_string() const
转换为字符串
constexpr hexadecimal(const uint16_t value) noexcept
从16位无符号整数构造
NEFORCE_CONSTEXPR20 hexadecimal(const char *str)
从C风格字符串构造
constexpr hexadecimal & set_bit(const size_t position, const bool bit_value_=true)
设置指定位的值
constexpr hexadecimal(const uint32_t value) noexcept
从32位无符号整数构造
constexpr hexadecimal(const int16_t value) noexcept
从16位有符号整数构造
constexpr hexadecimal & flip_bit(const size_t position)
翻转指定位
NEFORCE_CONSTEXPR20 hexadecimal(const string &str)
从字符串对象构造
constexpr hexadecimal(const uint64_t value) noexcept
从64位无符号整数构造
static constexpr byte_t xdigit_value(const char c) noexcept
将十六进制字符转换为对应的数值
NEFORCE_CONSTEXPR20 hexadecimal(const string_view view)
从字符串视图构造
NEFORCE_NODISCARD constexpr bool get_bit(const size_t position) const
获取指定位的值
static NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 hexadecimal parse(const string_view str)
从字符串解析十六进制值
NEFORCE_NODISCARD constexpr package_type value() const noexcept