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

#ifndef __glm_gtx_optimum_pow__
#define __glm_gtx_optimum_pow__

// Dependency:
#include "../../glm.h"

namespace glm
{
    template <typename genType> genType pow2GTX(const genType& x);
    template <typename genType> genType pow3GTX(const genType& x);
    template <typename genType> genType pow4GTX(const genType& x);
    
    inline bool powOfTwoGTX(int num);
    inline detail::tvec2<bool> powOfTwoGTX(const detail::tvec2<int>& x);
    inline detail::tvec3<bool> powOfTwoGTX(const detail::tvec3<int>& x);
    inline detail::tvec4<bool> powOfTwoGTX(const detail::tvec4<int>& x);

    namespace gtx
    {
		//! GLM_GTX_optimum_pow extension: Integer exponenciation of power functions.
        namespace optimum_pow
        {
            template <typename genType> inline genType pow2(const genType& x){return pow2GTX(x);}   //!< \brief Returns x raised to the power of 2. (From GLM_GTX_optimum_pow extension)
            template <typename genType> inline genType pow3(const genType& x){return pow3GTX(x);}   //!< \brief Returns x raised to the power of 3. (From GLM_GTX_optimum_pow extension)
            template <typename genType> inline genType pow4(const genType& x){return pow4GTX(x);}   //!< \brief Returns x raised to the power of 4. (From GLM_GTX_optimum_pow extension)
            
            inline bool powOfTwo(int num){return powOfTwoGTX(num);}                                 //!< \brief Checks if the parameter is a power of 2 number. (From GLM_GTX_optimum_pow extension)
            inline detail::tvec2<bool> powOfTwo(const detail::tvec2<int>& x){return powOfTwoGTX(x);}	//!< \brief Checks to determine if the parameter component are power of 2 numbers. (From GLM_GTX_optimum_pow extension)
            inline detail::tvec3<bool> powOfTwo(const detail::tvec3<int>& x){return powOfTwoGTX(x);}	//!< \brief Checks to determine if the parameter component are power of 2 numbers. (From GLM_GTX_optimum_pow extension)
            inline detail::tvec4<bool> powOfTwo(const detail::tvec4<int>& x){return powOfTwoGTX(x);}	//!< \brief Checks to determine if the parameter component are power of 2 numbers. (From GLM_GTX_optimum_pow extension)
        }
    }
}

#define GLM_GTX_optimum_pow namespace gtx::optimum_pow

#include "optimum_pow.inl"

#endif//__glm_gtx_optimum_pow__
