12 #include <type_traits>
20 template <
class T,
class Enabled =
void>
33 template <
class T,
class Enabled>
35 T
operator()(
const T& a,
const T& b,
const double t)
const {
36 return a * (1.0 - t) + b * t;
42 float operator()(
const float& a,
const float& b,
const float t)
const {
43 return a * (1.0f - t) + b * t;
46 float operator()(
const float& a,
const float& b,
const double t)
const {
47 return static_cast<float>(a * (1.0 - t) + b * t);
51 template <
class T, std::
size_t N>
54 using Array = std::array<T, N>;
56 template <std::size_t... I>
57 Array
operator()(
const Array& a,
const Array& b,
const double t, std::index_sequence<I...>) {
62 Array
operator()(
const Array& a,
const Array& b,
const double t) {
63 return operator()(a, b, t, std::make_index_sequence<N>());
67 template <std::
size_t N>
70 using Array = std::array<float, N>;
72 template <std::size_t... I>
73 Array
operator()(
const Array& a,
const Array& b,
const float t, std::index_sequence<I...>) {
78 Array
operator()(
const Array& a,
const Array& b,
const float t) {
79 return operator()(a, b, t, std::make_index_sequence<N>());
94 std::vector<style::expression::Value>
operator()(
const std::vector<style::expression::Value>& a,
95 const std::vector<style::expression::Value>& b,
96 const double t)
const {
97 assert(a.size() == b.size());
98 if (a.empty())
return {};
99 std::vector<style::expression::Value> result;
100 for (std::size_t i = 0; i < a.size(); i++) {
101 assert(a[i].
template is<double>());
102 assert(b[i].
template is<double>());
104 a[i].
template get<double>(),
105 b[i].
template get<double>(),
107 result.push_back(item);
119 pos.setCartesian(interpolated);
152 auto aAngle = std::fmod(a.
getAngle(), period);
153 auto bAngle = std::fmod(b.
getAngle(), period);
155 if (aAngle - bAngle > period * 0.5) {
156 return {std::fmod(aAngle * (1.0 - t) + (bAngle + period) * t, period)};
159 if (aAngle - bAngle < period * -0.5) {
160 return {std::fmod((aAngle + period) * (1.0 - t) + bAngle * t, period)};
163 return {aAngle * (1.0 - t) + bAngle * t};
192 : std::conditional_t<
193 !std::is_base_of_v<Uninterpolated, Interpolator<T>>,
std::array< float, 3 > getCartesian() const
double getAngle() const noexcept
constexpr double period() const noexcept
std::unique_ptr< Expression > string(std::unique_ptr< Expression >, std::unique_ptr< Expression > def=nullptr)
variant< ExponentialInterpolator, CubicBezierInterpolator > Interpolator
float interpolationFactor(float base, Range< float > range, float z)
T interpolate(const T &a, const T &b, const double t)
mapbox::base::Value Value
Color operator()(const Color &a, const Color &b, const float t)
Color operator()(const Color &a, const Color &b, const double t)
float operator()(const float &a, const float &b, const float t) const
float operator()(const float &a, const float &b, const double t) const
style::Position operator()(const style::Position &a, const style::Position &b, const float t)
style::Rotation operator()(const style::Rotation &a, const style::Rotation &b, const double t)
T operator()(const T &a, const T &b, const double t) const
T operator()(const T &a, const T &, const double) const