1#ifndef MSTL_CORE_INTERFACE_IPACKAGE_HPP__
2#define MSTL_CORE_INTERFACE_IPACKAGE_HPP__
7template <
typename T,
typename PackageT>
9 static_assert(is_arithmetic_v<PackageT>,
"PackageT must be arithmetic.");
12 constexpr const T& derived() const noexcept {
13 return static_cast<const T&
>(*this);
15 constexpr T& derived() noexcept {
16 return static_cast<T&
>(*this);
20 using package_type = PackageT;
26 constexpr ipackage() noexcept = default;
27 constexpr ipackage(package_type val) noexcept : value_(val) {}
28 constexpr ipackage(
const ipackage& other) noexcept : value_(other.value_) {}
29 constexpr ipackage(ipackage&& other) noexcept : value_(other.value_) {
32 MSTL_CONSTEXPR20 ~ipackage() =
default;
34 MSTL_NODISCARD
constexpr operator package_type() const noexcept {
return value_; }
35 MSTL_NODISCARD
constexpr package_type value() const noexcept {
return value_; }
36 MSTL_NODISCARD
constexpr int64_t to_int64() const noexcept {
return static_cast<int64_t>(value_); }
38 MSTL_NODISCARD
static constexpr size_t bytes() noexcept {
return sizeof(package_type); }
39 MSTL_NODISCARD
static constexpr size_t bits() noexcept {
return sizeof(package_type) * 8; }
41 MSTL_NODISCARD
constexpr size_t to_hash() const noexcept {
42 return _MSTL hash<package_type>()(value_);
45 constexpr void swap(T& other)
noexcept {
49 MSTL_NODISCARD
constexpr bool operator ==(
const T& other)
const noexcept {
50 return value_ == other.value_;
52 MSTL_NODISCARD
constexpr bool operator <(
const T& other)
const noexcept {
53 return value_ < other.value_;
56 constexpr T& operator +=(
const T& other)
noexcept {
57 value_ += other.value_;
60 constexpr T& operator -=(
const T& other)
noexcept {
61 value_ -= other.value_;
64 constexpr T& operator *=(
const T& other)
noexcept {
65 value_ *= other.value_;
68 constexpr T& operator /=(
const T& other) {
69 if (other.value_ == 0) throw_exception(math_exception(
"Division by zero"));
73 constexpr T& operator %=(
const T& other) {
78 MSTL_NODISCARD
constexpr T
operator -() const noexcept {
82 constexpr T& operator ++() noexcept {
86 constexpr T& operator --() noexcept {
91 constexpr T operator ~() const noexcept {
95 constexpr T& operator &=(
const T& other)
noexcept {
96 value_ &= other.value_;
99 constexpr T& operator |=(
const T& other)
noexcept {
100 value_ |= other.value_;
103 constexpr T& operator ^=(
const T& other)
noexcept {
104 value_ ^= other.value_;
108 constexpr T& operator <<=(
const uint32_t shift) {
109 if (shift >= 64) throw_exception(value_exception(
"Shift count out of range"));
113 constexpr T& operator >>=(
const uint32_t shift) {
114 if (shift >= 64) throw_exception(value_exception(
"Shift count out of range"));
unsigned int uint32_t
32位无符号整数类型
long long int64_t
64位有符号整数类型
bool operator==(const function< Res(Args...)> &f, nullptr_t null) noexcept
等于空指针比较
MSTL_CONST_FUNCTION MSTL_CONSTEXPR14 T float_mod(const T x, const T y)
浮点数取模运算
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
MSTL_NODISCARD constexpr auto operator-(const normal_iterator< LeftIter > &lhs, const normal_iterator< RightIter > &rhs) noexcept -> decltype(lhs.base() - rhs.base())
减法运算符
MSTL_NODISCARD constexpr bool operator<(const normal_iterator< LeftIter > &lhs, const normal_iterator< RightIter > &rhs) noexcept
小于比较运算符
void swap()=delete
删除无参数的swap重载
constexpr T initialize() noexcept(is_nothrow_default_constructible< T >::value)
返回类型T的默认初始化值