diff --git a/src/include/units/bits/type_list.h b/src/include/units/bits/type_list.h index 3b014fe9..98275446 100644 --- a/src/include/units/bits/type_list.h +++ b/src/include/units/bits/type_list.h @@ -22,7 +22,7 @@ #pragma once -#include +#include namespace units { @@ -41,29 +41,37 @@ namespace units { // push_front - template - struct type_list_push_front; + namespace detail { - template typename List, typename... OldTypes, typename... NewTypes> - struct type_list_push_front, NewTypes...> { - using type = List; - }; + template + struct type_list_push_front_impl; + + template typename List, typename... OldTypes, typename... NewTypes> + struct type_list_push_front_impl, NewTypes...> { + using type = List; + }; + + } template - using type_list_push_front_t = type_list_push_front::type; + using type_list_push_front = detail::type_list_push_front_impl::type; // push_back - template - struct type_list_push_back; + namespace detail { - template typename List, typename... OldTypes, typename... NewTypes> - struct type_list_push_back, NewTypes...> { - using type = List; - }; + template + struct type_list_push_back_impl; + + template typename List, typename... OldTypes, typename... NewTypes> + struct type_list_push_back_impl, NewTypes...> { + using type = List; + }; + + } template - using type_list_push_back_t = type_list_push_back::type; + using type_list_push_back = detail::type_list_push_back_impl::type; // split @@ -81,10 +89,12 @@ namespace units { template typename List, std::size_t Idx, std::size_t N, typename T, typename... Rest> struct split_impl : split_impl { using base = split_impl; - using base_first = base::first_list; - using base_second = base::second_list; - using first_list = std::conditional_t, base_first>; - using second_list = std::conditional_t>; + using first_list = conditional::type, + typename base::first_list>; + using second_list = conditional::type>; }; } // namespace detail @@ -111,56 +121,65 @@ namespace units { // merge_sorted - template typename Pred> - struct type_list_merge_sorted; + namespace detail { - template typename Pred> - using type_list_merge_sorted_t = type_list_merge_sorted::type; + template typename Pred> + struct type_list_merge_sorted_impl; - template typename List, typename... Lhs, template typename Pred> - struct type_list_merge_sorted, List<>, Pred> { - using type = List; - }; + template typename List, typename... Lhs, template typename Pred> + struct type_list_merge_sorted_impl, List<>, Pred> { + using type = List; + }; - template typename List, typename... Rhs, template typename Pred> - struct type_list_merge_sorted, List, Pred> { - using type = List; - }; + template typename List, typename... Rhs, template typename Pred> + struct type_list_merge_sorted_impl, List, Pred> { + using type = List; + }; + + template typename List, typename Lhs1, typename... LhsRest, typename Rhs1, typename... RhsRest, + template typename Pred> + struct type_list_merge_sorted_impl, List, Pred> { + using type = conditional< + Pred::value, + typename type_list_push_front_impl, List, Pred>::type, Lhs1>::type, + typename type_list_push_front_impl, List, Pred>::type, Rhs1>::type>; + }; + + } + + template typename Pred> + using type_list_merge_sorted = detail::type_list_merge_sorted_impl::type; - template typename List, typename Lhs1, typename... LhsRest, typename Rhs1, typename... RhsRest, - template typename Pred> - struct type_list_merge_sorted, List, Pred> { - using type = std::conditional_t< - Pred::value, - type_list_push_front_t, List, Pred>, Lhs1>, - type_list_push_front_t, List, Pred>, Rhs1>>; - }; // sort - template typename Pred> - struct type_list_sort; + namespace detail { - template typename List, template typename Pred> - struct type_list_sort, Pred> { - using type = List<>; - }; + template typename Pred> + struct type_list_sort_impl; - template typename List, typename T, template typename Pred> - struct type_list_sort, Pred> { - using type = List; - }; + template typename List, template typename Pred> + struct type_list_sort_impl, Pred> { + using type = List<>; + }; - template typename List, typename... Types, template typename Pred> - struct type_list_sort, Pred> { - using types = List; - using split = type_list_split_half>; - using left = type_list_sort::type; - using right = type_list_sort::type; - using type = type_list_merge_sorted_t; - }; + template typename List, typename T, template typename Pred> + struct type_list_sort_impl, Pred> { + using type = List; + }; + + template typename List, typename... Types, template typename Pred> + struct type_list_sort_impl, Pred> { + using types = List; + using split = type_list_split_half>; + using left = type_list_sort_impl::type; + using right = type_list_sort_impl::type; + using type = type_list_merge_sorted_impl::type; + }; + + } template typename Pred> - using type_list_sort_t = type_list_sort::type; + using type_list_sort = detail::type_list_sort_impl::type; -} // namespace units \ No newline at end of file +} // namespace units diff --git a/src/include/units/dimension.h b/src/include/units/dimension.h index c6a8fbf8..e1e0649f 100644 --- a/src/include/units/dimension.h +++ b/src/include/units/dimension.h @@ -142,7 +142,7 @@ namespace units { struct dim_consolidate> { using rest = dim_consolidate_t>; using type = - std::conditional_t>, dimension, type_list_push_front_t>; + std::conditional_t>, dimension, type_list_push_front>; }; template @@ -155,7 +155,7 @@ namespace units { template struct make_dimension { - using type = type_list_sort_t, exp_dim_id_less>>, exp_greater_equal>; + using type = type_list_sort, exp_dim_id_less>>, exp_greater_equal>; }; template @@ -163,7 +163,7 @@ namespace units { template struct merge_dimension { - using type = type_list_sort_t>, exp_greater_equal>; + using type = type_list_sort>, exp_greater_equal>; }; template diff --git a/test/unit_test/test_type_list.cpp b/test/unit_test/test_type_list.cpp index bfc00d62..67f6e55a 100644 --- a/test/unit_test/test_type_list.cpp +++ b/test/unit_test/test_type_list.cpp @@ -32,15 +32,15 @@ namespace { // type_list_push_front - static_assert(std::is_same_v, int>, type_list>); - static_assert(std::is_same_v, int, long, double>, type_list>); - static_assert(std::is_same_v, int, long>, type_list>); + static_assert(std::is_same_v, int>, type_list>); + static_assert(std::is_same_v, int, long, double>, type_list>); + static_assert(std::is_same_v, int, long>, type_list>); // type_list_push_back - static_assert(std::is_same_v, int>, type_list>); - static_assert(std::is_same_v, int, long, double>, type_list>); - static_assert(std::is_same_v, int, long>, type_list>); + static_assert(std::is_same_v, int>, type_list>); + static_assert(std::is_same_v, int, long, double>, type_list>); + static_assert(std::is_same_v, int, long>, type_list>); // type_list_split @@ -83,22 +83,22 @@ namespace { // type_list_merge_sorted - static_assert(std::is_same_v>, type_list>, dim_id_less>, + static_assert(std::is_same_v>, type_list>, dim_id_less>, type_list, dim_id<1>>>); - static_assert(std::is_same_v>, type_list>, dim_id_less>, + static_assert(std::is_same_v>, type_list>, dim_id_less>, type_list, dim_id<1>>>); - static_assert(std::is_same_v, dim_id<38>>, + static_assert(std::is_same_v, dim_id<38>>, type_list, dim_id<43>>, dim_id_less>, type_list, dim_id<27>, dim_id<38>, dim_id<43>>>); static_assert( - std::is_same_v, dim_id<82>>, type_list>, dim_id_less>, + std::is_same_v, dim_id<82>>, type_list>, dim_id_less>, type_list, dim_id<10>, dim_id<82>>>); // type_list_sort template - using dim_sort_t = type_list_sort_t; + using dim_sort_t = type_list_sort; static_assert(std::is_same_v>>, type_list>>); static_assert(std::is_same_v, dim_id<1>>>, type_list, dim_id<1>>>); @@ -113,7 +113,7 @@ namespace { using e = exp, Value>; template - using exp_sort_t = type_list_sort_t; + using exp_sort_t = type_list_sort; static_assert(std::is_same_v>>, dimension>>); static_assert(std::is_same_v, e<1, -1>>>, dimension, e<1, -1>>>);