132 lines
4.0 KiB
C++
132 lines
4.0 KiB
C++
// Copyright 2021 The Pigweed Authors
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
|
// use this file except in compliance with the License. You may obtain a copy of
|
|
// the License at
|
|
//
|
|
// https://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
// License for the specific language governing permissions and limitations under
|
|
// the License.
|
|
#pragma once
|
|
|
|
namespace pw::bytes {
|
|
|
|
// Size constants for bytes in powers of two as defined by IEC 60027-2 A.2 and
|
|
// ISO/IEC 80000:13-2008:
|
|
|
|
// Kibibytes (KiB): 1024^1 or 2^10
|
|
inline constexpr unsigned long long int kBytesInKibibyte = 1ull << 10;
|
|
|
|
// Mebibytes (MiB): 1024^2 or 2^20
|
|
inline constexpr unsigned long long int kBytesInMibibyte = 1ull << 20;
|
|
|
|
// Gibibytes (GiB): 1024^3 or 2^30
|
|
inline constexpr unsigned long long int kBytesInGibibyte = 1ull << 30;
|
|
|
|
// Tebibytes (TiB): 1024^4 or 2^40
|
|
inline constexpr unsigned long long int kBytesInTebibyte = 1ull << 40;
|
|
|
|
// Pebibytes (PiB): 1024^5 or 2^50
|
|
inline constexpr unsigned long long int kBytesInPebibyte = 1ull << 50;
|
|
|
|
// Exbibytes (EiB): 1024^6 or 2^60
|
|
inline constexpr unsigned long long int kBytesInExbibyte = 1ull << 60;
|
|
|
|
// Functions for specifying a number of bytes in powers of two, as defined by
|
|
// IEC 60027-2 A.2 and ISO/IEC 80000:13-2008.
|
|
//
|
|
// These are useful in headers when using user-defined literals are disallowed.
|
|
//
|
|
// #include "pw_bytes/units.h"
|
|
//
|
|
// constexpr size_t kBufferSizeBytes = pw::bytes::MiB(1) + pw::bytes::KiB(42);
|
|
inline constexpr unsigned long long int B(unsigned long long int bytes) {
|
|
return bytes;
|
|
}
|
|
|
|
inline constexpr unsigned long long int KiB(unsigned long long int kibibytes) {
|
|
return kibibytes * kBytesInKibibyte;
|
|
}
|
|
|
|
inline constexpr unsigned long long int MiB(unsigned long long int mibibytes) {
|
|
return mibibytes * kBytesInMibibyte;
|
|
}
|
|
|
|
inline constexpr unsigned long long int GiB(unsigned long long int gibibytes) {
|
|
return gibibytes * kBytesInGibibyte;
|
|
}
|
|
|
|
inline constexpr unsigned long long int TiB(unsigned long long int tebibytes) {
|
|
return tebibytes * kBytesInTebibyte;
|
|
}
|
|
|
|
inline constexpr unsigned long long int PiB(unsigned long long int pebibytes) {
|
|
return pebibytes * kBytesInPebibyte;
|
|
}
|
|
|
|
inline constexpr unsigned long long int EiB(unsigned long long int exbibytes) {
|
|
return exbibytes * kBytesInExbibyte;
|
|
}
|
|
|
|
namespace unit_literals {
|
|
|
|
// User-defined literals for specifying a number of bytes in powers of two, as
|
|
// defined by IEC 60027-2 A.2 and ISO/IEC 80000:13-2008.
|
|
//
|
|
// The supported prefixes include:
|
|
// _B for bytes (1024^0)
|
|
// _KiB for kibibytes (1024^1)
|
|
// _MiB for mibibytes (1024^2)
|
|
// _GiB for gibibytes (1024^3)
|
|
// _TiB for tebibytes (1024^4)
|
|
// _PiB for pebibytes (1024^5)
|
|
// _EiB for exbibytes (1024^6)
|
|
//
|
|
// In order to use these you must use a using namespace directive, for example:
|
|
//
|
|
// #include "pw_bytes/units.h"
|
|
//
|
|
// using namespace pw::bytes::unit_literals;
|
|
//
|
|
// constepxr size_t kRandomBufferSizeBytes = 1_MiB + 42_KiB;
|
|
constexpr unsigned long long int operator""_B(unsigned long long int bytes) {
|
|
return bytes;
|
|
}
|
|
|
|
constexpr unsigned long long int operator""_KiB(
|
|
unsigned long long int kibibytes) {
|
|
return kibibytes * kBytesInKibibyte;
|
|
}
|
|
|
|
constexpr unsigned long long int operator""_MiB(
|
|
unsigned long long int mibibytes) {
|
|
return mibibytes * kBytesInMibibyte;
|
|
}
|
|
|
|
constexpr unsigned long long int operator""_GiB(
|
|
unsigned long long int gibibytes) {
|
|
return gibibytes * kBytesInGibibyte;
|
|
}
|
|
|
|
constexpr unsigned long long int operator""_TiB(
|
|
unsigned long long int tebibytes) {
|
|
return tebibytes * kBytesInTebibyte;
|
|
}
|
|
|
|
constexpr unsigned long long int operator""_PiB(
|
|
unsigned long long int pebibytes) {
|
|
return pebibytes * kBytesInPebibyte;
|
|
}
|
|
|
|
constexpr unsigned long long int operator""_EiB(
|
|
unsigned long long int exbibytes) {
|
|
return exbibytes * kBytesInExbibyte;
|
|
}
|
|
|
|
} // namespace unit_literals
|
|
} // namespace pw::bytes
|