///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2008 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2006-01-09
// Updated : 2006-11-13
// Licence : This source is under MIT License
// File    : glm/gtx/fast_exponential.h
///////////////////////////////////////////////////////////////////////////////////////////////////
// Dependency:
// - GLM core
// - GLM_GTX_half
// - GLM_GTX_double
///////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef glm_gtx_fast_exponential
#define glm_gtx_fast_exponential

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

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

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

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

    template <typename T> T fastExpGTX(const T x);
    template <typename T> detail::tvec2<T> fastExpGTX(const detail::tvec2<T>& x);
    template <typename T> detail::tvec3<T> fastExpGTX(const detail::tvec3<T>& x);
    template <typename T> detail::tvec4<T> fastExpGTX(const detail::tvec4<T>& x);

    template <typename T> T fastLogGTX(const T x);
    template <typename T> detail::tvec2<T> fastLogGTX(const detail::tvec2<T>& x);
    template <typename T> detail::tvec3<T> fastLogGTX(const detail::tvec3<T>& x);
    template <typename T> detail::tvec4<T> fastLogGTX(const detail::tvec4<T>& x);

    template <typename T> T fastExp2GTX(const T x);
    template <typename T> detail::tvec2<T> fastExp2GTX(const detail::tvec2<T>& x);
    template <typename T> detail::tvec3<T> fastExp2GTX(const detail::tvec3<T>& x);
    template <typename T> detail::tvec4<T> fastExp2GTX(const detail::tvec4<T>& x);

	template <typename T> T fastLog2GTX(const T x);
    template <typename T> detail::tvec2<T> fastLog2GTX(const detail::tvec2<T>& x);
    template <typename T> detail::tvec3<T> fastLog2GTX(const detail::tvec3<T>& x);
    template <typename T> detail::tvec4<T> fastLog2GTX(const detail::tvec4<T>& x);

	template <typename T> T fastLnGTX(const T x);
    template <typename T> detail::tvec2<T> fastLnGTX(const detail::tvec2<T>& x);
    template <typename T> detail::tvec3<T> fastLnGTX(const detail::tvec3<T>& x);
    template <typename T> detail::tvec4<T> fastLnGTX(const detail::tvec4<T>& x);

	namespace gtx
	{
		//! GLM_GTX_fast_exponential extension: Fast but less accurate implementations of exponential based functions.
		namespace fast_exponential
		{
			template <typename T> inline T fastPow(const T& x, const T& y){return fastPowGTX(x, y);} //!< \brief Faster than the common pow function but less accurate (From GLM_GTX_fast_exponential extension)
			template <typename T, typename U> inline T fastPow(const T& x, const U& y){return fastPowGTX(x, y);} //!< \brief Faster than the common pow function but less accurate (From GLM_GTX_fast_exponential extension)
			template <typename T> inline T fastExp(const T& x){return fastExpGTX(x);} //!< \brief Faster than the common exp function but less accurate (From GLM_GTX_fast_exponential extension)
			template <typename T> inline T fastLog(const T& x){return fastLogGTX(x);} //!< \brief Faster than the common log function but less accurate (From GLM_GTX_fast_exponential extension)
			template <typename T> inline T fastExp2(const T& x){return fastExp2GTX(x);} //!< \brief Faster than the common exp2 function but less accurate (From GLM_GTX_fast_exponential extension)
			template <typename T> inline T fastLog2(const T& x){return fastLog2GTX(x);} //!< \brief Faster than the common log2 function but less accurate (From GLM_GTX_fast_exponential extension)
			template <typename T> inline T fastLn(const T& x){return fastLnGTX(x);} //!< \brief Faster than the common ln function but less accurate (From GLM_GTX_fast_exponential extension)
		}
	}
}

#define GLM_GTX_fast_exponential namespace gtx::fast_exponential

#include "fast_exponential.inl"

#endif//glm_gtx_fast_exponential
