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