Updated GTX_multiple

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

@ -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 <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.
///
/// @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 <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

@ -13,79 +13,76 @@
namespace glm{
namespace detail
{
template <bool Signed>
struct higherMultiple
template <bool is_float, bool is_signed>
struct compute_higherMultiple{};
template <>
struct compute_higherMultiple<true, true>
{
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))
{
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<false>
struct compute_higherMultiple<false, false>
{
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);
return Tmp + (Multiple - (Tmp % Multiple));
}
};
}//namespace detail
//////////////////////
// higherMultiple
template <typename genType>
GLM_FUNC_QUALIFIER genType higherMultiple(genType Source, genType Multiple)
{
detail::higherMultiple<std::numeric_limits<genType>::is_signed> Compute;
return Compute(Source, Multiple);
}
template <>
GLM_FUNC_QUALIFIER float higherMultiple(float Source, float Multiple)
struct compute_higherMultiple<false, true>
{
if(Source > float(0))
template <typename genType>
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))
{
genType Tmp = Source - genType(1);
return Tmp + (Multiple - (Tmp % Multiple));
}
else
return Source + std::fmod(-Source, Multiple);
return Source + (-Source % Multiple);
}
};
template <bool is_float, bool is_signed>
struct compute_lowerMultiple{};
template <>
GLM_FUNC_QUALIFIER double higherMultiple(double Source, double Multiple)
struct compute_lowerMultiple<true, true>
{
if(Source > double(0))
template <typename genType>
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 - std::fmod(Source, Multiple);
else
return Source + std::fmod(-Source, Multiple);
}
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> higherMultiple(vecType<T, P> const & Source, vecType<T, P> const & Multiple)
{
return detail::functor2<T, T, P, vecType>::call(higherMultiple, Source, Multiple);
genType Tmp = Source + genType(1);
return Tmp - std::fmod(Tmp, Multiple) - Multiple;
}
}
};
//////////////////////
// lowerMultiple
template <>
struct compute_lowerMultiple<false, false>
{
template <typename genType>
GLM_FUNC_QUALIFIER genType lowerMultiple(genType Source, genType Multiple)
GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)
{
if(Source >= genType(0))
return Source - Source % Multiple;
@ -95,29 +92,47 @@ namespace detail
return Tmp - Tmp % Multiple - Multiple;
}
}
};
template <>
GLM_FUNC_QUALIFIER float lowerMultiple(float Source, float Multiple)
struct compute_lowerMultiple<false, true>
{
if(Source >= float(0))
return Source - std::fmod(Source, Multiple);
template <typename genType>
GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)
{
if(Source >= genType(0))
return Source - Source % Multiple;
else
{
float Tmp = Source + float(1);
return Tmp - std::fmod(Tmp, Multiple) - Multiple;
genType Tmp = Source + genType(1);
return Tmp - Tmp % Multiple - Multiple;
}
}
};
}//namespace detail
template <>
GLM_FUNC_QUALIFIER double lowerMultiple(double Source, double Multiple)
//////////////////////
// higherMultiple
template <typename genType>
GLM_FUNC_QUALIFIER genType higherMultiple(genType Source, genType Multiple)
{
if (Source >= double(0))
return Source - std::fmod(Source, Multiple);
else
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>
GLM_FUNC_QUALIFIER vecType<T, P> higherMultiple(vecType<T, P> const & Source, vecType<T, P> const & Multiple)
{
double Tmp = Source + double(1);
return Tmp - std::fmod(Tmp, Multiple) - Multiple;
return detail::functor2<T, T, P, vecType>::call(higherMultiple, Source, Multiple);
}
//////////////////////
// lowerMultiple
template <typename genType>
GLM_FUNC_QUALIFIER genType lowerMultiple(genType Source, genType Multiple)
{
return detail::compute_lowerMultiple<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>

Loading…
Cancel
Save