diff --git a/src/core/include/units/bits/external/type_list.h b/src/core/include/units/bits/external/type_list.h index 3eddfcfe..88f52a87 100644 --- a/src/core/include/units/bits/external/type_list.h +++ b/src/core/include/units/bits/external/type_list.h @@ -24,6 +24,7 @@ #include // IWYU pragma: keep #include +#include UNITS_DIAGNOSTIC_PUSH UNITS_DIAGNOSTIC_IGNORE_EXPR_ALWAYS_TF @@ -47,16 +48,16 @@ concept TypeList = detail::is_type_list; namespace detail { -template typename List, typename... Ts> -consteval std::size_t type_list_size_impl(List) -{ - return sizeof...(Ts); -} +template +struct type_list_size_impl; + +template typename List, typename... Types> +struct type_list_size_impl> : std::integral_constant {}; } // namespace detail template -inline constexpr std::size_t type_list_size = detail::type_list_size_impl(List{}); +inline constexpr std::size_t type_list_size = detail::type_list_size_impl::value; // front diff --git a/test/unit_test/static/CMakeLists.txt b/test/unit_test/static/CMakeLists.txt index 5d48f53d..587f824d 100644 --- a/test/unit_test/static/CMakeLists.txt +++ b/test/unit_test/static/CMakeLists.txt @@ -53,14 +53,14 @@ add_library( # math_test.cpp # point_origin_test.cpp # prime_test.cpp - # ratio_test.cpp + ratio_test.cpp # references_test.cpp # si_test.cpp # si_cgs_test.cpp # si_fps_test.cpp # si_hep_test.cpp # symbol_text_test.cpp - # type_list_test.cpp + type_list_test.cpp unit_test.cpp # us_test.cpp diff --git a/test/unit_test/static/type_list_test.cpp b/test/unit_test/static/type_list_test.cpp index 81f39586..81742907 100644 --- a/test/unit_test/static/type_list_test.cpp +++ b/test/unit_test/static/type_list_test.cpp @@ -20,10 +20,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. -#include #include -#include -#include +#include namespace { @@ -32,6 +30,29 @@ using namespace units; template struct type_list; +// TypeList + +static_assert(TypeList>); +static_assert(TypeList>); +static_assert(TypeList>); + +// type_list_size + +static_assert(type_list_size> == 0); +static_assert(type_list_size> == 1); +static_assert(type_list_size> == 2); +static_assert(type_list_size> == 3); + +// type_list_front + +template typename List> +concept type_list_front_invalid_for_empty_list = !requires { typename type_list_front>; }; + +static_assert(type_list_front_invalid_for_empty_list); +static_assert(is_same_v>, int>); +static_assert(is_same_v>, long>); +static_assert(is_same_v>, float>); + // type_list_push_front static_assert(is_same_v, int>, type_list>); @@ -55,6 +76,15 @@ static_assert( static_assert(is_same_v, type_list, type_list>, type_list>); +// type_list_join +static_assert(is_same_v, type_list<>>, type_list<>>); +static_assert(is_same_v, type_list<>>, type_list>); +static_assert(is_same_v, type_list>, type_list>); +static_assert(is_same_v, type_list>, type_list>); +static_assert(is_same_v, type_list>, type_list>); +static_assert( + is_same_v, type_list>, type_list>); + // type_list_split static_assert(is_same_v, 0>::first_list, type_list<>>); @@ -93,28 +123,46 @@ static_assert(is_same_v static_assert( is_same_v>::second_list, type_list>); -// type_list_merge_sorted -struct u0 : named_unit {}; -struct d0 : base_dimension<"d0", u0> {}; -struct u1 : named_unit {}; -struct d1 : base_dimension<"d1", u1> {}; +template +struct constant { + static constexpr auto value = V; +}; +struct v1 : constant<1> {}; +struct v2 : constant<2> {}; +struct v3 : constant<3> {}; +struct v4 : constant<4> {}; + +template +struct constant_less : std::bool_constant<(T1::value < T2::value)> {}; + +// type_list_merge_sorted + +static_assert(is_same_v, type_list<>, constant_less>, type_list<>>); +static_assert(is_same_v, type_list<>, constant_less>, type_list>); +static_assert(is_same_v, type_list, constant_less>, type_list>); +static_assert(is_same_v, type_list, constant_less>, type_list>); static_assert( - is_same_v>, type_list>, exponent_less>, - type_list, units::exponent>>); -static_assert( - is_same_v>, type_list>, exponent_less>, - type_list, units::exponent>>); + is_same_v, type_list, constant_less>, type_list>); +static_assert(is_same_v, type_list, constant_less>, + type_list>); // type_list_sort -template -using exp_sort = type_list_sort; +static_assert(is_same_v, constant_less>, type_list<>>); +static_assert(is_same_v, constant_less>, type_list>); +static_assert(is_same_v, constant_less>, type_list>); +static_assert(is_same_v, constant_less>, type_list>); +static_assert(is_same_v, constant_less>, type_list>); +static_assert(is_same_v, constant_less>, type_list>); -static_assert(is_same_v>>, exponent_list>>); -static_assert(is_same_v, units::exponent>>, - exponent_list, units::exponent>>); -static_assert(is_same_v, units::exponent>>, - exponent_list, units::exponent>>); +// type_list_map + +template +struct other_list; + +static_assert(is_same_v, other_list>, other_list<>>); +static_assert(is_same_v, other_list>, other_list>); +static_assert(is_same_v, other_list>, other_list>); } // namespace