NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
byte_size.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_UTILITY_BYTE_SIZE_HPP__
2#define NEFORCE_CORE_UTILITY_BYTE_SIZE_HPP__
3
11
15NEFORCE_BEGIN_NAMESPACE__
16
104
145class NEFORCE_API byte_size : public iobject<byte_size>, public icommon<byte_size> {
146public:
151 enum class unit {
152 AUTO,
153 B,
154 KB,
155 MB,
156 GB,
157 TB,
158 PB,
159 EB
160 };
161
162private:
163 uint64_t bytes_{0};
164
165public:
171 constexpr byte_size() = default;
172
177 constexpr explicit byte_size(uint64_t bytes) :
178 bytes_(bytes) {}
179
187 byte_size(decimal_t value, unit u, bool binary = true);
188
198 NEFORCE_NODISCARD static byte_size parse(string_view str) { return parse(str, true); }
199
207 NEFORCE_NODISCARD static byte_size parse(string_view str, bool binary);
208
213 NEFORCE_NODISCARD constexpr uint64_t bytes() const { return bytes_; }
214
222 NEFORCE_NODISCARD decimal_t as(unit u, bool binary = true) const;
223
228 NEFORCE_NODISCARD string to_string() const { return to_string(unit::AUTO, 2, true); }
229
237 NEFORCE_NODISCARD string to_string(unit u, int precision = 2, bool binary = true) const;
238
243 NEFORCE_NODISCARD constexpr bool is_zero() const noexcept { return bytes_ == 0; }
244
245 byte_size& operator+=(const byte_size& rhs) {
246 bytes_ += rhs.bytes_;
247 return *this;
248 }
249
250 byte_size& operator-=(const byte_size& rhs) {
251 if (bytes_ < rhs.bytes_) {
252 NEFORCE_THROW_EXCEPTION(value_exception("Memory size subtraction underflow"));
253 }
254 bytes_ -= rhs.bytes_;
255 return *this;
256 }
257
258 byte_size& operator*=(uint64_t factor) {
259 bytes_ *= factor;
260 return *this;
261 }
262
263 byte_size& operator/=(uint64_t divisor) {
264 if (divisor == 0) {
265 NEFORCE_THROW_EXCEPTION(value_exception("Division by zero"));
266 }
267 bytes_ /= divisor;
268 return *this;
269 }
270
271 NEFORCE_NODISCARD constexpr byte_size operator+(const byte_size& rhs) const noexcept {
272 return byte_size(bytes_ + rhs.bytes_);
273 }
274
275 NEFORCE_NODISCARD byte_size operator-(const byte_size& rhs) const {
276 if (bytes_ < rhs.bytes_) {
277 NEFORCE_THROW_EXCEPTION(value_exception("Memory size subtraction underflow"));
278 }
279 return byte_size(bytes_ - rhs.bytes_);
280 }
281
282 NEFORCE_NODISCARD byte_size operator*(uint64_t factor) const {
283 if (factor > 0 && bytes_ > numeric_traits<uint64_t>::max() / factor) {
284 NEFORCE_THROW_EXCEPTION(value_exception("Memory size multiplication overflow"));
285 }
286 return byte_size(bytes_ * factor);
287 }
288
289 NEFORCE_NODISCARD byte_size operator/(uint64_t divisor) const {
290 if (divisor == 0) {
291 NEFORCE_THROW_EXCEPTION(value_exception("Division by zero"));
292 }
293 return byte_size(bytes_ / divisor);
294 }
295
296 NEFORCE_NODISCARD friend byte_size operator*(uint64_t factor, const byte_size& size) { return size * factor; }
297
298 NEFORCE_NODISCARD bool operator==(const byte_size& rhs) const { return bytes_ == rhs.bytes_; }
299 NEFORCE_NODISCARD bool operator<(const byte_size& rhs) const { return bytes_ < rhs.bytes_; }
300
305 NEFORCE_NODISCARD size_t to_hash() const noexcept { return hash<uint64_t>()(bytes_); }
306};
307
308template <>
309struct unpackage<byte_size> {
310 using type = uint64_t;
311};
312 // ByteSize
314
315NEFORCE_BEGIN_LITERALS__
316
322
328NEFORCE_NODISCARD inline byte_size operator""_B(const uint64_t bytes) noexcept { return byte_size{bytes}; }
329
335NEFORCE_NODISCARD inline byte_size operator""_B(const decimal_t bytes) noexcept {
336 return byte_size{bytes, byte_size::unit::B};
337}
338
344NEFORCE_NODISCARD inline byte_size operator""_KB(const uint64_t bytes) noexcept {
345 return byte_size{static_cast<decimal_t>(bytes), byte_size::unit::KB};
346}
347
353NEFORCE_NODISCARD inline byte_size operator""_KB(const decimal_t bytes) noexcept {
354 return byte_size{bytes, byte_size::unit::KB};
355}
356
362NEFORCE_NODISCARD inline byte_size operator""_MB(const uint64_t bytes) noexcept {
363 return byte_size{static_cast<decimal_t>(bytes), byte_size::unit::MB};
364}
365
371NEFORCE_NODISCARD inline byte_size operator""_MB(const decimal_t bytes) noexcept {
372 return byte_size{bytes, byte_size::unit::MB};
373}
374
380NEFORCE_NODISCARD inline byte_size operator""_GB(const uint64_t bytes) noexcept {
381 return byte_size{static_cast<decimal_t>(bytes), byte_size::unit::GB};
382}
383
389NEFORCE_NODISCARD inline byte_size operator""_GB(const decimal_t bytes) noexcept {
390 return byte_size{bytes, byte_size::unit::GB};
391}
392
398NEFORCE_NODISCARD inline byte_size operator""_TB(const uint64_t bytes) noexcept {
399 return byte_size{static_cast<decimal_t>(bytes), byte_size::unit::TB};
400}
401
407NEFORCE_NODISCARD inline byte_size operator""_TB(const decimal_t bytes) noexcept {
408 return byte_size{bytes, byte_size::unit::TB};
409}
410
416NEFORCE_NODISCARD inline byte_size operator""_PB(const uint64_t bytes) noexcept {
417 return byte_size{static_cast<decimal_t>(bytes), byte_size::unit::PB};
418}
419
425NEFORCE_NODISCARD inline byte_size operator""_PB(const decimal_t bytes) noexcept {
426 return byte_size{bytes, byte_size::unit::PB};
427}
428
434NEFORCE_NODISCARD inline byte_size operator""_EB(const uint64_t bytes) noexcept {
435 return byte_size{static_cast<decimal_t>(bytes), byte_size::unit::EB};
436}
437
443NEFORCE_NODISCARD inline byte_size operator""_EB(const decimal_t bytes) noexcept {
444 return byte_size{bytes, byte_size::unit::EB};
445}
446 // UserLiterals
448
449NEFORCE_END_LITERALS__
450
451NEFORCE_END_NAMESPACE__
452#endif // NEFORCE_CORE_UTILITY_BYTE_SIZE_HPP__
字节大小类
NEFORCE_NODISCARD decimal_t as(unit u, bool binary=true) const
转换为指定单位的值
byte_size(decimal_t value, unit u, bool binary=true)
从值和单位构造
constexpr byte_size(uint64_t bytes)
从字节数构造
unit
字节大小单位枚举
@ AUTO
自动选择合适单位
static NEFORCE_NODISCARD byte_size parse(string_view str)
从字符串解析字节大小
NEFORCE_NODISCARD size_t to_hash() const noexcept
计算哈希值
NEFORCE_NODISCARD constexpr uint64_t bytes() const
获取字节数
NEFORCE_NODISCARD constexpr bool is_zero() const noexcept
检查是否为零
static NEFORCE_NODISCARD byte_size parse(string_view str, bool binary)
从字符串解析字节大小(指定进制)
NEFORCE_NODISCARD string to_string(unit u, int precision=2, bool binary=true) const
转换为指定单位的字符串
constexpr byte_size()=default
默认构造函数
NEFORCE_NODISCARD string to_string() const
转换为可读字符串
static NEFORCE_NODISCARD constexpr T max() noexcept
获取类型的最大值
字符串格式化功能
long double decimal_t
扩展精度浮点数类型
unsigned long long uint64_t
64位无符号整数类型
constexpr duration< inner::__common_rep_t< Rep1, Rep2 >, Period > operator*(const duration< Rep1, Period > &value, const Rep2 &scalar)
乘法运算符(持续时间 * 标量)
constexpr duration< inner::__common_rep_t< Rep1, enable_if_t<!is_duration_v< Rep2 >, Rep2 > >, Period > operator/(const duration< Rep1, Period > &value, const Rep2 &scalar)
除法运算符(持续时间 / 标量)
bool operator==(const function< Res(Args...)> &f, nullptr_t np) noexcept
等于空指针比较
NEFORCE_NODISCARD constexpr bool operator<(const normal_iterator< LeftIter > &lhs, const normal_iterator< RightIter > &rhs) noexcept
小于比较运算符
NEFORCE_NODISCARD constexpr auto operator-(const normal_iterator< LeftIter > &lhs, const normal_iterator< RightIter > &rhs) noexcept -> decltype(lhs.base() - rhs.base())
减法运算符
NEFORCE_NODISCARD constexpr normal_iterator< Iterator > operator+(iter_difference_t< normal_iterator< Iterator > > n, const normal_iterator< Iterator > &iter) noexcept
加法运算符
basic_string_view< char > string_view
字符字符串视图
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
可解析对象接口
哈希函数的主模板
通用接口,同时具备可比较和可哈希功能
可解析对象接口
类型解包器模板
动态大小数组容器