Bitcoin Core 31.99.0
P2P Digital Currency
byte_units.h
Go to the documentation of this file.
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
13namespace util::detail {
14template <unsigned SHIFT>
15constexpr size_t ByteUnitsToBytes(unsigned long long units, const char* exception_msg)
16{
17 const auto bytes{CheckedLeftShift(units, SHIFT)};
18 if (!bytes || *bytes > std::numeric_limits<size_t>::max()) {
19 throw std::overflow_error(exception_msg);
20 }
21 return *bytes;
22}
23} // namespace util::detail
24
26constexpr size_t operator""_MiB(unsigned long long mebibytes)
27{
28 return util::detail::ByteUnitsToBytes<20>(mebibytes, "MiB value too large for size_t byte conversion");
29}
30
32constexpr size_t operator""_GiB(unsigned long long gibibytes)
33{
34 return util::detail::ByteUnitsToBytes<30>(gibibytes, "GiB value too large for size_t byte conversion");
35}
36
37#endif // BITCOIN_UTIL_BYTE_UNITS_H
constexpr size_t ByteUnitsToBytes(unsigned long long units, const char *exception_msg)
Definition: byte_units.h:15
constexpr std::optional< T > CheckedLeftShift(T input, unsigned shift) noexcept
Left bit shift with overflow checking.
Definition: overflow.h:84