|
|
@@ -13,66 +13,111 @@
|
|
|
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 <>
|
|
|
+ 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>
|
|
|
- GLM_FUNC_QUALIFIER genType higherMultiple(genType Source, genType Multiple)
|
|
|
+ template <bool is_float, bool is_signed>
|
|
|
+ struct compute_lowerMultiple{};
|
|
|
+
|
|
|
+ template <>
|
|
|
+ struct compute_lowerMultiple<true, true>
|
|
|
{
|
|
|
- detail::higherMultiple<std::numeric_limits<genType>::is_signed> Compute;
|
|
|
- return Compute(Source, Multiple);
|
|
|
- }
|
|
|
+ template <typename genType>
|
|
|
+ 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<false, false>
|
|
|
{
|
|
|
- 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))
|
|
|
+ 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<false, 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 - 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>
|
|
|
@@ -87,37 +132,7 @@ namespace detail
|
|
|
template <typename genType>
|
|
|
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<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>
|