#ifndef MBGL_STYLE_FUNCTION_PROPERTIES #define MBGL_STYLE_FUNCTION_PROPERTIES #include #include namespace mbgl { template struct ConstantFunction { inline ConstantFunction(const T &value) : value(value) {} inline T evaluate(float) const { return value; } private: const T value; }; template struct LinearFunction { inline LinearFunction(const T &value, float z_base, float slope, const T &min, const T &max) : value(value), min(min), max(max), z_base(z_base), slope(slope) {} T evaluate(float z) const; private: const T value, min, max; const float z_base, slope; }; template struct ExponentialFunction { inline ExponentialFunction(const T &value, float z_base, float exp_base, float slope, const T &min, const T &max) : value(value), min(min), max(max), z_base(z_base), exp_base(exp_base), slope(slope) {} T evaluate(float z) const; private: const T value, min, max; const float z_base, exp_base, slope; }; template struct StopsFunction { inline StopsFunction(const std::vector> &values) : values(values) {} T evaluate(float z) const; private: const std::vector> values; }; template using Function = util::variant< std::false_type, ConstantFunction, LinearFunction, ExponentialFunction, StopsFunction >; template struct FunctionEvaluator { typedef T result_type; inline FunctionEvaluator(float z) : z(z) {} inline result_type operator()(const std::false_type &) { return result_type(); } template