refactor: std::common_type usage replaced with dedicated functions for units, dimensions, and references

This commit is contained in:
Mateusz Pusz committed 2022-11-09 18:39:51 -10:00
1 parent 649252d691
commit f2e63fdeb1
6 files changed
+74 -97

No files matched your search

+9 -10
View File
@@ -174,15 +174,15 @@ static_assert(1 / time != frequency);
static_assert(interconvertible(1 / time, frequency));
static_assert(1 / frequency == time);
static_assert(frequency * time == dimension_one);
static_assert(std::is_same_v<std::common_type_t<decltype(1 / time), decltype(frequency)>, frequency_>);
static_assert(std::is_same_v<std::common_type_t<decltype(frequency), decltype(1 / time)>, frequency_>);
static_assert(is_of_type<detail::common_dimension(1 / time, frequency), frequency_>);
static_assert(is_of_type<detail::common_dimension(frequency, 1 / time), frequency_>);
static_assert(length * length != area);
static_assert(interconvertible(length * length, area));
static_assert(length * length != volume);
static_assert(area / length == length);
static_assert(std::is_same_v<std::common_type_t<decltype(length * length), decltype(area)>, area_>);
static_assert(std::is_same_v<std::common_type_t<decltype(area), decltype(length * length)>, area_>);
static_assert(is_of_type<detail::common_dimension(length* length, area), area_>);
static_assert(is_of_type<detail::common_dimension(area, length* length), area_>);
static_assert(length * length * length != volume);
static_assert(area * length != volume);
@@ -197,10 +197,9 @@ static_assert(length * time != speed);
static_assert(length / time / time != speed);
static_assert(length / speed == time);
static_assert(speed * time == length);
static_assert(std::is_same_v<std::common_type_t<decltype(length / time), decltype(speed)>, speed_>);
static_assert(std::is_same_v<std::common_type_t<decltype(speed), decltype(length / time)>, speed_>);
static_assert(
std::is_same_v<std::common_type_t<decltype(length / time), decltype(length / time)>, decltype(length / time)>);
static_assert(is_of_type<detail::common_dimension(length / time, speed), speed_>);
static_assert(is_of_type<detail::common_dimension(speed, length / time), speed_>);
static_assert(is_of_type<detail::common_dimension(length / time, length / time), decltype(length / time)>);
static_assert(length / time / time != acceleration);
static_assert(length / (time * time) != acceleration);
@@ -213,8 +212,8 @@ static_assert(acceleration / speed != frequency);
// comparison of convertible named dimensions
static_assert(velocity != speed);
static_assert(interconvertible(speed, velocity));
static_assert(std::is_same_v<std::common_type_t<decltype(velocity), decltype(speed)>, velocity_>);
static_assert(std::is_same_v<std::common_type_t<decltype(speed), decltype(velocity)>, velocity_>);
static_assert(is_of_type<detail::common_dimension(velocity, speed), velocity_>);
static_assert(is_of_type<detail::common_dimension(speed, velocity), velocity_>);
// comparison of convertible unnamed dimensions
static_assert(is_of_type<mass * acceleration, derived_dimension<length_, mass_, per<units::power<time_, 2>>>>);
+26 -28
View File
@@ -469,35 +469,33 @@ static_assert(
is_of_type<pow<2>(mag<3600>* second), scaled_unit<mag<3600> * mag<3600>, derived_unit<power<second_, 2>>>>);
// common_type
static_assert(std::is_same_v<std::common_type_t<decltype(gram), decltype(gram)>, gram_>);
static_assert(std::is_same_v<std::common_type_t<decltype(kilogram), decltype(kilogram)>, kilogram_>);
static_assert(std::is_same_v<std::common_type_t<decltype(si::kilo<gram>), decltype(kilogram)>, kilogram_>);
static_assert(std::is_same_v<std::common_type_t<decltype(kilogram), decltype(si::kilo<gram>)>, kilogram_>);
static_assert(std::is_same_v<std::common_type_t<decltype(mag<1000> * gram), decltype(kilogram)>, kilogram_>);
static_assert(std::is_same_v<std::common_type_t<decltype(kilogram), decltype(mag<1000> * gram)>, kilogram_>);
static_assert(std::is_same_v<std::common_type_t<decltype(1 / second), decltype(hertz)>, hertz_>);
static_assert(std::is_same_v<std::common_type_t<decltype(hertz), decltype(1 / second)>, hertz_>);
static_assert(std::is_same_v<std::common_type_t<decltype(gram), decltype(kilogram)>, gram_>);
static_assert(std::is_same_v<std::common_type_t<decltype(kilogram), decltype(gram)>, gram_>);
static_assert(std::is_same_v<std::common_type_t<decltype(second), decltype(hour)>, second_>);
static_assert(std::is_same_v<std::common_type_t<decltype(hour), decltype(second)>, second_>);
static_assert(std::is_same_v<std::common_type_t<decltype(minute), decltype(hour)>, minute_>);
static_assert(std::is_same_v<std::common_type_t<decltype(hour), decltype(minute)>, minute_>);
static_assert(std::is_same_v<std::common_type_t<decltype(si::kilo<metre>), decltype(si::milli<metre>)>,
std::remove_const_t<decltype(si::milli<metre>)>>);
static_assert(std::is_same_v<std::common_type_t<decltype(si::milli<metre>), decltype(si::kilo<metre>)>,
std::remove_const_t<decltype(si::milli<metre>)>>);
static_assert(std::is_same_v<std::common_type_t<decltype(yard), decltype(mile)>, yard_>);
static_assert(std::is_same_v<std::common_type_t<decltype(mile), decltype(yard)>, yard_>);
static_assert(is_of_type<detail::common_unit(gram, gram), gram_>);
static_assert(is_of_type<detail::common_unit(kilogram, kilogram), kilogram_>);
static_assert(is_of_type<detail::common_unit(si::kilo<gram>, kilogram), kilogram_>);
static_assert(is_of_type<detail::common_unit(kilogram, si::kilo<gram>), kilogram_>);
static_assert(is_of_type<detail::common_unit(mag<1000>* gram, kilogram), kilogram_>);
static_assert(is_of_type<detail::common_unit(kilogram, mag<1000>* gram), kilogram_>);
static_assert(is_of_type<detail::common_unit(1 / second, hertz), hertz_>);
static_assert(is_of_type<detail::common_unit(hertz, 1 / second), hertz_>);
static_assert(is_of_type<detail::common_unit(gram, kilogram), gram_>);
static_assert(is_of_type<detail::common_unit(kilogram, gram), gram_>);
static_assert(is_of_type<detail::common_unit(second, hour), second_>);
static_assert(is_of_type<detail::common_unit(hour, second), second_>);
static_assert(is_of_type<detail::common_unit(minute, hour), minute_>);
static_assert(is_of_type<detail::common_unit(hour, minute), minute_>);
static_assert(
is_of_type<detail::common_unit(si::kilo<metre>, si::milli<metre>), std::remove_const_t<decltype(si::milli<metre>)>>);
static_assert(
is_of_type<detail::common_unit(si::milli<metre>, si::kilo<metre>), std::remove_const_t<decltype(si::milli<metre>)>>);
static_assert(is_of_type<detail::common_unit(yard, mile), yard_>);
static_assert(is_of_type<detail::common_unit(mile, yard), yard_>);
// TODO The below have long/unreadable magnitude types
static_assert(std::is_same_v<std::common_type_t<decltype(kilometre / hour), decltype(metre / second)>,
scaled_unit<mag<ratio{1, 18}>, derived_unit<metre_, per<second_>>>>);
static_assert(std::is_same_v<std::common_type_t<decltype(metre / second), decltype(kilometre / hour)>,
scaled_unit<mag<ratio{1, 18}>, derived_unit<metre_, per<second_>>>>);
static_assert(
std::is_same_v<std::common_type_t<decltype(kilometre), decltype(mile)>, scaled_unit<mag<ratio{8, 125}>, metre_>>);
static_assert(
std::is_same_v<std::common_type_t<decltype(mile), decltype(kilometre)>, scaled_unit<mag<ratio{8, 125}>, metre_>>);
static_assert(is_of_type<detail::common_unit(kilometre / hour, metre / second),
scaled_unit<mag<ratio{1, 18}>, derived_unit<metre_, per<second_>>>>);
static_assert(is_of_type<detail::common_unit(metre / second, kilometre / hour),
scaled_unit<mag<ratio{1, 18}>, derived_unit<metre_, per<second_>>>>);
static_assert(is_of_type<detail::common_unit(kilometre, mile), scaled_unit<mag<ratio{8, 125}>, metre_>>);
static_assert(is_of_type<detail::common_unit(mile, kilometre), scaled_unit<mag<ratio{8, 125}>, metre_>>);
// unit symbols
#ifdef __cpp_lib_constexpr_string