From 2df86a7f9cdfb4d4670ffc1801953c6c88464a1e Mon Sep 17 00:00:00 2001 From: Joel Falcou Date: Thu, 9 Nov 2023 17:08:51 +0100 Subject: [PATCH] Fixes around constants generation * as_real is available * Add tests for as_real and constants --- include/kyosu/functions/abs.hpp | 4 +- include/kyosu/functions/radinpi.hpp | 4 +- include/kyosu/functions/sqr_abs.hpp | 4 +- include/kyosu/types/cayley_dickson.hpp | 39 ++-- include/kyosu/types/impl/arithmetic.hpp | 4 +- include/kyosu/types/impl/compounds.hpp | 4 +- include/kyosu/types/impl/detail/besselin.hpp | 2 +- include/kyosu/types/impl/detail/besselj0.hpp | 4 +- include/kyosu/types/impl/detail/besselj1.hpp | 4 +- include/kyosu/types/impl/detail/besseljn.hpp | 2 +- include/kyosu/types/impl/faddeeva.hpp | 2 +- include/kyosu/types/impl/special.hpp | 8 +- include/kyosu/types/traits.hpp | 31 ++- test/unit/infra/as_cayley_dickinson.cpp | 200 +++++++++--------- .../infra/{as_real.cpp => as_real_type.cpp} | 12 +- test/unit/infra/constants.cpp | 50 +++++ 16 files changed, 224 insertions(+), 150 deletions(-) rename test/unit/infra/{as_real.cpp => as_real_type.cpp} (54%) create mode 100644 test/unit/infra/constants.cpp diff --git a/include/kyosu/functions/abs.hpp b/include/kyosu/functions/abs.hpp index 6d9abbbb..99c0862f 100644 --- a/include/kyosu/functions/abs.hpp +++ b/include/kyosu/functions/abs.hpp @@ -51,8 +51,8 @@ namespace kyosu //! @code //! namespace kyosu //! { -//! template constexpr as_real_t abs(T z) noexcept; -//! template constexpr T abs(T z) noexcept; +//! template constexpr as_real_type_t abs(T z) noexcept; +//! template constexpr T abs(T z) noexcept; //! } //! @endcode //! diff --git a/include/kyosu/functions/radinpi.hpp b/include/kyosu/functions/radinpi.hpp index 41653cf9..c1eeb2e8 100644 --- a/include/kyosu/functions/radinpi.hpp +++ b/include/kyosu/functions/radinpi.hpp @@ -51,8 +51,8 @@ namespace kyosu //! @code //! namespace kyosu //! { -//! template constexpr as_real_t radinpi(T z) noexcept; -//! template constexpr T radinpi(T z) noexcept; +//! template constexpr as_real_type_t radinpi(T z) noexcept; +//! template constexpr T radinpi(T z) noexcept; //! } //! @endcode //! diff --git a/include/kyosu/functions/sqr_abs.hpp b/include/kyosu/functions/sqr_abs.hpp index 04ab7dd1..962745aa 100644 --- a/include/kyosu/functions/sqr_abs.hpp +++ b/include/kyosu/functions/sqr_abs.hpp @@ -51,8 +51,8 @@ namespace kyosu //! @code //! namespace kyosu //! { -//! template constexpr auto sqr_abs(T z) noexcept; -//! template constexpr auto sqr_abs(T z) noexcept; +//! template constexpr as_real_type_t sqr_abs(T z) noexcept; +//! template constexpr auto sqr_abs(T z) noexcept; //! } //! @endcode //! diff --git a/include/kyosu/types/cayley_dickson.hpp b/include/kyosu/types/cayley_dickson.hpp index c0a7eac9..e38db55f 100644 --- a/include/kyosu/types/cayley_dickson.hpp +++ b/include/kyosu/types/cayley_dickson.hpp @@ -122,9 +122,9 @@ namespace kyosu template constexpr auto get(cayley_dickson const& c) noexcept { return kumi::get(c.contents); } - //================================================================================================================== + //==================================================================================================================== // Main function dispatchers - //================================================================================================================== + //==================================================================================================================== template requires(concepts::cayley_dickson || ... ) KYOSU_FORCEINLINE constexpr auto tag_invoke(eve::callable auto const& f, auto, T&&... c) noexcept @@ -133,9 +133,9 @@ namespace kyosu return _::dispatch(f, KYOSU_FWD(c)...); } - //================================================================================================================== + //==================================================================================================================== // Tag invoke override for if_else - Outside so it can properly deals with the complicated parameters of if_else - //================================================================================================================== + //==================================================================================================================== template requires(concepts::cayley_dickson || concepts::cayley_dickson) KYOSU_FORCEINLINE constexpr auto tag_invoke( eve::tag_of const& fn, auto, auto m @@ -155,9 +155,9 @@ namespace kyosu return _::dispatch(f, c, tgt); } - //================================================================================================================== + //==================================================================================================================== // Tag invoke override for parts extraction - Outside so they can see get(c) - //================================================================================================================== + //==================================================================================================================== template KYOSU_FORCEINLINE constexpr decltype(auto) tag_invoke(T const&, auto, C&& c) noexcept @@ -167,7 +167,7 @@ namespace kyosu if constexpr(T::minimum_valid_index == T::maximum_valid_index) { if constexpr(sz > T::minimum_valid_index) return get(EVE_FWD(c)); - else return as_real_t>{0}; + else return as_real_type_t>{0}; } else { @@ -183,11 +183,22 @@ namespace kyosu } // TODO: Move to tag_invoke when EVE catch up on this front - template - KYOSU_FORCEINLINE constexpr auto tagged_dispatch(Tag const&, eve::as> const&) noexcept + template + KYOSU_FORCEINLINE constexpr auto tagged_dispatch(Tag const&, eve::as const&) noexcept { eve::detail::callable_object cst; - return cayley_dickson( cst(eve::as{}) ); + auto val = cst( eve::as>{} ); + using val_t = std::remove_cvref_t; + + if constexpr(!eve::floating_value) return val; + else return as_cayley_dickson_n_t::static_size,val_t>(val); + } + + template + KYOSU_FORCEINLINE constexpr auto tagged_dispatch(Tag const&, as_real const&) noexcept + { + eve::detail::callable_object cst; + return cst(typename as_real::target_type{}); } //==================================================================================================================== @@ -217,14 +228,6 @@ struct std::tuple_element> using type = T; }; -template -struct eve::supports_like> - : std::bool_constant< kyosu::concepts::cayley_dickson - || std::same_as> - || plain_scalar_value - > -{ -}; #endif #include diff --git a/include/kyosu/types/impl/arithmetic.hpp b/include/kyosu/types/impl/arithmetic.hpp index 31d99e32..b0a4d4f6 100644 --- a/include/kyosu/types/impl/arithmetic.hpp +++ b/include/kyosu/types/impl/arithmetic.hpp @@ -250,7 +250,7 @@ namespace kyosu::_ KYOSU_FORCEINLINE constexpr auto dispatch(eve::tag_of const&, C c) noexcept { - using real_t = eve::as>; + using real_t = eve::as>; constexpr auto P = kyosu::dimension_v; if constexpr (P == 2) return if_else(is_infinite(c) @@ -417,7 +417,7 @@ namespace kyosu::_ { r_t x = convert(xx, eve::as()); auto dfma = /*d*/(fma); - r_t that(eve::zero(eve::as>())); + r_t that(eve::zero(eve::as>())); auto next = [&](auto that, auto arg) { return dfma(x, that, arg); }; ((that = next(that, cs)), ...); return that; diff --git a/include/kyosu/types/impl/compounds.hpp b/include/kyosu/types/impl/compounds.hpp index 58f288a6..5586d9e1 100644 --- a/include/kyosu/types/impl/compounds.hpp +++ b/include/kyosu/types/impl/compounds.hpp @@ -77,7 +77,7 @@ namespace kyosu auto ria = kumi::split(self ,kumi::index); auto rib = kumi::split(other,kumi::index); - using cd_t = as_cayley_dickson_n_t,as_real_t>; + using cd_t = as_cayley_dickson_n_t,as_real_type_t>; cd_t ra{get<0>(ria)}, ia{get<1>(ria)} , rb{get<0>(rib)}, ib{get<1>(rib)}; @@ -91,7 +91,7 @@ namespace kyosu constexpr auto idx = kumi::index; auto ria = kumi::split(self,idx); - using cd_t = as_cayley_dickson_n_t,as_real_t>; + using cd_t = as_cayley_dickson_n_t,as_real_type_t>; cd_t ra{get<0>(ria)}, ia{get<1>(ria)}; self = as_cayley_dickson_t{kumi::cat(ra * other,ia * conj(other))}; } diff --git a/include/kyosu/types/impl/detail/besselin.hpp b/include/kyosu/types/impl/detail/besselin.hpp index 3e33b171..925b7595 100644 --- a/include/kyosu/types/impl/detail/besselin.hpp +++ b/include/kyosu/types/impl/detail/besselin.hpp @@ -19,7 +19,7 @@ namespace kyosu::_ { if constexpr(concepts::complex ) { - using e_t = as_real_t; + using e_t = as_real_type_t; auto miton = [](N n){ if (n%4 == 0) return complex(eve::one(eve::as())); else if (n%4 == 1) return complex(eve::zero(eve::as()), eve::mone(eve::as())); diff --git a/include/kyosu/types/impl/detail/besselj0.hpp b/include/kyosu/types/impl/detail/besselj0.hpp index 3196307f..0fc16f93 100644 --- a/include/kyosu/types/impl/detail/besselj0.hpp +++ b/include/kyosu/types/impl/detail/besselj0.hpp @@ -17,7 +17,7 @@ namespace kyosu::_ { if constexpr(concepts::complex ) { - using e_t = as_real_t; + using e_t = as_real_type_t; using u_t = eve::underlying_type_t; auto saz = kyosu::sqr_abs(z); @@ -110,7 +110,7 @@ namespace kyosu::_ if( eve::any(notdone) ) { - notdone = next_interval(ascending_series_cyl_j0, notdone, saz <= as_real_t(144), r, z); + notdone = next_interval(ascending_series_cyl_j0, notdone, saz <= as_real_type_t(144), r, z); if( eve::any(notdone) ) { last_interval(semiconvergent_series_cyl_j0, notdone, r, z); diff --git a/include/kyosu/types/impl/detail/besselj1.hpp b/include/kyosu/types/impl/detail/besselj1.hpp index 891f6361..599d0aaf 100644 --- a/include/kyosu/types/impl/detail/besselj1.hpp +++ b/include/kyosu/types/impl/detail/besselj1.hpp @@ -17,7 +17,7 @@ namespace kyosu::_ { if constexpr(concepts::complex ) { - using e_t = as_real_t; + using e_t = as_real_type_t; using u_t = eve::underlying_type_t; auto saz = kyosu::sqr_abs(z); @@ -111,7 +111,7 @@ namespace kyosu::_ if( eve::any(notdone) ) { - notdone = next_interval(ascending_series_cyl_j1, notdone, saz <= as_real_t(144), r, z); + notdone = next_interval(ascending_series_cyl_j1, notdone, saz <= as_real_type_t(144), r, z); if( eve::any(notdone) ) { last_interval(semiconvergent_series_cyl_j1, notdone, r, z); diff --git a/include/kyosu/types/impl/detail/besseljn.hpp b/include/kyosu/types/impl/detail/besseljn.hpp index f976dcbf..fd9b484d 100644 --- a/include/kyosu/types/impl/detail/besseljn.hpp +++ b/include/kyosu/types/impl/detail/besseljn.hpp @@ -35,7 +35,7 @@ namespace kyosu::_ } else { - using e_t = as_real_t; + using e_t = as_real_type_t; using u_t = eve::underlying_type_t; auto n = u_t(eve::abs(nn)); auto az = kyosu::abs(z); diff --git a/include/kyosu/types/impl/faddeeva.hpp b/include/kyosu/types/impl/faddeeva.hpp index 16860fcc..93ae5576 100644 --- a/include/kyosu/types/impl/faddeeva.hpp +++ b/include/kyosu/types/impl/faddeeva.hpp @@ -17,7 +17,7 @@ namespace kyosu::_ { if constexpr(concepts::complex ) { - using v_t = as_real_t; + using v_t = as_real_type_t; using real_t = eve::element_type_t; auto const sqrtpi = eve::sqrt_pi(eve::as()); auto const iosqrtpi = complex(real_t(0), eve::rec(sqrtpi)); diff --git a/include/kyosu/types/impl/special.hpp b/include/kyosu/types/impl/special.hpp index 415c2cb7..c1b24774 100644 --- a/include/kyosu/types/impl/special.hpp +++ b/include/kyosu/types/impl/special.hpp @@ -23,7 +23,7 @@ namespace kyosu::_ // 15 sig. digits for 0<=real(z)<=171 // coeffs should sum to about g*g/2+23/24 // - using r_t = eve::element_type_t>; + using r_t = eve::element_type_t>; auto g=r_t(607)/r_t(128); // best results when 4<=g<=5 constexpr int N = 15; @@ -98,7 +98,7 @@ namespace kyosu::_ // 15 sig. digits for 0<=real(z)<=171 // coeffs should sum to about g*g/2+23/24 // - using r_t = eve::element_type_t>; + using r_t = eve::element_type_t>; auto g=r_t(607)/r_t(128); // best results when 4<=g<=5 constexpr int N = 15; @@ -165,7 +165,7 @@ namespace kyosu::_ // 15 sig. digits for 0<=real(z)<=171 // coeffs should sum to about g*g/2+23/24 // - using r_t = eve::element_type_t>; + using r_t = eve::element_type_t>; auto g=r_t(607)/r_t(128); // best results when 4<=g<=5 constexpr int N = 15; @@ -263,7 +263,7 @@ namespace kyosu::_ // 15 sig. digits for 0<=real(z)<=171 // coeffs should sum to about g*g/2+23/24 // - using v_t = kyosu::as_real_t; + using v_t = kyosu::as_real_type_t; using real_t = eve::element_type_t; auto k = real_t(kk); auto [rz, iz] = z; diff --git a/include/kyosu/types/traits.hpp b/include/kyosu/types/traits.hpp index 161f4ae9..46b2739b 100644 --- a/include/kyosu/types/traits.hpp +++ b/include/kyosu/types/traits.hpp @@ -7,6 +7,7 @@ //====================================================================================================================== #pragma once +#include #include namespace kyosu @@ -63,11 +64,11 @@ namespace kyosu template inline constexpr auto dimension_v = eve::element_type_t>::static_size; - template struct as_real { using type = T; }; - template struct as_real> { using type = T; }; - template struct as_real> + template struct as_real_type { using type = T; }; + template struct as_real_type> { using type = T; }; + template struct as_real_type> { - using type = eve::wide::type,N>; + using type = eve::wide::type,N>; }; //==================================================================================================================== @@ -76,7 +77,7 @@ namespace kyosu //! @tparam T Type to convert to a real type. //==================================================================================================================== template - using as_real_t = typename as_real::type; + using as_real_type_t = typename as_real_type::type; template struct as_cayley_dickson_n; @@ -127,6 +128,26 @@ namespace kyosu template using as_cayley_dickson_t = typename as_cayley_dickson::type; + using eve::as; + + //==================================================================================================================== + //! @struct as_real + //! @brief Lightweight type-wrapper of real value type + //! + //! Wraps the real type associed to `T` into a constexpr, trivially constructible empty class to optimize passing type + //! parameters via object instead of via template parameters. + //! + //! @tparam T Type to wrap + //==================================================================================================================== + template struct as_real + { + using type = as_real_type_t; + using target_type = eve::as; + + constexpr as_real() noexcept {} + constexpr as_real(T const&) noexcept {} + }; + //==================================================================================================================== //! @} //==================================================================================================================== diff --git a/test/unit/infra/as_cayley_dickinson.cpp b/test/unit/infra/as_cayley_dickinson.cpp index 9a19c20f..e9cbe52a 100644 --- a/test/unit/infra/as_cayley_dickinson.cpp +++ b/test/unit/infra/as_cayley_dickinson.cpp @@ -8,117 +8,117 @@ #include #include -// TTS_CASE( "Check as_cayley_dickson_n with scalar reals") -// { -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, std::int32_t > ), kyosu::complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, float > ), kyosu::complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, std::int64_t > ), kyosu::complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, double > ), kyosu::complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, std::int32_t > ), kyosu::quaternion ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, float > ), kyosu::quaternion ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, std::int64_t > ), kyosu::quaternion); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, double > ), kyosu::quaternion); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, std::int32_t > ), kyosu::octonion ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, float > ), kyosu::octonion ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, std::int64_t > ), kyosu::octonion ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, double > ), kyosu::octonion ); -// }; +TTS_CASE( "Check as_cayley_dickson_n with scalar reals") +{ + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, std::int32_t > ), kyosu::complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, float > ), kyosu::complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, std::int64_t > ), kyosu::complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, double > ), kyosu::complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, std::int32_t > ), kyosu::quaternion_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, float > ), kyosu::quaternion_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, std::int64_t > ), kyosu::quaternion_t); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, double > ), kyosu::quaternion_t); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, std::int32_t > ), kyosu::octonion_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, float > ), kyosu::octonion_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, std::int64_t > ), kyosu::octonion_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, double > ), kyosu::octonion_t ); +}; -// TTS_CASE( "Check as_cayley_dickson_n with scalar non-reals") -// { -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, kyosu::complex > ), kyosu::complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, kyosu::complex > ), kyosu::complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, kyosu::complex > ), kyosu::quaternion ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, kyosu::complex > ), kyosu::quaternion); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, kyosu::complex > ), kyosu::octonion ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, kyosu::complex > ), kyosu::octonion ); +TTS_CASE( "Check as_cayley_dickson_n with scalar non-reals") +{ + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, kyosu::complex_t > ), kyosu::complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, kyosu::complex_t > ), kyosu::complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, kyosu::complex_t > ), kyosu::quaternion_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, kyosu::complex_t > ), kyosu::quaternion_t); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, kyosu::complex_t > ), kyosu::octonion_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, kyosu::complex_t > ), kyosu::octonion_t ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, kyosu::quaternion > ), kyosu::complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, kyosu::quaternion > ), kyosu::complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, kyosu::quaternion > ), kyosu::quaternion ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, kyosu::quaternion > ), kyosu::quaternion); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, kyosu::quaternion > ), kyosu::octonion ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, kyosu::quaternion > ), kyosu::octonion ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, kyosu::quaternion_t > ), kyosu::complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, kyosu::quaternion_t > ), kyosu::complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, kyosu::quaternion_t > ), kyosu::quaternion_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, kyosu::quaternion_t > ), kyosu::quaternion_t); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, kyosu::quaternion_t > ), kyosu::octonion_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, kyosu::quaternion_t > ), kyosu::octonion_t ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, kyosu::octonion > ), kyosu::complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, kyosu::octonion > ), kyosu::complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, kyosu::octonion > ), kyosu::quaternion ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, kyosu::octonion > ), kyosu::quaternion); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, kyosu::octonion > ), kyosu::octonion ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, kyosu::octonion > ), kyosu::octonion ); -// }; + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, kyosu::octonion_t > ), kyosu::complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, kyosu::octonion_t > ), kyosu::complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, kyosu::octonion_t > ), kyosu::quaternion_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, kyosu::octonion_t > ), kyosu::quaternion_t); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, kyosu::octonion_t > ), kyosu::octonion_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, kyosu::octonion_t > ), kyosu::octonion_t ); +}; -// TTS_CASE( "Check as_cayley_dickson_n with mixed scalar") -// { -// using kyosu::complex; -// using kyosu::quaternion; -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex , complex> ), complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex , int > ), complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex , std::int64_t > ), complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex , float > ), complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex , double > ), complex ); +TTS_CASE( "Check as_cayley_dickson_n with mixed scalar") +{ + using kyosu::complex_t; + using kyosu::quaternion_t; + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex_t , complex_t> ), complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex_t , int > ), complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex_t , std::int64_t > ), complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex_t , float > ), complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex_t , double > ), complex_t ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex , complex> ), complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, int , complex> ), complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, std::int64_t , complex> ), complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, float , complex> ), complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, double , complex> ), complex ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex_t , complex_t> ), complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, int , complex_t> ), complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, std::int64_t , complex_t> ), complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, float , complex_t> ), complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, double , complex_t> ), complex_t ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex, complex>), complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex, int > ), complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex, std::int64_t > ), complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex, float > ), complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex, double > ), complex ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex_t, complex_t>), complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex_t, int > ), complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex_t, std::int64_t > ), complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex_t, float > ), complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex_t, double > ), complex_t ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex, complex> ), complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, int , complex> ), complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, std::int64_t , complex> ), complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, float , complex> ), complex ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, double , complex> ), complex ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, complex_t, complex_t> ), complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, int , complex_t> ), complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, std::int64_t , complex_t> ), complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, float , complex_t> ), complex_t ); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, double , complex_t> ), complex_t ); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, complex, quaternion> ), quaternion ); -// }; + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, complex_t, quaternion_t> ), quaternion_t ); +}; -// TTS_CASE( "Check as_cayley_dickson_n on SIMD reals") -// { -// using eve::wide; +TTS_CASE( "Check as_cayley_dickson_n on SIMD reals") +{ + using eve::wide; -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide> ), wide>); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide> ), wide>); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide> ), wide >); -// }; + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide> ), wide>); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide> ), wide>); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide> ), wide >); +}; -// TTS_CASE( "Check as_cayley_dickson_n on SIMD non-reals") -// { -// using eve::wide; +TTS_CASE( "Check as_cayley_dickson_n on SIMD non-reals") +{ + using eve::wide; -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide >> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide >> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide >> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide >> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide >> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide >> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide >> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide >> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide >> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide >> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide >> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<2, wide >> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide >> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide >> ), wide>); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide >> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide >> ), wide>); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide >> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide >> ), wide>); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide >> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide >> ), wide>); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide >> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide >> ), wide>); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide >> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<4, wide >> ), wide>); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide >> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide >> ), wide>); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide >> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide >> ), wide>); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide >> ), wide >); -// TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide >> ), wide>); -// }; + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide >> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide >> ), wide>); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide >> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide >> ), wide>); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide >> ), wide >); + TTS_TYPE_IS((kyosu::as_cayley_dickson_n_t<8, wide >> ), wide>); +}; diff --git a/test/unit/infra/as_real.cpp b/test/unit/infra/as_real_type.cpp similarity index 54% rename from test/unit/infra/as_real.cpp rename to test/unit/infra/as_real_type.cpp index 8382e339..a7cfde69 100644 --- a/test/unit/infra/as_real.cpp +++ b/test/unit/infra/as_real_type.cpp @@ -8,16 +8,16 @@ #include #include -TTS_CASE_TPL( "Check as_real behavior on real types", kyosu::real_types) +TTS_CASE_TPL( "Check as_real_type_t behavior on real types", kyosu::real_types) (tts::type) { - TTS_TYPE_IS(kyosu::as_real_t, T); + TTS_TYPE_IS(kyosu::as_real_type_t, T); }; -TTS_CASE_TPL( "Check as_real behavior on non-real types", kyosu::real_types) +TTS_CASE_TPL( "Check as_real_type_t behavior on non-real types", kyosu::real_types) (tts::type) { - TTS_TYPE_IS(kyosu::as_real_t> , T); - TTS_TYPE_IS(kyosu::as_real_t> , T); - TTS_TYPE_IS(kyosu::as_real_t> , T); + TTS_TYPE_IS(kyosu::as_real_type_t> , T); + TTS_TYPE_IS(kyosu::as_real_type_t> , T); + TTS_TYPE_IS(kyosu::as_real_type_t> , T); }; diff --git a/test/unit/infra/constants.cpp b/test/unit/infra/constants.cpp new file mode 100644 index 00000000..2f65cd60 --- /dev/null +++ b/test/unit/infra/constants.cpp @@ -0,0 +1,50 @@ +//====================================================================================================================== +/* + Kyosu - Complex Without Complexes + Copyright : KYOSU Contributors & Maintainers + SPDX-License-Identifier: BSL-1.0 +*/ +//====================================================================================================================== +#include +#include + +TTS_CASE_TPL( "Check as_real behavior on real types", kyosu::real_types) +(tts::type) +{ + T x = {}; + + TTS_EQUAL(eve::half(kyosu::as_real{}), T{0.5}); + TTS_EQUAL(eve::half(kyosu::as_real(x)), T{0.5}); +}; + +TTS_CASE_TPL( "Check as_real behavior on non-real types", kyosu::real_types) +(tts::type) +{ + kyosu::complex_t cx = {}; + kyosu::quaternion_t qx = {}; + kyosu::octonion_t ox = {}; + + TTS_EQUAL(eve::half(kyosu::as_real>{}), T{0.5}); + TTS_EQUAL(eve::half(kyosu::as_real>{}), T{0.5}); + TTS_EQUAL(eve::half(kyosu::as_real>{}), T{0.5}); + + TTS_EQUAL(eve::half(kyosu::as_real(cx)), T{0.5}); + TTS_EQUAL(eve::half(kyosu::as_real(qx)), T{0.5}); + TTS_EQUAL(eve::half(kyosu::as_real(ox)), T{0.5}); +}; + +TTS_CASE_TPL( "Check as behavior on non-real types", kyosu::real_types) +(tts::type) +{ + kyosu::complex_t cx = {}; + kyosu::quaternion_t qx = {}; + kyosu::octonion_t ox = {}; + + TTS_EQUAL(eve::half(kyosu::as>{}) , kyosu::complex_t(0.5)); + TTS_EQUAL(eve::half(kyosu::as>{}), kyosu::quaternion_t{0.5}); + TTS_EQUAL(eve::half(kyosu::as>{}) , kyosu::octonion_t{0.5}); + + TTS_EQUAL(eve::half(kyosu::as(cx)),kyosu::complex_t(0.5)); + TTS_EQUAL(eve::half(kyosu::as(qx)),kyosu::quaternion_t{0.5}); + TTS_EQUAL(eve::half(kyosu::as(ox)),kyosu::octonion_t{0.5}); +};