Updated GTX_multiple

master
Christophe Riccio ago%!(EXTRA string=11 years)
parent 4b4b6f6cac
commit 23d2735e03
  1. 24
      glm/gtx/multiple.hpp
  2. 133
      glm/gtx/multiple.inl

@ -62,6 +62,18 @@ namespace glm
genType Source, genType Source,
genType Multiple); 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 <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_DECL vecType<T, P> higherMultiple(
vecType<T, P> const & Source,
vecType<T, P> const & Multiple);
/// Lower multiple number of Source. /// Lower multiple number of Source.
/// ///
/// @tparam genType Floating-point or integer scalar or vector types. /// @tparam genType Floating-point or integer scalar or vector types.
@ -74,6 +86,18 @@ namespace glm
genType Source, genType Source,
genType Multiple); 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 <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_DECL vecType<T, P> lowerMultiple(
vecType<T, P> const & Source,
vecType<T, P> const & Multiple);
/// @} /// @}
}//namespace glm }//namespace glm

@ -13,66 +13,111 @@
namespace glm{ namespace glm{
namespace detail namespace detail
{ {
template <bool Signed> template <bool is_float, bool is_signed>
struct higherMultiple struct compute_higherMultiple{};
template <>
struct compute_higherMultiple<true, true>
{ {
template <typename genType> template <typename genType>
GLM_FUNC_QUALIFIER genType operator()(genType Source, genType Multiple) GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)
{ {
if(Source > genType(0)) if(Source > genType(0))
{ {
genType Tmp = Source - genType(1); genType Tmp = Source - genType(1);
return Tmp + (Multiple - (Tmp % Multiple)); return Tmp + (Multiple - std::fmod(Tmp, Multiple));
} }
else else
return Source + (-Source % Multiple); return Source + std::fmod(-Source, Multiple);
} }
}; };
template <> template <>
struct higherMultiple<false> struct compute_higherMultiple<false, false>
{ {
template <typename genType> template <typename genType>
GLM_FUNC_QUALIFIER genType operator()(genType Source, genType Multiple) GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)
{ {
genType Tmp = Source - genType(1); genType Tmp = Source - genType(1);
return Tmp + (Multiple - (Tmp % Multiple)); return Tmp + (Multiple - (Tmp % Multiple));
} }
}; };
}//namespace detail
////////////////////// template <>
// higherMultiple struct compute_higherMultiple<false, true>
{
template <typename genType>
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 <typename genType> template <bool is_float, bool is_signed>
GLM_FUNC_QUALIFIER genType higherMultiple(genType Source, genType Multiple) struct compute_lowerMultiple{};
template <>
struct compute_lowerMultiple<true, true>
{ {
detail::higherMultiple<std::numeric_limits<genType>::is_signed> Compute; template <typename genType>
return Compute(Source, Multiple); 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 <> template <>
GLM_FUNC_QUALIFIER float higherMultiple(float Source, float Multiple) struct compute_lowerMultiple<false, false>
{ {
if(Source > float(0)) template <typename genType>
GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)
{ {
float Tmp = Source - float(1); if(Source >= genType(0))
return Tmp + (Multiple - std::fmod(Tmp, Multiple)); return Source - Source % Multiple;
else
{
genType Tmp = Source + genType(1);
return Tmp - Tmp % Multiple - Multiple;
}
} }
else };
return Source + std::fmod(-Source, Multiple);
}
template <> template <>
GLM_FUNC_QUALIFIER double higherMultiple(double Source, double Multiple) struct compute_lowerMultiple<false, true>
{ {
if(Source > double(0)) template <typename genType>
GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)
{ {
double Tmp = Source - double(1); if(Source >= genType(0))
return Tmp + (Multiple - std::fmod(Tmp, Multiple)); 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 <typename genType>
GLM_FUNC_QUALIFIER genType higherMultiple(genType Source, genType Multiple)
{
return detail::compute_higherMultiple<std::numeric_limits<genType>::is_iec559, std::numeric_limits<genType>::is_signed>::call(Source, Multiple);
} }
template <typename T, precision P, template <typename, precision> class vecType> template <typename T, precision P, template <typename, precision> class vecType>
@ -87,37 +132,7 @@ namespace detail
template <typename genType> template <typename genType>
GLM_FUNC_QUALIFIER genType lowerMultiple(genType Source, genType Multiple) GLM_FUNC_QUALIFIER genType lowerMultiple(genType Source, genType Multiple)
{ {
if(Source >= genType(0)) return detail::compute_lowerMultiple<std::numeric_limits<genType>::is_iec559, std::numeric_limits<genType>::is_signed>::call(Source, Multiple);
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;
}
} }
template <typename T, precision P, template <typename, precision> class vecType> template <typename T, precision P, template <typename, precision> class vecType>

Loading…
Cancel
Save