///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2008 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2007-03-14
// Updated : 2007-08-14
// Licence : This source is under MIT License
// File    : gtx_extented_min_max.h
///////////////////////////////////////////////////////////////////////////////////////////////////
// Dependency:
// - GLM core
// - GLM_GTX_half
// - GLM_GTX_double
///////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef glm_gtx_extented_min_max
#define glm_gtx_extented_min_max

// Dependency:
#include "../../glm.h"
#include "../gtx/half_float.h"
#include "../gtx/double_float.h"

namespace glm
{
   	namespace test{
		void main_ext_gtx_extented_min_max();
	}//namespace test

	template <typename T> T minGTX(const T x, const T y, const T z);
	template <typename T> T minGTX(const T x, const T y, const T z, const T w);

	template <typename T> detail::tvec2<T> minGTX(const detail::tvec2<T>& x, const T y, const T z);
    template <typename T> detail::tvec3<T> minGTX(const detail::tvec3<T>& x, const T y, const T z);
    template <typename T> detail::tvec4<T> minGTX(const detail::tvec4<T>& x, const T y, const T z);

    template <typename T> detail::tvec2<T> minGTX(const detail::tvec2<T>& x, const T y, const T z, const T w);
    template <typename T> detail::tvec3<T> minGTX(const detail::tvec3<T>& x, const T y, const T z, const T w);
    template <typename T> detail::tvec4<T> minGTX(const detail::tvec4<T>& x, const T y, const T z, const T w);

    template <typename T> detail::tvec2<T> minGTX(const detail::tvec2<T>& x, const detail::tvec2<T>& y, const detail::tvec2<T>& z);
    template <typename T> detail::tvec3<T> minGTX(const detail::tvec3<T>& x, const detail::tvec3<T>& y, const detail::tvec3<T>& z);
    template <typename T> detail::tvec4<T> minGTX(const detail::tvec4<T>& x, const detail::tvec4<T>& y, const detail::tvec4<T>& z);

    template <typename T> detail::tvec2<T> minGTX(const detail::tvec2<T>& x, const detail::tvec2<T>& y, const detail::tvec2<T>& z, const detail::tvec2<T>& w);
    template <typename T> detail::tvec3<T> minGTX(const detail::tvec3<T>& x, const detail::tvec3<T>& y, const detail::tvec3<T>& z, const detail::tvec3<T>& w);
    template <typename T> detail::tvec4<T> minGTX(const detail::tvec4<T>& x, const detail::tvec4<T>& y, const detail::tvec4<T>& z, const detail::tvec4<T>& w);

	template <typename T> T maxGTX(const T x, const T y, const T z);
	template <typename T> T maxGTX(const T x, const T y, const T z, const T w);

	template <typename T> detail::tvec2<T> maxGTX(const detail::tvec2<T>& x, const T y, const T z);
    template <typename T> detail::tvec3<T> maxGTX(const detail::tvec3<T>& x, const T y, const T z);
    template <typename T> detail::tvec4<T> maxGTX(const detail::tvec4<T>& x, const T y, const T z);

    template <typename T> detail::tvec2<T> maxGTX(const detail::tvec2<T>& x, const T y, const T z, const T w);
    template <typename T> detail::tvec3<T> maxGTX(const detail::tvec3<T>& x, const T y, const T z, const T w);
    template <typename T> detail::tvec4<T> maxGTX(const detail::tvec4<T>& x, const T y, const T z, const T w);

    template <typename T> detail::tvec2<T> maxGTX(const detail::tvec2<T>& x, const detail::tvec2<T>& y, const detail::tvec2<T>& z);
    template <typename T> detail::tvec3<T> maxGTX(const detail::tvec3<T>& x, const detail::tvec3<T>& y, const detail::tvec3<T>& z);
    template <typename T> detail::tvec4<T> maxGTX(const detail::tvec4<T>& x, const detail::tvec4<T>& y, const detail::tvec4<T>& z);

    template <typename T> detail::tvec2<T> maxGTX(const detail::tvec2<T>& x, const detail::tvec2<T>& y, const detail::tvec2<T>& z, const detail::tvec2<T>& w);
    template <typename T> detail::tvec3<T> maxGTX(const detail::tvec3<T>& x, const detail::tvec3<T>& y, const detail::tvec3<T>& z, const detail::tvec3<T>& w);
    template <typename T> detail::tvec4<T> maxGTX(const detail::tvec4<T>& x, const detail::tvec4<T>& y, const detail::tvec4<T>& z, const detail::tvec4<T>& w);

	namespace gtx{
	//! GLM_GTX_extented_min_max extension: Min and max functions for 3 to 4 parameters.
	namespace extented_min_max
	{
		template <typename T> inline T min(const T x, const T y, const T z){return minGTX(x, y, z);} //!< \brief Return the minimum component-wise values of 3 imputs (From GLM_GTX_extented_min_max extension)
		template <typename T> inline T min(const T x, const T y, const T z, const T w){return minGTX(x, y, z, w);} //!< \brief Return the minimum component-wise values of 3 imputs (From GLM_GTX_extented_min_max extension)

		template <typename T> inline detail::tvec2<T> min(const detail::tvec2<T>& x, const T y, const T z){return minGTX(x, y, z);} //!< \brief Return the minimum component-wise values of 3 imputs (From GLM_GTX_extented_min_max extension)
		template <typename T> inline detail::tvec3<T> min(const detail::tvec3<T>& x, const T y, const T z){return minGTX(x, y, z);} //!< \brief Return the minimum component-wise values of 3 imputs (From GLM_GTX_extented_min_max extension)
		template <typename T> inline detail::tvec4<T> min(const detail::tvec4<T>& x, const T y, const T z){return minGTX(x, y, z);} //!< \brief Return the minimum component-wise values of 3 imputs (From GLM_GTX_extented_min_max extension)

		template <typename T> inline detail::tvec2<T> min(const detail::tvec2<T>& x, const T y, const T z, const T w){return minGTX(x, y, z, w);} //!< \brief Return the minimum component-wise values of 4 imputs (From GLM_GTX_extented_min_max extension)
		template <typename T> inline detail::tvec3<T> min(const detail::tvec3<T>& x, const T y, const T z, const T w){return minGTX(x, y, z, w);} //!< \brief Return the minimum component-wise values of 4 imputs (From GLM_GTX_extented_min_max extension)
		template <typename T> inline detail::tvec4<T> min(const detail::tvec4<T>& x, const T y, const T z, const T w){return minGTX(x, y, z, w);} //!< \brief Return the minimum component-wise values of 4 imputs (From GLM_GTX_extented_min_max extension)

		template <typename T> inline detail::tvec2<T> min(const detail::tvec2<T>& x, const detail::tvec2<T>& y, const detail::tvec2<T>& z){return minGTX(x, y, z);} //!< \brief Return the minimum component-wise values of 3 imputs (From GLM_GTX_extented_min_max extension)
		template <typename T> inline detail::tvec3<T> min(const detail::tvec3<T>& x, const detail::tvec3<T>& y, const detail::tvec3<T>& z){return minGTX(x, y, z);} //!< \brief Return the minimum component-wise values of 3 imputs (From GLM_GTX_extented_min_max extension)
		template <typename T> inline detail::tvec4<T> min(const detail::tvec4<T>& x, const detail::tvec4<T>& y, const detail::tvec4<T>& z){return minGTX(x, y, z);} //!< \brief Return the minimum component-wise values of 3 imputs (From GLM_GTX_extented_min_max extension)

		template <typename T> inline detail::tvec2<T> min(const detail::tvec2<T>& x, const detail::tvec2<T>& y, const detail::tvec2<T>& z, const detail::tvec2<T>& w){return minGTX(x, y, z, w);} //!< \brief Return the minimum component-wise values of 4 imputs (From GLM_GTX_extented_min_max extension)
		template <typename T> inline detail::tvec3<T> min(const detail::tvec3<T>& x, const detail::tvec3<T>& y, const detail::tvec3<T>& z, const detail::tvec3<T>& w){return minGTX(x, y, z, w);} //!< \brief Return the minimum component-wise values of 4 imputs (From GLM_GTX_extented_min_max extension)
		template <typename T> inline detail::tvec4<T> min(const detail::tvec4<T>& x, const detail::tvec4<T>& y, const detail::tvec4<T>& z, const detail::tvec4<T>& w){return minGTX(x, y, z, w);} //!< \brief Return the minimum component-wise values of 4 imputs (From GLM_GTX_extented_min_max extension)

		template <typename T> inline T max(const T x, const T y, const T z){return maxGTX(x, y, z);} //!< \brief Return the maximum component-wise values of 3 imputs (From GLM_GTX_extented_min_max extension)
		template <typename T> inline T max(const T x, const T y, const T z, const T w){return maxGTX(x, y, z, w);} //!< \brief Return the maximum component-wise values of 4 imputs (From GLM_GTX_extented_min_max extension)

		template <typename T> inline detail::tvec2<T> max(const detail::tvec2<T>& x, const T y, const T z){return maxGTX(x, y, z);} //!< \brief Return the maximum component-wise values of 3 imputs (From GLM_GTX_extented_min_max extension)
		template <typename T> inline detail::tvec3<T> max(const detail::tvec3<T>& x, const T y, const T z){return maxGTX(x, y, z);} //!< \brief Return the maximum component-wise values of 3 imputs (From GLM_GTX_extented_min_max extension)
		template <typename T> inline detail::tvec4<T> max(const detail::tvec4<T>& x, const T y, const T z){return maxGTX(x, y, z);} //!< \brief Return the maximum component-wise values of 3 imputs (From GLM_GTX_extented_min_max extension)

		template <typename T> inline detail::tvec2<T> max(const detail::tvec2<T>& x, const T y, const T z, const T w){return maxGTX(x, y, z, w);} //!< \brief Return the maximum component-wise values of 4 imputs (From GLM_GTX_extented_min_max extension)
		template <typename T> inline detail::tvec3<T> max(const detail::tvec3<T>& x, const T y, const T z, const T w){return maxGTX(x, y, z, w);} //!< \brief Return the maximum component-wise values of 4 imputs (From GLM_GTX_extented_min_max extension)
		template <typename T> inline detail::tvec4<T> max(const detail::tvec4<T>& x, const T y, const T z, const T w){return maxGTX(x, y, z, w);} //!< \brief Return the maximum component-wise values of 4 imputs (From GLM_GTX_extented_min_max extension)

		template <typename T> inline detail::tvec2<T> max(const detail::tvec2<T>& x, const detail::tvec2<T>& y, const detail::tvec2<T>& z){return maxGTX(x, y, z);} //!< \brief Return the maximum component-wise values of 3 imputs (From GLM_GTX_extented_min_max extension)
		template <typename T> inline detail::tvec3<T> max(const detail::tvec3<T>& x, const detail::tvec3<T>& y, const detail::tvec3<T>& z){return maxGTX(x, y, z);} //!< \brief Return the maximum component-wise values of 3 imputs (From GLM_GTX_extented_min_max extension)
		template <typename T> inline detail::tvec4<T> max(const detail::tvec4<T>& x, const detail::tvec4<T>& y, const detail::tvec4<T>& z){return maxGTX(x, y, z);} //!< \brief Return the maximum component-wise values of 3 imputs (From GLM_GTX_extented_min_max extension)

		template <typename T> inline detail::tvec2<T> max(const detail::tvec2<T>& x, const detail::tvec2<T>& y, const detail::tvec2<T>& z, const detail::tvec2<T>& w){return maxGTX(x, y, z, w);} //!< \brief Return the maximum component-wise values of 4 imputs (From GLM_GTX_extented_min_max extension)
		template <typename T> inline detail::tvec3<T> max(const detail::tvec3<T>& x, const detail::tvec3<T>& y, const detail::tvec3<T>& z, const detail::tvec3<T>& w){return maxGTX(x, y, z, w);} //!< \brief Return the maximum component-wise values of 4 imputs (From GLM_GTX_extented_min_max extension)
		template <typename T> inline detail::tvec4<T> max(const detail::tvec4<T>& x, const detail::tvec4<T>& y, const detail::tvec4<T>& z, const detail::tvec4<T>& w){return maxGTX(x, y, z, w);} //!< \brief Return the maximum component-wise values of 4 imputs (From GLM_GTX_extented_min_max extension)

	}//namespace extented_min_max
	}//namespace gtx
}//namespace glm

#define GLM_GTX_extented_min_max namespace gtx::extented_min_max

#include "extented_min_max.inl"

#endif//glm_gtx_extented_min_max
