NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
ipackage.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_INTERFACE_IPACKAGE_HPP__
2#define NEFORCE_CORE_INTERFACE_IPACKAGE_HPP__
3
11
15NEFORCE_BEGIN_NAMESPACE__
16
22
32template <typename T, typename PackageT>
33struct ipackage : icommon<T>, iarithmetic<T>, ibinary<T> {
34 static_assert(is_arithmetic_v<PackageT>, "PackageT must be arithmetic.");
35
36private:
41 constexpr const T& derived() const noexcept { return static_cast<const T&>(*this); }
42
47 constexpr T& derived() noexcept { return static_cast<T&>(*this); }
48
49public:
50 using package_type = PackageT;
51
52protected:
53 package_type value_{static_cast<package_type>(0)};
54
55public:
56 constexpr ipackage() noexcept = default;
57
58 constexpr ipackage(const ipackage& other) noexcept = default;
59 constexpr ipackage(ipackage&& other) noexcept = default;
60
61 constexpr ipackage& operator=(const ipackage& other) noexcept = default;
62 constexpr ipackage& operator=(ipackage&& other) noexcept = default;
63
70 explicit constexpr ipackage(package_type value) noexcept :
71 value_(value) {}
72
73protected:
79 NEFORCE_CONSTEXPR20 ~ipackage() = default;
80
81public:
86 NEFORCE_NODISCARD explicit constexpr operator package_type() const noexcept { return value_; }
87
92 NEFORCE_NODISCARD constexpr package_type value() const noexcept { return value_; }
93
98 NEFORCE_NODISCARD constexpr int64_t to_int64() const noexcept { return static_cast<int64_t>(value_); }
99
104 NEFORCE_NODISCARD static constexpr size_t bytes() noexcept { return sizeof(package_type); }
105
110 NEFORCE_NODISCARD static constexpr size_t bits() noexcept { return sizeof(package_type) * 8; }
111
116 NEFORCE_NODISCARD constexpr size_t to_hash() const noexcept { return _NEFORCE hash<package_type>()(value_); }
117
122 constexpr void swap(T& other) noexcept { _NEFORCE swap(value_, other.value_); }
123
129 NEFORCE_NODISCARD constexpr bool operator==(const T& other) const noexcept { return value_ == other.value_; }
130
136 NEFORCE_NODISCARD constexpr bool operator<(const T& other) const noexcept { return value_ < other.value_; }
137
143 constexpr T& operator+=(const T& other) noexcept {
144 value_ += other.value_;
145 return derived();
146 }
147
153 constexpr T& operator-=(const T& other) noexcept {
154 value_ -= other.value_;
155 return derived();
156 }
157
163 constexpr T& operator*=(const T& other) noexcept {
164 value_ *= other.value_;
165 return derived();
166 }
167
174 constexpr T& operator/=(const T& other) {
175 if (other.value_ == 0) {
176 NEFORCE_THROW_EXCEPTION(math_exception("Division by zero"));
177 }
178 value_ /= other.value_;
179 return derived();
180 }
181
188 constexpr T& operator%=(const T& other) {
189 value_ = _NEFORCE mod(value_, other.value_);
190 return derived();
191 }
192
197 NEFORCE_NODISCARD constexpr T operator-() const noexcept { return T(-value_); }
198
203 constexpr T& operator++() noexcept {
204 ++value_;
205 return derived();
206 }
207
212 constexpr T& operator--() noexcept {
213 --value_;
214 return derived();
215 }
216
221 constexpr T operator~() const noexcept { return T{~value_}; }
222
228 constexpr T& operator&=(const T& other) noexcept {
229 value_ &= other.value_;
230 return derived();
231 }
232
238 constexpr T& operator|=(const T& other) noexcept {
239 value_ |= other.value_;
240 return derived();
241 }
242
248 constexpr T& operator^=(const T& other) noexcept {
249 value_ ^= other.value_;
250 return derived();
251 }
252
259 constexpr T& operator<<=(const uint32_t shift) {
260 if (shift >= 64) {
261 NEFORCE_THROW_EXCEPTION(value_exception("Shift count out of range"));
262 }
263 value_ <<= shift;
264 return derived();
265 }
266
273 constexpr T& operator>>=(const uint32_t shift) {
274 if (shift >= 64) {
275 NEFORCE_THROW_EXCEPTION(value_exception("Shift count out of range"));
276 }
277 value_ >>= shift;
278 return derived();
279 }
280};
281 // CRTPInterfaces
283
284NEFORCE_END_NAMESPACE__
285#endif // NEFORCE_CORE_INTERFACE_IPACKAGE_HPP__
NEFORCE_INLINE17 constexpr bool is_arithmetic_v
is_arithmetic的便捷变量模板
unsigned int uint32_t
32位无符号整数类型
long long int64_t
64位有符号整数类型
NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 enable_if_t< is_floating_point_v< T >, T > mod(const T x, const T y)
浮点数取模运算
基本接口基类
数值操作接口
数学函数库
哈希函数的主模板
算术运算接口基类
位运算接口基类
通用接口,同时具备可比较和可哈希功能
基础数值包装接口
NEFORCE_NODISCARD constexpr bool operator==(const T &other) const noexcept
相等比较操作符
constexpr T & operator<<=(const uint32_t shift)
左移赋值操作符
constexpr T & operator*=(const T &other) noexcept
乘法赋值操作符
constexpr T & operator/=(const T &other)
除法赋值操作符
NEFORCE_NODISCARD constexpr bool operator<(const T &other) const noexcept
小于比较操作符
constexpr T & operator>>=(const uint32_t shift)
右移赋值操作符
constexpr T & operator&=(const T &other) noexcept
按位与赋值操作符
static NEFORCE_NODISCARD constexpr size_t bytes() noexcept
获取类型字节大小
constexpr T & operator^=(const T &other) noexcept
按位异或赋值操作符
constexpr T & operator-=(const T &other) noexcept
减法赋值操作符
NEFORCE_NODISCARD constexpr int64_t to_int64() const noexcept
转换为64位整数
constexpr T & operator|=(const T &other) noexcept
按位或赋值操作符
static NEFORCE_NODISCARD constexpr size_t bits() noexcept
获取类型位大小
constexpr T & operator%=(const T &other)
取模赋值操作符
constexpr T operator~() const noexcept
按位取反操作符
PackageT package_type
包装类型
NEFORCE_NODISCARD constexpr T operator-() const noexcept
一元负号操作符
constexpr T & operator++() noexcept
前置递增操作符
NEFORCE_NODISCARD constexpr package_type value() const noexcept
NEFORCE_NODISCARD constexpr size_t to_hash() const noexcept
计算哈希值
constexpr T & operator+=(const T &other) noexcept
加法赋值操作符
constexpr void swap(T &other) noexcept
交换内容
constexpr T & operator--() noexcept
前置递减操作符
NEFORCE_CONSTEXPR20 ~ipackage()=default
受保护的析构函数
数学计算异常
变量处理异常