1#ifndef NEFORCE_CORE_NUMERIC_INT128_HPP__
2#define NEFORCE_CORE_NUMERIC_INT128_HPP__
25NEFORCE_BEGIN_NAMESPACE__
45 NEFORCE_CONSTEXPR20 ~
uint128_t() = default;
51 constexpr uint128_t(const
int32_t low) noexcept :
66 constexpr uint128_t(
const unsigned long low) noexcept :
73 constexpr uint128_t(
const unsigned long long low) noexcept :
96 explicit NEFORCE_CONSTEXPR20 uint128_t(const
string& str,
int base = 10) :
97 uint128_t(str.view(), base) {}
113 explicit constexpr operator
bool() const noexcept {
return lo != 0U || hi != 0U; }
114 explicit constexpr operator char() const noexcept {
return static_cast<char>(lo); }
115 explicit constexpr operator int8_t() const noexcept {
return static_cast<int8_t>(lo); }
116 explicit constexpr operator uint8_t() const noexcept {
return static_cast<uint32_t>(lo); }
117 explicit constexpr operator uint16_t() const noexcept {
return static_cast<uint32_t>(lo); }
118 explicit constexpr operator uint32_t() const noexcept {
return static_cast<uint32_t>(lo); }
119 explicit constexpr operator uint64_t() const noexcept {
return lo; }
120 explicit constexpr operator int128_t() const noexcept;
125 NEFORCE_NODISCARD constexpr
bool equal_to(const uint128_t& rhs) const noexcept {
126 return hi == rhs.hi &&
lo == rhs.lo;
132 NEFORCE_NODISCARD
constexpr bool less_than(
const uint128_t& rhs)
const noexcept {
133 return hi < rhs.hi || (
hi == rhs.hi &&
lo < rhs.lo);
143 return {new_hi, new_lo};
197 constexpr uint128_t&
operator&=(
const uint128_t& other)
noexcept {
206 constexpr uint128_t&
operator|=(
const uint128_t& other)
noexcept {
215 constexpr uint128_t&
operator^=(
const uint128_t& other)
noexcept {
235 hi =
lo << (shift - 64);
239 hi = (
hi << shift) | (
lo >> (64 - shift));
258 lo =
hi >> (shift - 64);
262 lo = (
lo >> shift) | (
hi << (64 - shift));
286 NEFORCE_NODISCARD
constexpr size_t to_hash() const noexcept {
287 constexpr uint64_t GOLDEN = 0x9E3779B97F4A7C15ULL;
305 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
string to_string()
const;
310 static constexpr uint128_t
min() noexcept {
return {
static_cast<uint64_t>(0),
static_cast<uint64_t>(0)}; }
315 static constexpr uint128_t
max() noexcept {
return {~static_cast<uint64_t>(0), ~static_cast<uint64_t>(0)}; }
327 constexpr int128_t() noexcept = default;
328 NEFORCE_CONSTEXPR20 ~
int128_t() = default;
333 constexpr int128_t(const
long value) noexcept :
340 int128_t(
static_cast<long long>(value)) {}
345 constexpr int128_t(
const long long value) noexcept :
347 hi(value < 0 ? ~
static_cast<uint64_t>(0) : 0) {}
356 hi(negative ? ~static_cast<
uint64_t>(0) : 0) {}
375 constexpr int128_t& operator=(const
uint128_t& other) noexcept {
387 explicit NEFORCE_CONSTEXPR20
int128_t(
const string& str,
int base = 10) :
388 int128_t(str.view(), base) {}
403 explicit constexpr operator bool() const noexcept {
return (lo != 0U) || (hi != 0U); }
404 explicit constexpr operator char() const noexcept {
return static_cast<char>(lo); }
405 explicit constexpr operator int8_t() const noexcept {
return static_cast<int8_t>(lo); }
406 explicit constexpr operator int16_t() const noexcept {
return static_cast<int16_t>(lo); }
407 explicit constexpr operator int32_t() const noexcept {
return static_cast<int32_t>(lo); }
408 explicit constexpr operator int64_t() const noexcept {
return static_cast<int64_t>(lo); }
409 explicit constexpr operator uint8_t() const noexcept {
return static_cast<uint8_t>(lo); }
410 explicit constexpr operator uint16_t() const noexcept {
return static_cast<uint16_t>(lo); }
411 explicit constexpr operator uint32_t() const noexcept {
return static_cast<uint32_t>(lo); }
412 explicit constexpr operator uint64_t() const noexcept {
return lo; }
413 explicit constexpr operator uint128_t() const noexcept {
return to_uint128(); }
423 NEFORCE_NODISCARD
constexpr bool equal_to(
const int128_t& rhs)
const noexcept {
424 return hi == rhs.hi &&
lo == rhs.lo;
430 NEFORCE_NODISCARD
constexpr bool less_than(
const int128_t& rhs)
const noexcept {
432 const bool b_neg = rhs.is_negative();
433 if (a_neg != b_neg) {
436 return hi < rhs.hi || (
hi == rhs.hi &&
lo < rhs.lo);
445 return {new_hi, new_lo};
499 constexpr int128_t&
operator&=(
const int128_t& other)
noexcept {
508 constexpr int128_t&
operator|=(
const int128_t& other)
noexcept {
517 constexpr int128_t&
operator^=(
const int128_t& other)
noexcept {
540 *
this = neg ? int128_t(~
static_cast<uint64_t>(0), ~
static_cast<uint64_t>(0)) : int128_t(0);
545 hi = neg ? ~0ULL : 0ULL;
547 lo = (
lo >> shift) | (
hi << (64 - shift));
556 NEFORCE_NODISCARD
constexpr size_t to_hash() const noexcept {
557 constexpr uint64_t GOLDEN = 0x9E3779B97F4A7C15ULL;
575 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
string to_string()
const;
580 static constexpr int128_t
min() noexcept {
581 return {
static_cast<uint64_t>(0x8000000000000000ULL),
static_cast<uint64_t>(0ULL)};
587 static constexpr int128_t
max() noexcept {
return {0x7FFFFFFFFFFFFFFFULL, ~static_cast<uint64_t>(0)}; }
594 using type = int128_t;
599 using type = uint128_t;
602#define __NEFORCE_DEFINE_MAKE_SIGN(CV) \
604 struct make_signed<uint128_t CV> { \
605 using type = int128_t; \
608 struct make_unsigned<int128_t CV> { \
609 using type = uint128_t; \
612#undef __NEFORCE_DEFINE_MAKE_SIGN
621NEFORCE_CONSTEXPR20
string uint128_t::to_string()
const {
return inner::__int_to_string_dispatch<uint128_t>(*
this); }
624 const uint64_t new_lo = lhs.lo - rhs.lo;
625 const uint64_t new_hi = lhs.hi - rhs.hi -
static_cast<uint64_t>(lhs.lo < rhs.lo);
626 return {new_hi, new_lo};
636NEFORCE_CONSTEXPR20
string int128_t::to_string()
const {
return inner::__int_to_string_dispatch<int128_t>(*
this); }
646constexpr uint128_t::operator
int128_t() const noexcept {
return {hi, lo}; }
649NEFORCE_BEGIN_LITERALS__
662constexpr uint128_t operator""_u128(
const unsigned long long val)
noexcept {
return {
static_cast<uint64_t>(val)}; }
669constexpr int128_t operator""_i128(
const unsigned long long val)
noexcept {
return {
static_cast<uint64_t>(val)}; }
691NEFORCE_END_LITERALS__
704 static constexpr bool is_specialized =
true;
705 static constexpr bool is_signed =
false;
706 static constexpr bool is_integer =
true;
707 static constexpr bool is_exact =
true;
708 static constexpr bool has_infinity =
false;
709 static constexpr bool has_quiet_NaN =
false;
710 static constexpr bool has_signaling_NaN =
false;
712 static constexpr bool has_denorm_loss =
false;
714 static constexpr bool is_iec559 =
false;
715 static constexpr bool is_bounded =
true;
716 static constexpr bool is_modulo =
true;
717 static constexpr int digits = 128;
718 static constexpr int digits10 = 38;
719 static constexpr int max_digits10 = 0;
720 static constexpr int radix = 2;
721 static constexpr int min_exponent = 0;
722 static constexpr int min_exponent10 = 0;
723 static constexpr int max_exponent = 0;
724 static constexpr int max_exponent10 = 0;
725 static constexpr bool traps =
true;
726 static constexpr bool tinyness_before =
false;
733 static constexpr uint128_t quiet_NaN()
noexcept {
return 0; }
734 static constexpr uint128_t signaling_NaN()
noexcept {
return 0; }
744 static constexpr bool is_specialized =
true;
745 static constexpr bool is_signed =
true;
746 static constexpr bool is_integer =
true;
747 static constexpr bool is_exact =
true;
748 static constexpr bool has_infinity =
false;
749 static constexpr bool has_quiet_NaN =
false;
750 static constexpr bool has_signaling_NaN =
false;
752 static constexpr bool has_denorm_loss =
false;
754 static constexpr bool is_iec559 =
false;
755 static constexpr bool is_bounded =
true;
756 static constexpr bool is_modulo =
false;
757 static constexpr int digits = 127;
758 static constexpr int digits10 = 38;
759 static constexpr int max_digits10 = 0;
760 static constexpr int radix = 2;
761 static constexpr int min_exponent = 0;
762 static constexpr int min_exponent10 = 0;
763 static constexpr int max_exponent = 0;
764 static constexpr int max_exponent10 = 0;
765 static constexpr bool traps =
true;
766 static constexpr bool tinyness_before =
false;
773 static constexpr int128_t quiet_NaN()
noexcept {
return 0; }
774 static constexpr int128_t signaling_NaN()
noexcept {
return 0; }
794 char* endptr =
nullptr;
795 const uint128_t num = inner::str_to_uints<uint128_t>(sv, &endptr, base);
796 if (sv.
data() == endptr) {
799 if (idx !=
nullptr) {
800 *idx =
static_cast<size_t>(endptr - sv.
data());
814 char* endptr =
nullptr;
815 const int128_t num = inner::str_to_ints<int128_t>(sv, &endptr, base);
816 if (sv.
data() == endptr) {
819 if (idx !=
nullptr) {
820 *idx =
static_cast<size_t>(endptr - sv.
data());
831NEFORCE_END_NAMESPACE__
constexpr const_pointer data() const noexcept
获取底层数据指针
static constexpr T denorm_min() noexcept
获取最小的次正规化正值
static constexpr T lowest() noexcept
获取类型的最低值
static constexpr T round_error() noexcept
获取最大舍入误差
static constexpr T infinity() noexcept
获取正无穷大表示
static constexpr T max() noexcept
获取类型的最大值
static constexpr T epsilon() noexcept
获取机器精度
static constexpr T min() noexcept
获取类型的最小值
unsigned char uint8_t
8位无符号整数类型
unsigned int uint32_t
32位无符号整数类型
long long int64_t
64位有符号整数类型
unsigned short uint16_t
16位无符号整数类型
unsigned long long uint64_t
64位无符号整数类型
signed char int8_t
8位有符号整数类型
constexpr decimal_t remainder(const decimal_t x, const decimal_t y) noexcept
计算余数
constexpr auto operator-(const normal_iterator< LeftIter > &lhs, const normal_iterator< RightIter > &rhs) noexcept -> decltype(lhs.base() - rhs.base())
减法运算符
constexpr bool is_negative(const T x) noexcept
检查浮点数是否为负数
typename make_integer< Size, IsSigned >::type make_integer_t
make_integer的便捷别名
constexpr uint128_t to_uint128(const string_view sv, size_t *idx=nullptr, const int base=10)
将字符串转换为128位无符号整数
constexpr int128_t to_int128(const string_view sv, size_t *idx=nullptr, const int base=10)
将字符串转换为128位有符号整数
basic_string_view< char > string_view
字符字符串视图
#define NEFORCE_MACRO_RANGES_CV_REF(MAC)
cv和引用限定符列表宏
bool_constant< true > true_type
表示true的类型
constexpr string to_string(const CharT &c)
将字符转换为普通字符串
int128_t & operator*=(const int128_t &other) noexcept
乘法赋值
int128_t & operator%=(const int128_t &other)
取模赋值
constexpr string to_string() const
转换为字符串
constexpr int128_t & operator|=(const int128_t &other) noexcept
按位或赋值
constexpr uint128_t to_uint128() const noexcept
转换为无符号128位整数
constexpr int128_t(const int32_t value) noexcept
从32位有符号整数构造
constexpr bool is_negative() const noexcept
检查是否为负数
int128_t & operator--() noexcept
前置自减
constexpr int128_t & operator&=(const int128_t &other) noexcept
按位与赋值
int128_t & operator++() noexcept
前置自增
constexpr int128_t & operator^=(const int128_t &other) noexcept
按位异或赋值
constexpr bool equal_to(const int128_t &rhs) const noexcept
相等比较
constexpr int128_t(const uint64_t low, const bool negative=false) noexcept
从低64位和符号构造
constexpr int128_t operator-() const noexcept
负号
int128_t & operator-=(const int128_t &other) noexcept
减法赋值
constexpr size_t to_hash() const noexcept
计算哈希值
int128_t & operator+=(const int128_t &other) noexcept
加法赋值
constexpr int128_t(const string &str, int base=10)
从字符串构造
constexpr bool less_than(const int128_t &rhs) const noexcept
小于比较(考虑符号)
int128_t & operator/=(const int128_t &other)
除法赋值
static constexpr int128_t parse(const string_view view)
从字符串解析
constexpr int128_t & operator<<=(const uint32_t shift) noexcept
左移赋值
static constexpr int128_t min() noexcept
获取最小值
constexpr int128_t(const uint64_t high, const uint64_t low) noexcept
从高低64位构造
constexpr int128_t(const long long value) noexcept
从 long long 构造
static constexpr int128_t max() noexcept
获取最大值
constexpr int128_t operator~() const noexcept
按位取反
constexpr int128_t & operator>>=(const uint32_t shift) noexcept
右移赋值(算术右移)
static constexpr uint128_t max() noexcept
获取最大值
constexpr uint128_t operator-() const noexcept
取负
uint128_t & operator/=(const uint128_t &other)
除法赋值
uint128_t & operator--() noexcept
前置自减
uint128_t & operator++() noexcept
前置自增
constexpr uint128_t(const unsigned long low) noexcept
从无符号 long 构造
uint128_t & operator*=(const uint128_t &other) noexcept
乘法赋值
constexpr bool equal_to(const uint128_t &rhs) const noexcept
相等比较
constexpr uint128_t(const unsigned long long low) noexcept
从无符号 long long 构造
constexpr uint128_t & operator|=(const uint128_t &other) noexcept
按位或赋值
constexpr int128_t to_int128() const noexcept
转换为有符号128位整数
constexpr uint128_t & operator^=(const uint128_t &other) noexcept
按位异或赋值
constexpr uint128_t & operator&=(const uint128_t &other) noexcept
按位与赋值
uint128_t & operator-=(const uint128_t &other) noexcept
减法赋值
uint128_t & operator+=(const uint128_t &other) noexcept
加法赋值
uint64_t div64(uint64_t divisor, uint64_t *remainder=nullptr) const
64位除法
constexpr size_t to_hash() const noexcept
计算哈希值
uint128_t & operator%=(const uint128_t &other)
取模赋值
constexpr string to_string() const
转换为字符串
constexpr uint128_t operator~() const noexcept
按位取反
static uint128_t mul64(uint64_t a, uint64_t b) noexcept
64位乘法
constexpr uint128_t & operator<<=(const uint32_t shift) noexcept
左移赋值
constexpr bool less_than(const uint128_t &rhs) const noexcept
小于比较
static constexpr uint128_t parse(const string_view view)
从字符串解析
constexpr uint128_t & operator>>=(const uint32_t shift) noexcept
右移赋值
constexpr uint128_t(const uint32_t low) noexcept
从32位无符号整数构造
constexpr uint128_t(const uint64_t high, const uint64_t low) noexcept
从高低64位构造
static constexpr uint128_t min() noexcept
获取最小值