forked from mpusz/mp-units
Small refactoring of new ratio (resolves #14)
This commit is contained in:
@@ -202,6 +202,7 @@ NOTE: This library as of now compiles correctly only with gcc-9.1 and newer.
|
|||||||
- Added official CGS system support
|
- Added official CGS system support
|
||||||
- Added official data information system support
|
- Added official data information system support
|
||||||
- Repository file tree cleanup
|
- Repository file tree cleanup
|
||||||
|
- `ratio` refactored to contain `Exp` template parameter
|
||||||
|
|
||||||
- 0.4.0 Nov 17, 2019
|
- 0.4.0 Nov 17, 2019
|
||||||
- Support for derived dimensions in `exp` added
|
- Support for derived dimensions in `exp` added
|
||||||
|
@@ -74,7 +74,16 @@ struct scaled_unit : downcast_base<scaled_unit<R, U>> {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
The above type is a framework's private type and the user should never instantiate it directly.
|
where:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
template<typename R>
|
||||||
|
concept UnitRatio = Ratio<R> && (R::num * R::den > 0);
|
||||||
|
```
|
||||||
|
|
||||||
|
and `Ratio` is satisfied by any instantiation of `units::ratio<Num, Den, Exp>`.
|
||||||
|
|
||||||
|
The `scaled_unit` type is a framework's private type and the user should never instantiate it directly.
|
||||||
The public user interface to create units consists of:
|
The public user interface to create units consists of:
|
||||||
|
|
||||||

|

|
||||||
@@ -143,8 +152,8 @@ namespace units::si {
|
|||||||
|
|
||||||
// prefixes
|
// prefixes
|
||||||
struct prefix : prefix_type {};
|
struct prefix : prefix_type {};
|
||||||
struct centi : units::prefix<kilo, prefix, "c", ratio<1, 100>> {};
|
struct centi : units::prefix<centi, prefix, "c", ratio<1, 1, -2>> {};
|
||||||
struct kilo : units::prefix<kilo, prefix, "k", ratio<1'000>> {};
|
struct kilo : units::prefix<kilo, prefix, "k", ratio<1, 1, 3>> {};
|
||||||
|
|
||||||
// length
|
// length
|
||||||
struct metre : named_unit<metre, "m", prefix> {};
|
struct metre : named_unit<metre, "m", prefix> {};
|
||||||
|
@@ -31,13 +31,15 @@ constexpr auto ratio_text()
|
|||||||
{
|
{
|
||||||
if constexpr(Ratio::num != 1 || Ratio::den != 1 || Ratio::exp != 0) {
|
if constexpr(Ratio::num != 1 || Ratio::den != 1 || Ratio::exp != 0) {
|
||||||
auto txt = basic_fixed_string("[") + regular<Ratio::num>();
|
auto txt = basic_fixed_string("[") + regular<Ratio::num>();
|
||||||
if constexpr(Ratio::den == 1 && Ratio::exp == 0) {
|
if constexpr(Ratio::den == 1) {
|
||||||
|
if constexpr(Ratio::exp == 0) {
|
||||||
return txt + basic_fixed_string("]");
|
return txt + basic_fixed_string("]");
|
||||||
}
|
}
|
||||||
else if constexpr (Ratio::den == 1) {
|
else {
|
||||||
return txt + basic_fixed_string(" \u00D7 10") + superscript<Ratio::exp>() +
|
return txt + basic_fixed_string(" \u00D7 10") + superscript<Ratio::exp>() +
|
||||||
basic_fixed_string("]");
|
basic_fixed_string("]");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
return txt + basic_fixed_string("/") + regular<Ratio::den>() +
|
return txt + basic_fixed_string("/") + regular<Ratio::den>() +
|
||||||
basic_fixed_string(" \u00D7 10") + superscript<Ratio::exp>() +
|
basic_fixed_string(" \u00D7 10") + superscript<Ratio::exp>() +
|
||||||
|
@@ -23,7 +23,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <units/prefix.h>
|
#include <units/prefix.h>
|
||||||
#include <ratio>
|
|
||||||
|
|
||||||
namespace units::data {
|
namespace units::data {
|
||||||
|
|
||||||
|
@@ -40,7 +40,8 @@ template<typename T>
|
|||||||
return v < 0 ? -v : v;
|
return v < 0 ? -v : v;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr std::tuple<std::intmax_t, std::intmax_t, std::intmax_t> normalize(std::intmax_t num, std::intmax_t den, std::intmax_t exp) {
|
constexpr std::tuple<std::intmax_t, std::intmax_t, std::intmax_t> normalize(std::intmax_t num, std::intmax_t den, std::intmax_t exp)
|
||||||
|
{
|
||||||
std::intmax_t gcd = std::gcd(num, den);
|
std::intmax_t gcd = std::gcd(num, den);
|
||||||
num = num * (den < 0 ? -1 : 1) / gcd;
|
num = num * (den < 0 ? -1 : 1) / gcd;
|
||||||
den = detail::abs(den) / gcd;
|
den = detail::abs(den) / gcd;
|
||||||
|
@@ -296,7 +296,7 @@ TEST_CASE("operator<< on a quantity", "[text][ostream][fmt]")
|
|||||||
|
|
||||||
SECTION("iostream")
|
SECTION("iostream")
|
||||||
{
|
{
|
||||||
CHECK(stream.str() == "8 [1 \u00D7 10⁻²]m³");
|
CHECK(stream.str() == "8 [1 × 10⁻²]m³");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("fmt with default format {} on a quantity")
|
SECTION("fmt with default format {} on a quantity")
|
||||||
@@ -317,7 +317,7 @@ TEST_CASE("operator<< on a quantity", "[text][ostream][fmt]")
|
|||||||
|
|
||||||
SECTION("iostream")
|
SECTION("iostream")
|
||||||
{
|
{
|
||||||
CHECK(stream.str() == "2 [6 \u00D7 10¹]Hz");
|
CHECK(stream.str() == "2 [6 × 10¹]Hz");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("fmt with default format {} on a quantity")
|
SECTION("fmt with default format {} on a quantity")
|
||||||
@@ -338,7 +338,7 @@ TEST_CASE("operator<< on a quantity", "[text][ostream][fmt]")
|
|||||||
|
|
||||||
SECTION("iostream")
|
SECTION("iostream")
|
||||||
{
|
{
|
||||||
CHECK(stream.str() == "10 [1/6 \u00D7 10⁻¹]W");
|
CHECK(stream.str() == "10 [1/6 × 10⁻¹]W");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("fmt with default format {} on a quantity")
|
SECTION("fmt with default format {} on a quantity")
|
||||||
@@ -359,7 +359,7 @@ TEST_CASE("operator<< on a quantity", "[text][ostream][fmt]")
|
|||||||
|
|
||||||
SECTION("iostream")
|
SECTION("iostream")
|
||||||
{
|
{
|
||||||
CHECK(stream.str() == "30 [1/6 \u00D7 10²]W");
|
CHECK(stream.str() == "30 [1/6 × 10²]W");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("fmt with default format {} on a quantity")
|
SECTION("fmt with default format {} on a quantity")
|
||||||
@@ -404,7 +404,7 @@ TEST_CASE("operator<< on a quantity", "[text][ostream][fmt]")
|
|||||||
|
|
||||||
SECTION("iostream")
|
SECTION("iostream")
|
||||||
{
|
{
|
||||||
CHECK(stream.str() == "8 [1 \u00D7 10³]m⋅s");
|
CHECK(stream.str() == "8 [1 × 10³]m⋅s");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("fmt with default format {} on a quantity")
|
SECTION("fmt with default format {} on a quantity")
|
||||||
@@ -425,7 +425,7 @@ TEST_CASE("operator<< on a quantity", "[text][ostream][fmt]")
|
|||||||
|
|
||||||
SECTION("iostream")
|
SECTION("iostream")
|
||||||
{
|
{
|
||||||
CHECK(stream.str() == "2 [6 \u00D7 10¹]kg/s");
|
CHECK(stream.str() == "2 [6 × 10¹]kg/s");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("fmt with default format {} on a quantity")
|
SECTION("fmt with default format {} on a quantity")
|
||||||
@@ -446,7 +446,7 @@ TEST_CASE("operator<< on a quantity", "[text][ostream][fmt]")
|
|||||||
|
|
||||||
SECTION("iostream")
|
SECTION("iostream")
|
||||||
{
|
{
|
||||||
CHECK(stream.str() == "10 [1/6 \u00D7 10⁻¹]kg/s");
|
CHECK(stream.str() == "10 [1/6 × 10⁻¹]kg/s");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("fmt with default format {} on a quantity")
|
SECTION("fmt with default format {} on a quantity")
|
||||||
@@ -467,7 +467,7 @@ TEST_CASE("operator<< on a quantity", "[text][ostream][fmt]")
|
|||||||
|
|
||||||
SECTION("iostream")
|
SECTION("iostream")
|
||||||
{
|
{
|
||||||
CHECK(stream.str() == "30 [6 \u00D7 10⁻²]1/m⋅s");
|
CHECK(stream.str() == "30 [6 × 10⁻²]1/m⋅s");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("fmt with default format {} on a quantity")
|
SECTION("fmt with default format {} on a quantity")
|
||||||
|
Reference in New Issue
Block a user