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

Loading…
Cancel
Save