3#include <dsplib/types.h>
11template<
bool Cond_,
typename Iftrue_,
typename Iffalse_>
12using conditional_t =
typename std::conditional_t<Cond_, Iftrue_, Iffalse_>;
15template<
typename T1,
typename T2>
16constexpr auto reduce_operator_type() noexcept {
17 using T1_ = std::remove_reference_t<T1>;
18 using T2_ = std::remove_reference_t<T2>;
19 if constexpr (is_scalar_v<T1_> && is_scalar_v<T2_>) {
20 if constexpr (is_complex_v<T1_> || is_complex_v<T2_>) {
25 }
else if constexpr (!is_scalar_v<T1_> && !is_scalar_v<T2_>) {
26 using R1 = std::remove_reference_t<decltype(std::declval<T1_>()[0])>;
27 using R2 = std::remove_reference_t<decltype(std::declval<T2_>()[0])>;
28 return reduce_operator_type<R1, R2>();
29 }
else if constexpr (!is_scalar_v<T1_>) {
30 using R1 = std::remove_reference_t<decltype(std::declval<T1_>()[0])>;
31 return reduce_operator_type<R1, T2_>();
33 using R2 = std::remove_reference_t<decltype(std::declval<T2_>()[0])>;
34 return reduce_operator_type<T1_, R2>();
38template<
typename T1,
typename T2>
39using ResultType =
decltype(reduce_operator_type<T1, T2>());
43template<
typename T_src,
typename T_dst>
44constexpr bool is_array_convertible() noexcept {
45 if constexpr (!std::is_convertible_v<T_src, T_dst>) {
50 if constexpr (!is_scalar_v<T_src> || !is_scalar_v<T_dst>) {
55 if constexpr (is_complex_v<T_src> && !is_complex_v<T_dst>) {
60 if constexpr (!is_complex_v<T_src> && is_complex_v<T_dst>) {
65 if constexpr (std::is_floating_point_v<T_src> && std::is_integral_v<T_dst>) {
73constexpr bool support_type_for_array() {
74 using U = std::remove_cv_t<T>;
75 if constexpr (std::is_same_v<U, real_t>) {
78 if constexpr (std::is_same_v<U, cmplx_t>) {
81 if constexpr (std::is_same_v<U, int>) {