From d568cfa1b38badfa958ad6e6a8ca5e6f0ee70b77 Mon Sep 17 00:00:00 2001 From: Christoph Seitz Date: Fri, 1 Jan 2021 17:20:22 +0100 Subject: [PATCH] Add SI prefix to bit unit. --- src/include/units/data/base/information.h | 21 ++++++++++++++++++++ src/include/units/data/derived/bitrate.h | 18 +++++++++++++++++ test/unit_test/runtime/digital_info_test.cpp | 4 ++++ test/unit_test/static/data_test.cpp | 3 +++ 4 files changed, 46 insertions(+) diff --git a/src/include/units/data/base/information.h b/src/include/units/data/base/information.h index 95205619..0198ff10 100644 --- a/src/include/units/data/base/information.h +++ b/src/include/units/data/base/information.h @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -37,6 +38,13 @@ struct gibibit : prefixed_unit {}; struct tebibit : prefixed_unit {}; struct pebibit : prefixed_unit {}; +struct si_bit : alias_unit {}; +struct kilobit : prefixed_unit {}; +struct megabit : prefixed_unit {}; +struct gigabit : prefixed_unit {}; +struct terabit : prefixed_unit {}; +struct petabit : prefixed_unit {}; + struct byte : named_scaled_unit {}; struct kibibyte : prefixed_unit {}; struct mebibyte : prefixed_unit {}; @@ -62,6 +70,13 @@ constexpr auto operator"" _q_Gib(unsigned long long l) { return information(l); } constexpr auto operator"" _q_Pib(unsigned long long l) { return information(l); } +// bits (SI) +constexpr auto operator"" _q_kb(unsigned long long l) { return information(l); } +constexpr auto operator"" _q_Mb(unsigned long long l) { return information(l); } +constexpr auto operator"" _q_Gb(unsigned long long l) { return information(l); } +constexpr auto operator"" _q_Tb(unsigned long long l) { return information(l); } +constexpr auto operator"" _q_Pb(unsigned long long l) { return information(l); } + // bytes constexpr auto operator"" _q_B(unsigned long long l) { return information(l); } constexpr auto operator"" _q_KiB(unsigned long long l) { return information(l); } @@ -81,6 +96,12 @@ inline constexpr auto Gib = information{}; inline constexpr auto Tib = information{}; inline constexpr auto Pib = information{}; +inline constexpr auto kb = information{}; +inline constexpr auto Mb = information{}; +inline constexpr auto Gb = information{}; +inline constexpr auto Tb = information{}; +inline constexpr auto Pb = information{}; + inline constexpr auto B = information{}; inline constexpr auto KiB = information{}; inline constexpr auto MiB = information{}; diff --git a/src/include/units/data/derived/bitrate.h b/src/include/units/data/derived/bitrate.h index 74e75d42..4aa237e6 100644 --- a/src/include/units/data/derived/bitrate.h +++ b/src/include/units/data/derived/bitrate.h @@ -38,6 +38,12 @@ struct gibibit_per_second : deduced_unit {}; struct pebibit_per_second : deduced_unit {}; +struct kilobit_per_second : deduced_unit {}; +struct megabit_per_second : deduced_unit {}; +struct gigabit_per_second : deduced_unit {}; +struct terabit_per_second : deduced_unit {}; +struct petabit_per_second : deduced_unit {}; + template concept Bitrate = QuantityOf; @@ -54,6 +60,12 @@ constexpr auto operator"" _q_Gib_per_s(unsigned long long l) { return bitrate(l); } constexpr auto operator"" _q_Pib_per_s(unsigned long long l) { return bitrate(l); } +constexpr auto operator"" _q_kb_per_s(unsigned long long l) { return bitrate(l); } +constexpr auto operator"" _q_Mb_per_s(unsigned long long l) { return bitrate(l); } +constexpr auto operator"" _q_Gb_per_s(unsigned long long l) { return bitrate(l); } +constexpr auto operator"" _q_Tb_per_s(unsigned long long l) { return bitrate(l); } +constexpr auto operator"" _q_Pb_per_s(unsigned long long l) { return bitrate(l); } + } // namespace literals namespace unit_constants { @@ -65,6 +77,12 @@ inline constexpr auto Gib_per_s = bitrate{}; inline constexpr auto Tib_per_s = bitrate{}; inline constexpr auto Pib_per_s = bitrate{}; +inline constexpr auto kb_per_s = bitrate{}; +inline constexpr auto Mb_per_s = bitrate{}; +inline constexpr auto Gb_per_s = bitrate{}; +inline constexpr auto Tb_per_s = bitrate{}; +inline constexpr auto Pb_per_s = bitrate{}; + } // namespace unit_constants } // namespace units::data diff --git a/test/unit_test/runtime/digital_info_test.cpp b/test/unit_test/runtime/digital_info_test.cpp index d1f269dc..deb6ef01 100644 --- a/test/unit_test/runtime/digital_info_test.cpp +++ b/test/unit_test/runtime/digital_info_test.cpp @@ -56,5 +56,9 @@ TEST_CASE("operator<< on a data quantity", "[text][ostream]") stream << 8_q_Kib * 8_q_Kib / 2_q_b; REQUIRE(stream.str() == "32 Mib"); } + SECTION("prefixed coherent unit (SI)") { + stream << 32_q_kb; + REQUIRE(stream.str() == "32 kb"); + } } } diff --git a/test/unit_test/static/data_test.cpp b/test/unit_test/static/data_test.cpp index 45ba9bed..4a333ae5 100644 --- a/test/unit_test/static/data_test.cpp +++ b/test/unit_test/static/data_test.cpp @@ -36,6 +36,9 @@ static_assert(1024_q_B == 1_q_KiB); static_assert(8 * 1024_q_b == 1_q_KiB); static_assert(8 * 1_q_Kib == 1_q_KiB); +static_assert(1_q_kb == 1000_q_b); +static_assert(2000_q_Mib == 2097152_q_kb); + static_assert(1_q_Kib == 1024_q_b); static_assert(1_q_Mib == 1024_q_Kib); static_assert(1_q_Gib == 1024_q_Mib);