31 #ifndef TWEENY_EASINGRESOLVE_H
32 #define TWEENY_EASINGRESOLVE_H
41 template<
int I,
typename TypeTuple,
typename FunctionTuple,
typename... Fs>
42 struct easingresolve {
43 static void impl(FunctionTuple &b, Fs... fs) {
44 if (
sizeof...(Fs) == 0)
return;
45 easingresolve<I, TypeTuple, FunctionTuple, Fs...>::impl(b, fs...);
49 template<
int I,
typename TypeTuple,
typename FunctionTuple,
typename F1,
typename... Fs>
50 struct easingresolve<I, TypeTuple, FunctionTuple, F1, Fs...> {
51 static void impl(FunctionTuple &b, F1 f1, Fs... fs) {
53 easingresolve<I + 1, TypeTuple, FunctionTuple, Fs...>::impl(b, fs...);
57 template<
int I,
typename TypeTuple,
typename FunctionTuple,
typename... Fs>
58 struct easingresolve<I, TypeTuple, FunctionTuple, easing::linearEasing, Fs...> {
59 typedef typename std::tuple_element<I, TypeTuple>::type ArgType;
61 static void impl(FunctionTuple &b, easing::linearEasing, Fs... fs) {
62 get<I>(b) = easing::linear.run<ArgType>;
63 easingresolve<I + 1, TypeTuple, FunctionTuple, Fs...>::impl(b, fs...);
67 #define DECLARE_EASING_RESOLVE(__EASING_TYPE__) \
68 template <int I, typename TypeTuple, typename FunctionTuple, typename... Fs> \
69 struct easingresolve<I, TypeTuple, FunctionTuple, easing::__EASING_TYPE__ ## InEasing, Fs...> { \
70 typedef typename std::tuple_element<I, TypeTuple>::type ArgType; \
71 static void impl(FunctionTuple & b, decltype(easing::__EASING_TYPE__ ## In), Fs... fs) { \
72 get<I>(b) = easing::__EASING_TYPE__ ## In.run<ArgType>; \
73 easingresolve<I+1, TypeTuple, FunctionTuple, Fs...>::impl(b, fs...); \
77 template <int I, typename TypeTuple, typename FunctionTuple, typename... Fs> \
78 struct easingresolve<I, TypeTuple, FunctionTuple, easing::__EASING_TYPE__ ## OutEasing, Fs...> { \
79 typedef typename std::tuple_element<I, TypeTuple>::type ArgType; \
80 static void impl(FunctionTuple & b, decltype(easing::__EASING_TYPE__ ## Out), Fs... fs) { \
81 get<I>(b) = easing::__EASING_TYPE__ ## Out.run<ArgType>; \
82 easingresolve<I+1, TypeTuple, FunctionTuple, Fs...>::impl(b, fs...); \
86 template <int I, typename TypeTuple, typename FunctionTuple, typename... Fs> \
87 struct easingresolve<I, TypeTuple, FunctionTuple, easing::__EASING_TYPE__ ## InOutEasing, Fs...> { \
88 typedef typename std::tuple_element<I, TypeTuple>::type ArgType; \
89 static void impl(FunctionTuple & b, decltype(easing::__EASING_TYPE__ ## InOut), Fs... fs) { \
90 get<I>(b) = easing::__EASING_TYPE__ ## InOut.run<ArgType>; \
91 easingresolve<I+1, TypeTuple, FunctionTuple, Fs...>::impl(b, fs...); \
95 DECLARE_EASING_RESOLVE(quadratic);
96 DECLARE_EASING_RESOLVE(cubic);
97 DECLARE_EASING_RESOLVE(quartic);
98 DECLARE_EASING_RESOLVE(quintic);
99 DECLARE_EASING_RESOLVE(sinusoidal);
100 DECLARE_EASING_RESOLVE(exponential);
101 DECLARE_EASING_RESOLVE(circular);
102 DECLARE_EASING_RESOLVE(bounce);
103 DECLARE_EASING_RESOLVE(elastic);
104 DECLARE_EASING_RESOLVE(back);
108 #endif //TWEENY_EASINGRESOLVE_H