MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
ipackage.hpp
1#ifndef MSTL_CORE_INTERFACE_IPACKAGE_HPP__
2#define MSTL_CORE_INTERFACE_IPACKAGE_HPP__
3#include "icommon.hpp"
4#include "inumeric.hpp"
6
7template <typename T, typename PackageT>
8struct ipackage : icommon<T>, iarithmetic<T>, ibinary<T> {
9 static_assert(is_arithmetic_v<PackageT>, "PackageT must be arithmetic.");
10
11private:
12 constexpr const T& derived() const noexcept {
13 return static_cast<const T&>(*this);
14 }
15 constexpr T& derived() noexcept {
16 return static_cast<T&>(*this);
17 }
18
19public:
20 using package_type = PackageT;
21
22protected:
23 package_type value_{_MSTL initialize<package_type>()};
24
25public:
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_) {
30 other.value_ = initialize<package_type>();
31 }
32 MSTL_CONSTEXPR20 ~ipackage() = default;
33
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_); }
37
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; }
40
41 MSTL_NODISCARD constexpr size_t to_hash() const noexcept {
42 return _MSTL hash<package_type>()(value_);
43 }
44
45 constexpr void swap(T& other) noexcept {
46 _MSTL swap(value_, other.value_);
47 }
48
49 MSTL_NODISCARD constexpr bool operator ==(const T& other) const noexcept {
50 return value_ == other.value_;
51 }
52 MSTL_NODISCARD constexpr bool operator <(const T& other) const noexcept {
53 return value_ < other.value_;
54 }
55
56 constexpr T& operator +=(const T& other) noexcept {
57 value_ += other.value_;
58 return derived();
59 }
60 constexpr T& operator -=(const T& other) noexcept {
61 value_ -= other.value_;
62 return derived();
63 }
64 constexpr T& operator *=(const T& other) noexcept {
65 value_ *= other.value_;
66 return derived();
67 }
68 constexpr T& operator /=(const T& other) {
69 if (other.value_ == 0) throw_exception(math_exception("Division by zero"));
70 value_ /= other;
71 return derived();
72 }
73 constexpr T& operator %=(const T& other) {
74 value_ = _MSTL float_mod(value_, other.value_);
75 return derived();
76 }
77
78 MSTL_NODISCARD constexpr T operator -() const noexcept {
79 return T(-value_);
80 }
81
82 constexpr T& operator ++() noexcept {
83 ++value_;
84 return derived();
85 }
86 constexpr T& operator --() noexcept {
87 --value_;
88 return derived();
89 }
90
91 constexpr T operator ~() const noexcept {
92 return T{~value_};
93 }
94
95 constexpr T& operator &=(const T& other) noexcept {
96 value_ &= other.value_;
97 return derived();
98 }
99 constexpr T& operator |=(const T& other) noexcept {
100 value_ |= other.value_;
101 return derived();
102 }
103 constexpr T& operator ^=(const T& other) noexcept {
104 value_ ^= other.value_;
105 return derived();
106 }
107
108 constexpr T& operator <<=(const uint32_t shift) {
109 if (shift >= 64) throw_exception(value_exception("Shift count out of range"));
110 value_ <<= shift;
111 return derived();
112 }
113 constexpr T& operator >>=(const uint32_t shift) {
114 if (shift >= 64) throw_exception(value_exception("Shift count out of range"));
115 value_ >>= shift;
116 return derived();
117 }
118};
119
121#endif // MSTL_CORE_INTERFACE_IPACKAGE_HPP__
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的默认初始化值
基本接口基类
MSTL数值操作接口
算术运算接口基类
位运算接口基类
通用接口,同时具备可比较和可哈希功能