Updates for 3.4 release. (#1305)
This commit is contained in:
@@ -413,6 +413,19 @@ conditional_return(TrueType const& t, FalseType const& f) {
|
||||
}
|
||||
}
|
||||
|
||||
template <class Trait>
|
||||
CUTE_HOST_DEVICE constexpr
|
||||
auto
|
||||
static_value()
|
||||
{
|
||||
if constexpr (is_std_integral<decltype(Trait::value)>::value) {
|
||||
return Int<Trait::value>{};
|
||||
} else {
|
||||
return Trait::value;
|
||||
}
|
||||
CUTE_GCC_UNREACHABLE;
|
||||
}
|
||||
|
||||
//
|
||||
// Display utilities
|
||||
//
|
||||
|
||||
@@ -65,6 +65,11 @@ class R {
|
||||
using type = typename conditional<num == 0 || den == 1, C<num>, R<num,den>>::type;
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct is_ratio : false_type {};
|
||||
template <auto n, auto d>
|
||||
struct is_ratio<R<n,d>> : true_type {};
|
||||
|
||||
template <auto a, auto b>
|
||||
CUTE_HOST_DEVICE constexpr
|
||||
typename R<a,b>::type
|
||||
@@ -72,6 +77,59 @@ ratio(C<a>, C<b>) {
|
||||
return {};
|
||||
}
|
||||
|
||||
template <auto a, auto b, auto c>
|
||||
CUTE_HOST_DEVICE constexpr
|
||||
typename R<a*c,b>::type
|
||||
ratio(C<a>, R<b,c>) {
|
||||
return {};
|
||||
}
|
||||
|
||||
template <auto a, auto b, auto c>
|
||||
CUTE_HOST_DEVICE constexpr
|
||||
typename R<b,a*c>::type
|
||||
ratio(R<b,c>, C<a>) {
|
||||
return {};
|
||||
}
|
||||
|
||||
template <auto a, auto b, auto c, auto d>
|
||||
CUTE_HOST_DEVICE constexpr
|
||||
typename R<a*d,b*c>::type
|
||||
ratio(R<a,b>, R<c,d>) {
|
||||
return {};
|
||||
}
|
||||
|
||||
//
|
||||
// Non-reduced ratio implementations
|
||||
//
|
||||
|
||||
template <auto a, auto b>
|
||||
CUTE_HOST_DEVICE constexpr
|
||||
R<a,b>
|
||||
nratio(C<a>, C<b>) {
|
||||
return {};
|
||||
}
|
||||
|
||||
template <auto a, auto b, auto c>
|
||||
CUTE_HOST_DEVICE constexpr
|
||||
R<a*c,b>
|
||||
nratio(C<a>, R<b,c>) {
|
||||
return {};
|
||||
}
|
||||
|
||||
template <auto a, auto b, auto c>
|
||||
CUTE_HOST_DEVICE constexpr
|
||||
R<b,a*c>
|
||||
nratio(R<b,c>, C<a>) {
|
||||
return {};
|
||||
}
|
||||
|
||||
template <auto a, auto b, auto c, auto d>
|
||||
CUTE_HOST_DEVICE constexpr
|
||||
R<a*d,b*c>
|
||||
nratio(R<a,b>, R<c,d>) {
|
||||
return {};
|
||||
}
|
||||
|
||||
template <auto a, auto b, auto x, auto y>
|
||||
CUTE_HOST_DEVICE constexpr
|
||||
typename R<a*x,b*y>::type
|
||||
@@ -93,6 +151,13 @@ operator*(C<c>, R<a,b>) {
|
||||
return {};
|
||||
}
|
||||
|
||||
template <auto c, auto a, auto b>
|
||||
CUTE_HOST_DEVICE constexpr
|
||||
typename R<c*b,a>::type
|
||||
operator/(C<c>, R<a,b>) {
|
||||
return {};
|
||||
}
|
||||
|
||||
// Product with dynamic type needs to produce an integer...
|
||||
template <class C, auto a, auto b,
|
||||
__CUTE_REQUIRES(cute::is_std_integral<C>::value)>
|
||||
@@ -160,6 +225,23 @@ abs(R<a,b>) {
|
||||
return {};
|
||||
}
|
||||
|
||||
template <auto a, auto b>
|
||||
CUTE_HOST_DEVICE constexpr
|
||||
auto
|
||||
log_2(R<a,b>) {
|
||||
static_assert(R<a,b>::num > 0);
|
||||
static_assert(R<a,b>::den > 0);
|
||||
return log_2(static_cast<uint32_t>(R<a,b>::num)) - log_2(static_cast<uint32_t>(R<a,b>::den));
|
||||
}
|
||||
|
||||
|
||||
template <class Trait0, class Trait1>
|
||||
CUTE_HOST_DEVICE constexpr
|
||||
auto
|
||||
trait_ratio(Trait0, Trait1) {
|
||||
return nratio(static_value<Trait0>(), static_value<Trait1>());
|
||||
}
|
||||
|
||||
//
|
||||
// Display utilities
|
||||
//
|
||||
|
||||
@@ -310,4 +310,17 @@ safe_div(T const& t, U const& u) {
|
||||
return t / u;
|
||||
}
|
||||
|
||||
/**
|
||||
* log2 computation
|
||||
*/
|
||||
|
||||
template <class T>
|
||||
CUTE_HOST_DEVICE constexpr
|
||||
auto
|
||||
log_2(T x) {
|
||||
assert(x > 0);
|
||||
static_assert(is_unsigned<T>::value, "Only to be used for unsigned integral types.");
|
||||
return bit_width(x) - 1;
|
||||
}
|
||||
|
||||
} // namespace cute
|
||||
|
||||
Reference in New Issue
Block a user