diff --git a/glm/gtx/multiple.hpp b/glm/gtx/multiple.hpp index 068a71c9..93e83f3e 100644 --- a/glm/gtx/multiple.hpp +++ b/glm/gtx/multiple.hpp @@ -62,6 +62,18 @@ namespace glm genType Source, genType Multiple); + /// Higher multiple number of Source. + /// + /// @tparam genType Floating-point or integer scalar or vector types. + /// @param Source + /// @param Multiple Must be a null or positive value + /// + /// @see gtx_multiple + template class vecType> + GLM_FUNC_DECL vecType higherMultiple( + vecType const & Source, + vecType const & Multiple); + /// Lower multiple number of Source. /// /// @tparam genType Floating-point or integer scalar or vector types. @@ -74,6 +86,18 @@ namespace glm genType Source, genType Multiple); + /// Lower multiple number of Source. + /// + /// @tparam genType Floating-point or integer scalar or vector types. + /// @param Source + /// @param Multiple Must be a null or positive value + /// + /// @see gtx_multiple + template class vecType> + GLM_FUNC_DECL vecType lowerMultiple( + vecType const & Source, + vecType const & Multiple); + /// @} }//namespace glm diff --git a/glm/gtx/multiple.inl b/glm/gtx/multiple.inl index 043934e9..949271f8 100644 --- a/glm/gtx/multiple.inl +++ b/glm/gtx/multiple.inl @@ -13,66 +13,111 @@ namespace glm{ namespace detail { - template - struct higherMultiple + template + struct compute_higherMultiple{}; + + template <> + struct compute_higherMultiple { template - GLM_FUNC_QUALIFIER genType operator()(genType Source, genType Multiple) + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) { if(Source > genType(0)) { genType Tmp = Source - genType(1); - return Tmp + (Multiple - (Tmp % Multiple)); + return Tmp + (Multiple - std::fmod(Tmp, Multiple)); } else - return Source + (-Source % Multiple); + return Source + std::fmod(-Source, Multiple); } }; template <> - struct higherMultiple + struct compute_higherMultiple { template - GLM_FUNC_QUALIFIER genType operator()(genType Source, genType Multiple) + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) { genType Tmp = Source - genType(1); return Tmp + (Multiple - (Tmp % Multiple)); } }; -}//namespace detail - ////////////////////// - // higherMultiple + template <> + struct compute_higherMultiple + { + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + if(Source > genType(0)) + { + genType Tmp = Source - genType(1); + return Tmp + (Multiple - (Tmp % Multiple)); + } + else + return Source + (-Source % Multiple); + } + }; - template - GLM_FUNC_QUALIFIER genType higherMultiple(genType Source, genType Multiple) + template + struct compute_lowerMultiple{}; + + template <> + struct compute_lowerMultiple { - detail::higherMultiple::is_signed> Compute; - return Compute(Source, Multiple); - } + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + if(Source >= genType(0)) + return Source - std::fmod(Source, Multiple); + else + { + genType Tmp = Source + genType(1); + return Tmp - std::fmod(Tmp, Multiple) - Multiple; + } + } + }; template <> - GLM_FUNC_QUALIFIER float higherMultiple(float Source, float Multiple) + struct compute_lowerMultiple { - if(Source > float(0)) + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) { - float Tmp = Source - float(1); - return Tmp + (Multiple - std::fmod(Tmp, Multiple)); + if(Source >= genType(0)) + return Source - Source % Multiple; + else + { + genType Tmp = Source + genType(1); + return Tmp - Tmp % Multiple - Multiple; + } } - else - return Source + std::fmod(-Source, Multiple); - } + }; template <> - GLM_FUNC_QUALIFIER double higherMultiple(double Source, double Multiple) + struct compute_lowerMultiple { - if(Source > double(0)) + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) { - double Tmp = Source - double(1); - return Tmp + (Multiple - std::fmod(Tmp, Multiple)); + if(Source >= genType(0)) + return Source - Source % Multiple; + else + { + genType Tmp = Source + genType(1); + return Tmp - Tmp % Multiple - Multiple; + } } - else - return Source + std::fmod(-Source, Multiple); + }; +}//namespace detail + + ////////////////////// + // higherMultiple + + template + GLM_FUNC_QUALIFIER genType higherMultiple(genType Source, genType Multiple) + { + return detail::compute_higherMultiple::is_iec559, std::numeric_limits::is_signed>::call(Source, Multiple); } template class vecType> @@ -87,37 +132,7 @@ namespace detail template GLM_FUNC_QUALIFIER genType lowerMultiple(genType Source, genType Multiple) { - if(Source >= genType(0)) - return Source - Source % Multiple; - else - { - genType Tmp = Source + genType(1); - return Tmp - Tmp % Multiple - Multiple; - } - } - - template <> - GLM_FUNC_QUALIFIER float lowerMultiple(float Source, float Multiple) - { - if(Source >= float(0)) - return Source - std::fmod(Source, Multiple); - else - { - float Tmp = Source + float(1); - return Tmp - std::fmod(Tmp, Multiple) - Multiple; - } - } - - template <> - GLM_FUNC_QUALIFIER double lowerMultiple(double Source, double Multiple) - { - if (Source >= double(0)) - return Source - std::fmod(Source, Multiple); - else - { - double Tmp = Source + double(1); - return Tmp - std::fmod(Tmp, Multiple) - Multiple; - } + return detail::compute_lowerMultiple::is_iec559, std::numeric_limits::is_signed>::call(Source, Multiple); } template class vecType>