Additional type list sorting added to make_dimension

This commit is contained in:
Mateusz Pusz
2018-11-17 12:36:27 +01:00
parent 58e1eefd3b
commit 467d548ae5
3 changed files with 13 additions and 7 deletions

View File

@@ -59,10 +59,16 @@ namespace units {
template<typename T>
concept bool Exponent = detail::is_exp<T>;
// exp_less
// exp_dim_id_less
template<Exponent E1, Exponent E2>
struct exp_less : dim_id_less<typename E1::dimension, typename E2::dimension> {
struct exp_dim_id_less : dim_id_less<typename E1::dimension, typename E2::dimension> {
};
// exp_dim_id_less
template<Exponent E1, Exponent E2>
struct exp_greater_equal : std::bool_constant<(E1::value >= E2::value)> {
};
// exp_invert
@@ -158,7 +164,7 @@ namespace units {
template<Exponent... Es>
struct make_dimension {
using type = detail::dim_consolidate_t<mp::type_list_sort_t<dimension<Es...>, exp_less>>;
using type = mp::type_list_sort_t<detail::dim_consolidate_t<mp::type_list_sort_t<dimension<Es...>, exp_dim_id_less>>, exp_greater_equal>;
};
template<Exponent... Es>

View File

@@ -59,7 +59,7 @@ namespace {
static_assert(std::is_same_v<dimension_multiply_t<dimension<e<0, 1>, e<1, 1>, e<2, 1>>, dimension<e<3, 1>>>,
dimension<e<0, 1>, e<1, 1>, e<2, 1>, e<3, 1>>>);
static_assert(std::is_same_v<dimension_multiply_t<dimension<e<0, 1>, e<1, 1>, e<2, 1>>, dimension<e<1, 1>>>,
dimension<e<0, 1>, e<1, 2>, e<2, 1>>>);
dimension<e<1, 2>, e<0, 1>, e<2, 1>>>);
static_assert(std::is_same_v<dimension_multiply_t<dimension<e<0, 1>, e<1, 1>, e<2, 1>>, dimension<e<1, -1>>>,
dimension<e<0, 1>, e<2, 1>>>);

View File

@@ -108,13 +108,13 @@ namespace {
dim_sort_t<type_list<dim_id<38>, dim_id<27>, dim_id<43>, dim_id<3>, dim_id<9>, dim_id<82>, dim_id<10>>>,
type_list<dim_id<3>, dim_id<9>, dim_id<10>, dim_id<27>, dim_id<38>, dim_id<43>, dim_id<82>>>);
// exp_less
// exp_dim_id_less
template<int Id, int Value>
using e = exp<dim_id<Id>, Value>;
template<TypeList List>
using exp_sort_t = type_list_sort_t<List, exp_less>;
using exp_sort_t = type_list_sort_t<List, exp_dim_id_less>;
static_assert(std::is_same_v<exp_sort_t<dimension<e<0, 1>>>, dimension<e<0, 1>>>);
static_assert(std::is_same_v<exp_sort_t<dimension<e<0, 1>, e<1, -1>>>, dimension<e<0, 1>, e<1, -1>>>);