byte_units.h raw

   1  // Copyright (c) 2025-present The Bitcoin Core developers
   2  // Distributed under the MIT software license, see the accompanying
   3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
   4  
   5  #ifndef BITCOIN_UTIL_BYTE_UNITS_H
   6  #define BITCOIN_UTIL_BYTE_UNITS_H
   7  
   8  #include <util/overflow.h>
   9  
  10  #include <limits>
  11  #include <stdexcept>
  12  
  13  namespace util::detail {
  14  template <unsigned SHIFT>
  15  consteval uint64_t ByteUnitsToBytes(unsigned long long units)
  16  {
  17      const auto bytes{CheckedLeftShift(units, SHIFT)};
  18      if (!bytes || *bytes > std::numeric_limits<uint64_t>::max()) {
  19          throw std::overflow_error("Too large");
  20      }
  21      return *bytes;
  22  }
  23  } // namespace util::detail
  24  
  25  /// Conversion of MiB to bytes.
  26  consteval uint64_t operator""_MiB(unsigned long long mebibytes)
  27  {
  28      return util::detail::ByteUnitsToBytes<20>(mebibytes);
  29  }
  30  
  31  /// Conversion of GiB to bytes.
  32  consteval uint64_t operator""_GiB(unsigned long long gibibytes)
  33  {
  34      return util::detail::ByteUnitsToBytes<30>(gibibytes);
  35  }
  36  
  37  #endif // BITCOIN_UTIL_BYTE_UNITS_H
  38