7#include <stratax/core/dtypes/DTypeTraits.hpp>
9namespace stratax::core {
20template<
typename L,
typename R>
40template<
typename L,
typename R>
47 using type = std::conditional_t<
57template<
typename L,
typename R>
64 using type = std::conditional_t<
78template<
typename L,
typename R>
80 (DTypeTraits<L>::kind == DTypeKind::SignedInteger &&
81 DTypeTraits<R>::kind == DTypeKind::UnsignedInteger) ||
82 (DTypeTraits<L>::kind == DTypeKind::UnsignedInteger &&
83 DTypeTraits<R>::kind == DTypeKind::SignedInteger)
88 using signed_type = std::conditional_t<
89 DTypeTraits<L>::kind == DTypeKind::SignedInteger,
94 using unsigned_type = std::conditional_t<
95 DTypeTraits<L>::kind == DTypeKind::UnsignedInteger,
100 static constexpr std::size_t signed_bits =
101 DTypeTraits<signed_type>::bits;
103 static constexpr std::size_t unsigned_bits =
104 DTypeTraits<unsigned_type>::bits;
110 static constexpr std::size_t required_bits =
111 signed_bits > unsigned_bits
116 using type = std::conditional_t<
117 (required_bits <= 8),
120 (required_bits <= 16),
123 (required_bits <= 32),
126 (required_bits <= 64),
142template<
typename L,
typename R>
145 (DTypeTraits<L>::kind == DTypeKind::SignedInteger ||
146 DTypeTraits<L>::kind == DTypeKind::UnsignedInteger) &&
147 DTypeTraits<R>::kind == DTypeKind::Floating
150 DTypeTraits<L>::kind == DTypeKind::Floating &&
151 (DTypeTraits<R>::kind == DTypeKind::SignedInteger ||
152 DTypeTraits<R>::kind == DTypeKind::UnsignedInteger)
158 using integer_type = std::conditional_t<
159 DTypeTraits<L>::kind == DTypeKind::SignedInteger ||
160 DTypeTraits<L>::kind == DTypeKind::UnsignedInteger,
165 using floating_type = std::conditional_t<
166 DTypeTraits<L>::kind == DTypeKind::Floating,
171 static constexpr int integer_digits =
172 DTypeTraits<integer_type>::digits;
174 static constexpr int floating_digits =
175 DTypeTraits<floating_type>::digits;
178 using type = std::conditional_t<
179 (integer_digits <= floating_digits),
182 std::same_as<floating_type, dtype::float32>,
193template<
typename L,
typename R>
195 DTypeTraits<L>::kind == DTypeKind::Floating &&
196 DTypeTraits<R>::kind == DTypeKind::Floating
200 using type = std::conditional_t<
201 (DTypeTraits<L>::rank >= DTypeTraits<R>::rank),
210template<
typename L,
typename R>
212 DTypeTraits<L>::kind == DTypeKind::Complex &&
213 DTypeTraits<R>::kind == DTypeKind::Complex
218 using left_component =
219 complex_component_t<L>;
221 using right_component =
222 complex_component_t<R>;
224 using promoted_component =
225 typename Promote<left_component, right_component>::type;
229 complex_from_real_t<promoted_component>;
239template<
typename L,
typename R>
242 (DTypeTraits<L>::kind == DTypeKind::SignedInteger ||
243 DTypeTraits<L>::kind == DTypeKind::UnsignedInteger ||
244 DTypeTraits<L>::kind == DTypeKind::Floating) &&
245 DTypeTraits<R>::kind == DTypeKind::Complex
248 DTypeTraits<L>::kind == DTypeKind::Complex &&
249 (DTypeTraits<R>::kind == DTypeKind::SignedInteger ||
250 DTypeTraits<R>::kind == DTypeKind::UnsignedInteger ||
251 DTypeTraits<R>::kind == DTypeKind::Floating)
257 using real_type = std::conditional_t<
258 DTypeTraits<L>::kind == DTypeKind::Complex,
263 using complex_type = std::conditional_t<
264 DTypeTraits<L>::kind == DTypeKind::Complex,
269 using component_type =
270 complex_component_t<complex_type>;
272 using promoted_component =
273 typename Promote<real_type, component_type>::type;
277 complex_from_real_t<promoted_component>;
285template<
typename L,
typename R>
286using promote_t =
typename Promote<
287 std::remove_cvref_t<L>,
288 std::remove_cvref_t<R>
Provides compile-time metadata for a supported Stratax dtype.