25#ifndef TWEENY_DETAIL_EASING_DEF_H
26#define TWEENY_DETAIL_EASING_DEF_H
32namespace tweeny::detail {
33 template <
class...>
struct voidify {
37 template <
class... Ts>
using void_t =
typename voidify<Ts...>::type;
39 template <
class,
class =
void>
40 struct supports_arithmetic_operations : std::false_type {};
43 struct supports_arithmetic_operations<T, void_t<
44 decltype(std::declval<T>() + std::declval<T>()),
45 decltype(std::declval<T>() - std::declval<T>()),
46 decltype(std::declval<T>() * std::declval<T>()),
47 decltype(std::declval<T>() * std::declval<float>()),
48 decltype(std::declval<float>() * std::declval<T>())
49 >> : std::true_type {};
51 struct defaultEasing {
53 static std::enable_if_t<std::is_integral_v<T>, T> run(
float position, T start, T end) {
54 return static_cast<T
>(roundf((end - start) * position + start));
58 static typename std::enable_if<supports_arithmetic_operations<T>::value && !std::is_integral<T>::value, T>::type
59 run(
float position, T start, T end) {
60 return static_cast<T
>((end - start) * position + start);
64 static std::enable_if_t<!supports_arithmetic_operations<T>::value, T> run(
float , T start, T ) {
69 T operator()(
float position, T start, T end)
const {
70 return run<T>(position, start, end);