#ifndef MATH_FUNCTION
#define MATH_FUNCTION

#include <memory>

namespace sleek
{
    namespace math
    {
        template<typename T>
        inline T min(T a, T b)
        {
            return a < b ? a : b;
        }

        template<typename T, typename... Ts>
        inline T min(T a, T b, Ts&&... vs)
        {
            return a < b ?
                min(a, std::forward<Ts>(vs)...) :
                min(b, std::forward<Ts>(vs)...);
        }

        template<typename T>
        inline T max(T a, T b)
        {
            return a > b ? a : b;
        }

        template<typename T, typename... Ts>
        inline T max(T a, T b, Ts&&... vs)
        {
            return a > b ?
                max(a, std::forward<Ts>(vs)...) :
                max(b, std::forward<Ts>(vs)...);
        }

        template<typename T>
        inline T clamp(T value, T _min, T _max)
        {
            if(value < _min)
                return _min;

            if(value > _max)
                return _max;

            return value;
        }
    }
}

#endif