size_literals.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #pragma once
  2. #include "yexception.h"
  3. #include <util/system/types.h>
  4. #include <limits>
  5. // Unsigned literals
  6. constexpr ui64 operator"" _B(unsigned long long value) noexcept {
  7. return value;
  8. }
  9. constexpr ui64 operator"" _KB(unsigned long long value) noexcept {
  10. return value * 1024;
  11. }
  12. constexpr ui64 operator"" _MB(unsigned long long value) noexcept {
  13. return value * 1024_KB;
  14. }
  15. constexpr ui64 operator"" _GB(unsigned long long value) noexcept {
  16. return value * 1024_MB;
  17. }
  18. constexpr ui64 operator"" _TB(unsigned long long value) noexcept {
  19. return value * 1024_GB;
  20. }
  21. constexpr ui64 operator"" _PB(unsigned long long value) noexcept {
  22. return value * 1024_TB;
  23. }
  24. constexpr ui64 operator"" _EB(unsigned long long value) noexcept {
  25. return value * 1024_PB;
  26. }
  27. // Signed literals
  28. namespace NPrivate {
  29. constexpr i64 SignedCast(ui64 value) {
  30. return value <= static_cast<ui64>(std::numeric_limits<i64>::max())
  31. ? static_cast<i64>(value)
  32. : ythrow yexception() << "The resulting value " << value << " does not fit into the i64 type";
  33. }
  34. } // namespace NPrivate
  35. constexpr i64 operator"" _KBs(const unsigned long long value) noexcept {
  36. return ::NPrivate::SignedCast(value * 1024);
  37. }
  38. constexpr i64 operator"" _MBs(unsigned long long value) noexcept {
  39. return ::NPrivate::SignedCast(value * 1024_KB);
  40. }
  41. constexpr i64 operator"" _GBs(unsigned long long value) noexcept {
  42. return ::NPrivate::SignedCast(value * 1024_MB);
  43. }
  44. constexpr i64 operator"" _TBs(unsigned long long value) noexcept {
  45. return ::NPrivate::SignedCast(value * 1024_GB);
  46. }
  47. constexpr i64 operator"" _PBs(unsigned long long value) noexcept {
  48. return ::NPrivate::SignedCast(value * 1024_TB);
  49. }
  50. constexpr i64 operator"" _EBs(unsigned long long value) noexcept {
  51. return ::NPrivate::SignedCast(value * 1024_PB);
  52. }