fix: improve downcast mode off

This commit is contained in:
Johel Ernesto Guerrero Peña
2022-03-28 10:17:46 -04:00
parent 6c2c8748e7
commit 146f1d1c83
9 changed files with 196 additions and 192 deletions

View File

@@ -427,11 +427,11 @@ static_assert(invalid_binary_operations<metre>);
static_assert(is_same_v<decltype(1_q_m + 1_q_m), length<metre, std::int64_t>>);
static_assert(is_same_v<decltype(1_q_m - 1_q_m), length<metre, std::int64_t>>);
static_assert(is_same_v<decltype(1_q_m * 1), length<metre, std::int64_t>>);
static_assert(is_same_v<decltype(1_q_m * quantity{1}), length<metre, std::int64_t>>);
static_assert(compare<decltype(1_q_m * quantity{1}), length<metre, std::int64_t>>);
static_assert(is_same_v<decltype(1 * 1_q_m), length<metre, std::int64_t>>);
static_assert(is_same_v<decltype(quantity{1} * 1_q_m), length<metre, std::int64_t>>);
static_assert(compare<decltype(quantity{1} * 1_q_m), length<metre, std::int64_t>>);
static_assert(is_same_v<decltype(1_q_m / 1), length<metre, std::int64_t>>);
static_assert(is_same_v<decltype(1_q_m / quantity{1}), length<metre, std::int64_t>>);
static_assert(compare<decltype(1_q_m / quantity{1}), length<metre, std::int64_t>>);
static_assert(is_same_v<decltype(1_q_m % 1), length<metre, std::int64_t>>);
static_assert(is_same_v<decltype(1_q_m % quantity{1}), length<metre, std::int64_t>>);
static_assert(is_same_v<decltype(1_q_m % 1_q_m), length<metre, std::int64_t>>);
@@ -458,10 +458,10 @@ static_assert(is_same_v<decltype(1_q_m + 1._q_m), length<metre, long double>>);
static_assert(is_same_v<decltype(1_q_m - 1._q_m), length<metre, long double>>);
static_assert(is_same_v<decltype(1_q_m * 1.L), length<metre, long double>>); // TODO should we address fundamental types implicit truncating conversions with concepts?
static_assert(is_same_v<decltype(1 * 1._q_m), length<metre, long double>>);
static_assert(is_same_v<decltype(1_q_m * quantity{1.L}), length<metre, long double>>); // TODO should we address fundamental types implicit truncating conversions with concepts?
static_assert(is_same_v<decltype(quantity{1} * 1._q_m), length<metre, long double>>);
static_assert(compare<decltype(1_q_m * quantity{1.L}), length<metre, long double>>); // TODO should we address fundamental types implicit truncating conversions with concepts?
static_assert(compare<decltype(quantity{1} * 1._q_m), length<metre, long double>>);
static_assert(is_same_v<decltype(1_q_m / 1.L), length<metre, long double>>);
static_assert(is_same_v<decltype(1_q_m / quantity{1.L}), length<metre, long double>>);
static_assert(compare<decltype(1_q_m / quantity{1.L}), length<metre, long double>>);
static_assert(compare<decltype(1_q_m * dimensionless<percent, long double>(1)), length<centimetre, long double>>);
static_assert(compare<decltype(dimensionless<percent, std::int64_t>(1) * 1._q_m), length<centimetre, long double>>);
static_assert(compare<decltype(1_q_m * 1._q_m), area<square_metre, long double>>);
@@ -479,10 +479,10 @@ static_assert(is_same_v<decltype(1._q_m + 1_q_m), length<metre, long double>>);
static_assert(is_same_v<decltype(1._q_m - 1_q_m), length<metre, long double>>);
static_assert(is_same_v<decltype(1._q_m * 1), length<metre, long double>>);
static_assert(is_same_v<decltype(1.L * 1_q_m), length<metre, long double>>);
static_assert(is_same_v<decltype(1._q_m * quantity{1}), length<metre, long double>>);
static_assert(is_same_v<decltype(quantity{1.L} * 1_q_m), length<metre, long double>>);
static_assert(compare<decltype(1._q_m * quantity{1}), length<metre, long double>>);
static_assert(compare<decltype(quantity{1.L} * 1_q_m), length<metre, long double>>);
static_assert(is_same_v<decltype(1._q_m / 1), length<metre, long double>>);
static_assert(is_same_v<decltype(1._q_m / quantity{1}), length<metre, long double>>);
static_assert(compare<decltype(1._q_m / quantity{1}), length<metre, long double>>);
static_assert(compare<decltype(1._q_m * dimensionless<percent, std::int64_t>(1)), length<centimetre, long double>>);
static_assert(compare<decltype(dimensionless<percent, long double>(1) * 1_q_m), length<centimetre, long double>>);
static_assert(compare<decltype(1._q_m / dimensionless<percent, std::int64_t>(1)), length<hectometre, long double>>);
@@ -493,25 +493,25 @@ static_assert(compare<decltype(quantity{1.L} / 1_q_s), frequency<hertz, long dou
static_assert(compare<decltype(dimensionless<percent, long double>(1) / 1_q_s), frequency<scaled_unit<ratio(1, 100), hertz>, long double>>);
// different units
static_assert(is_same_v<decltype(1_q_m + 1_q_km), length<metre, std::int64_t>>);
static_assert(is_same_v<decltype(1._q_m + 1_q_km), length<metre, long double>>);
static_assert(is_same_v<decltype(1_q_m + 1._q_km), length<metre, long double>>);
static_assert(is_same_v<decltype(1._q_m + 1._q_km), length<metre, long double>>);
static_assert(compare<decltype(1_q_m + 1_q_km), length<metre, std::int64_t>>);
static_assert(compare<decltype(1._q_m + 1_q_km), length<metre, long double>>);
static_assert(compare<decltype(1_q_m + 1._q_km), length<metre, long double>>);
static_assert(compare<decltype(1._q_m + 1._q_km), length<metre, long double>>);
static_assert(is_same_v<decltype(1_q_km + 1_q_m), length<metre, std::int64_t>>);
static_assert(is_same_v<decltype(1._q_km + 1_q_m), length<metre, long double>>);
static_assert(is_same_v<decltype(1_q_km + 1._q_m), length<metre, long double>>);
static_assert(is_same_v<decltype(1._q_km + 1._q_m), length<metre, long double>>);
static_assert(compare<decltype(1_q_km + 1_q_m), length<metre, std::int64_t>>);
static_assert(compare<decltype(1._q_km + 1_q_m), length<metre, long double>>);
static_assert(compare<decltype(1_q_km + 1._q_m), length<metre, long double>>);
static_assert(compare<decltype(1._q_km + 1._q_m), length<metre, long double>>);
static_assert(is_same_v<decltype(1_q_m - 1_q_km), length<metre, std::int64_t>>);
static_assert(is_same_v<decltype(1._q_m - 1_q_km), length<metre, long double>>);
static_assert(is_same_v<decltype(1_q_m - 1._q_km), length<metre, long double>>);
static_assert(is_same_v<decltype(1._q_m - 1._q_km), length<metre, long double>>);
static_assert(compare<decltype(1_q_m - 1_q_km), length<metre, std::int64_t>>);
static_assert(compare<decltype(1._q_m - 1_q_km), length<metre, long double>>);
static_assert(compare<decltype(1_q_m - 1._q_km), length<metre, long double>>);
static_assert(compare<decltype(1._q_m - 1._q_km), length<metre, long double>>);
static_assert(is_same_v<decltype(1_q_km - 1_q_m), length<metre, std::int64_t>>);
static_assert(is_same_v<decltype(1._q_km - 1_q_m), length<metre, long double>>);
static_assert(is_same_v<decltype(1_q_km - 1._q_m), length<metre, long double>>);
static_assert(is_same_v<decltype(1._q_km - 1._q_m), length<metre, long double>>);
static_assert(compare<decltype(1_q_km - 1_q_m), length<metre, std::int64_t>>);
static_assert(compare<decltype(1._q_km - 1_q_m), length<metre, long double>>);
static_assert(compare<decltype(1_q_km - 1._q_m), length<metre, long double>>);
static_assert(compare<decltype(1._q_km - 1._q_m), length<metre, long double>>);
static_assert(is_same_v<decltype(1_q_m % 1_q_km), length<metre, std::int64_t>>);
static_assert(is_same_v<decltype(1_q_km % 1_q_m), length<kilometre, std::int64_t>>);
@@ -820,8 +820,8 @@ static_assert(is_same_v<decltype(1_q_mm + 1_q_km), length<scaled_unit<ratio(1, 1
#else
static_assert(is_same_v<decltype(10_q_m / 5_q_s), speed<metre_per_second, std::int64_t>>);
static_assert(is_same_v<decltype(1_q_mm + 1_q_km), length<millimetre, std::int64_t>>);
static_assert(compare<decltype(10_q_m / 5_q_s), speed<metre_per_second, std::int64_t>>);
static_assert(compare<decltype(1_q_mm + 1_q_km), length<millimetre, std::int64_t>>);
#endif
@@ -835,17 +835,17 @@ constexpr auto quotient_remainder_theorem(auto q1, auto q2)
return q;
}
static_assert(same(quotient_remainder_theorem(3'000 * m, 400 * m), 3'000 * m));
static_assert(same(quotient_remainder_theorem(3 * km, 400 * m), 3 * km));
static_assert(same(quotient_remainder_theorem(3 * km, 2 * m), 3 * km));
static_assert(same(quotient_remainder_theorem(3 * km, 400'000 * mm), 3 * km));
static_assert(same(quotient_remainder_theorem(3 * km, 2'000 * mm), 3 * km));
static_assert(same(quotient_remainder_theorem(3 * km, 400 * mm), 3 * km));
static_assert(same(quotient_remainder_theorem(3 * km, 2 * mm), 3 * km));
static_assert(comp(quotient_remainder_theorem(3'000 * m, 400 * m), 3'000 * m));
static_assert(comp(quotient_remainder_theorem(3 * km, 400 * m), 3 * km));
static_assert(comp(quotient_remainder_theorem(3 * km, 2 * m), 3 * km));
static_assert(comp(quotient_remainder_theorem(3 * km, 400'000 * mm), 3 * km));
static_assert(comp(quotient_remainder_theorem(3 * km, 2'000 * mm), 3 * km));
static_assert(comp(quotient_remainder_theorem(3 * km, 400 * mm), 3 * km));
static_assert(comp(quotient_remainder_theorem(3 * km, 2 * mm), 3 * km));
static_assert(same(quotient_remainder_theorem(3'000 * m, 400), 3'000 * m));
static_assert(same(quotient_remainder_theorem(3'000 * m, quantity(400)), 3'000 * m));
static_assert(same(quotient_remainder_theorem(3 * km, quantity(400)), 3 * km));
static_assert(same(quotient_remainder_theorem(3 * km, quantity(2)), 3 * km));
static_assert(same(quotient_remainder_theorem(3 * km, dimensionless<scaled_unit<ratio(1, 1000), one>, int>(400)), 3 * km));
static_assert(comp(quotient_remainder_theorem(3'000 * m, quantity(400)), 3'000 * m));
static_assert(comp(quotient_remainder_theorem(3 * km, quantity(400)), 3 * km));
static_assert(comp(quotient_remainder_theorem(3 * km, quantity(2)), 3 * km));
static_assert(comp(quotient_remainder_theorem(3 * km, dimensionless<scaled_unit<ratio(1, 1000), one>, int>(400)), 3 * km));
} // namespace